我一直在研究Stripe,并想学习如何通过以下方式获取临时密钥:
后端:
//Stripe API requirement for payment
exports.stripeEphemeralKey = functions.https.onCall((data, context) => {
const uid = context.auth.uid;
//Get values
admin.database().ref().child("users").child(uid)
.on("value", (snapshot) =>{
//Get user data
let user = snapshot.val()
//Log data
console.log("Create ephemeral key for:")
console.log(user)
//Create ephemeral key
stripe.ephemeralKeys.create(
{customer: user.customerid },
{stripe_version: '2018-11-08'}
)
.then((key) => {
console.log(key)
console.log("Succesful path. Ephemeral created.")
return "Testing"
})
.catch((err) => {
console.log("Unsuccesful path. Ephemeral not created.")
console.log(err)
return {
valid: false,
data: "Error creating Stripe key"
}
})
})
})
客户端:
functions.httpsCallable("stripeEphemeralKey").call(["text": "Testing"]) { (result, error) in
print(result?.data)
}
我已经通过用一个简单的“ Testing”字符串替换stripeEphemeralKey的主体来测试了此代码,并且返回的效果很好。但是,使用上面的代码,我只需返回Optional()。
为了进行测试,我添加了许多控制台日志。 Firebase日志显示执行路径到达“成功路径。创建临时文件”。日志,此外,我实际上可以看到我从Stripe回来的临时密钥。
那么,使用onCall Firebase函数在iOS的Swift中获取临时密钥的正确正确方法是什么?
后端做了应有的工作,但我似乎无法获得答案。
谢谢。
答案 0 :(得分:2)
后端实际上并未执行应做的工作。您在这里至少做错了两件事。
首先,您的可调用函数需要返回一个承诺,该承诺将解析为您要发送给客户端的值。现在,您的函数回调根本不返回任何东西,这意味着客户端将不会收到任何东西。您在promise处理程序中有返回值,但是您需要一个顶级return语句。
第二,您正在使用on()从实时数据库中读取数据,该数据库将附加一个侦听器,该侦听器将持续存在直到被删除。几乎可以肯定,这绝不是您在Cloud Function中要做的。而是使用一次()获取要读取的数据的单个快照,然后对其进行操作。
答案 1 :(得分:0)
供我自己参考,以及可能会对此有所帮助的人:
//Stripe API requirement for payment
exports.stripeEphemeralKey = functions.https.onCall((data, context) => {
const uid = context.auth.uid;
return admin.database().ref().child("users").child(uid)
.once("value", (snapshot) =>{
console.log(snapshot.val() )
})
.then( (snap) => {
const customer = snap.val()
//Log data
console.log("Create ephemeral key for:")
console.log(customer)
//Create ephemeral key
return stripe.ephemeralKeys.create(
{customer: customer.customerid },
{stripe_version: '2018-11-08'}
)
.then((key) => {
console.log(key)
console.log("Succesful path. Ephemeral created.")
return {
valid: true,
data: key
}
})
.catch((err) => {
console.log("Unsuccesful path. Ephemeral not created.")
console.log(err)
return {
valid: false,
data: "Error creating Stripe key"
}
})
})
.catch( err => {
console.log("Unsuccesful path. Ephemeral not created.")
console.log(err)
return {
valid: false,
data: "Error gettting customerid"
}
})
})
关键似乎在于将初始数据库请求与.then()链接起来,并且在我们使用返回promise的函数时,将返回的内容不间断地进行链接。特别是,将我的工作代码放在原始admin.database()。ref()。once()函数上的回调中对我不起作用。
我是这种编程的新手,所以知道这一点的人也许会更好。