【发布时间】:2020-07-28 14:01:40
【问题描述】:
然而,相对较新的 Javascript,我正在尝试使用 Stripe 和我的方式来解决用户提交另一种付款方式,然后用该方法支付发票。如果付款再次失败 - 它应该一起删除订阅。我将 Firebase 实时数据库与 GCF 和 Node.js 8 结合使用。
这是我目前所拥有的
exports.onSecondPaymentAttempt = functions.database.ref("users/{userId}/something/somethingHistory/{subDbId}/newPayment").onCreate((snapshot, context)=>{
var s = snapshot.val();
var fields = s.split(",");
const cardToken = fields[0];
const cus_id = fields[1];
const conn_id = fields[2];
const subDbId = context.params.subDbId;
const userId = context.params.userId;
return stripe.customers.createSource(
cus_id,
{source: cardToken},{
stripeAccount: `${conn_id}`,
},
(err, card)=> {
console.log(err);
if(err){
return console.log("error attaching card "+ err)
}else{
const invoiceNo = admin.database().ref(`users/${userId}/something/somethingHistory/${subDbId}`)
return invoiceNo.once('value').then(snapshot=>{
const invoiceNumber = snapshot.child("invoiceId").val();
const subId = snapshot.child("subscriptionId").val();
return stripe.invoices.pay(
invoiceNumber,
{
expand: ['payment_intent','charge','subscription'],
},{
stripeAccount: `${conn_id}`,
},
(err, invoice)=>{
if(err){
return console.log("error paying invoice "+ err)
}else{
if(invoice.payment_intent.status==="succeeded"){
//DO SOME CODE
return console.log("New Payment succeeded for "+invoiceNumber)
}else{
//DO SOME OTHER CODE
//CANCEL
return stripe.subscriptions.del(
subId,{
stripeAccount: `${conn_id}`,
},
(err, confirmation)=> {
if(err){
return console.log("Subscription error")
}else{
return console.log("Subscription cancelled")
}
});
}
}
});
})
}
});
对我来说,它看起来是一种令人难以置信的低效/丑陋的实现效果的方式,总体而言,尽管该函数在 1862 毫秒后完成执行,但总体而言用户等待响应大约 15 秒 - 我仍然收到最多 5 到 10 个响应几秒钟后。
要达到注册新支付源、支付订阅费用然后处理支付结果的相同预期效果,最有效的方法是什么?
【问题讨论】:
标签: javascript node.js firebase google-cloud-functions stripe-payments