我正在制作一个将firetore作为数据库的react-redux应用程序。 现在,我想使用Firebase云功能来处理条带支付。
这是设置:
以下是从反应方收到令牌和金额后的结帐操作方法。
export const checkoutFunc = (token, amount) => {
return (dispatch, getState, { getFirebase, getFirestore }) => {
const uid = getState().firebase.auth.uid;
const ref = database.ref();
ref.child(`payments/${uid}`).push({
token: token,
amount: amount
});
};
};
此功能创建付款并保存令牌和金额。
现在,这是云功能,在创建上述付款之后,该功能应“向”付款“收费”。
exports.stripeCharge = functions.database
.ref("/payments/{userId}/{paymentId}")
.onWrite((change, context) => {
const payment = change.after.val();
const userId = context.params.userId;
const paymentId = context.params.paymentId;
if (!payment || payment.charge) return;
return admin
.database()
.ref(`/teachers/${userId}`)
.once("value")
.then(snap => {
return snap.val();
})
.then(customer => {
const amount = payment.amount;
const idempotency_key = paymentId;
const source = payment.token.id;
const currency = "usd";
const charge = { amount, currency, source };
return stripe.charges.create(charge, { idempotency_key });
})
.then(charge => {
admin
.database()
.ref(`/payments/${userId}/${paymentId}/charge`)
.set(charge)
.then(charge => {
return true;
});
});
});
付款创建成功,令牌和金额保存在付款表中。但是,云功能并未完成对令牌收费的工作。
预期结果:
https://i.ibb.co/Fq9Zfhq/image.png
实际结果:
答案 0 :(得分:1)
尽管@Doug Stevenson提供的答案很有帮助,但这不是主要问题。因此,我在这里为其他苦苦挣扎的人编写解决方案。 我在应用程序中使用了错误的公钥和私钥对,只要正确使用,它就可以工作。
答案 1 :(得分:0)
您不会使用Admin SDK返回从set()返回的承诺。该功能将在异步工作完成之前终止并清除。
.then(charge => {
return admin // add a return here
.database()
.ref(`/payments/${userId}/${paymentId}/charge`)
.set(charge)
.then(charge => {
return true;
});
});
仅供参考,如果您使用async / await语法而不是then / catch,则这些承诺链更易于可视化。