这是危险的TLDR -所以我的问题是:在成功的支付-条纹发送一个“成功”的有效负载到我的成功网钩。通过有效载荷,我无法看到任何我可以用来找出哪一笔付款是成功的。我应该把一些东西从我的条纹会话到我的等待付款吗?
更详细的情况:
为了遵守PSD2,我不得不重新调整我们的条纹支付。我们支持几个不同的支付选择,这影响了我的进程。
以前,用条纹,我们会得到一个象征性的-给它客户端.付款-订单保存到DB..。工作完成了。
现在,水流反转了..。
我有一个“条纹”按钮-客户点击它。向服务器发送一个帖子。在服务器上,我抓取客户购物车,并创建一个付款状态为挂起的订单。
然后创建一个条带会话-并将条带会话ID返回给客户端(代码被删减)
//creates order and returns Order ID
const orderid = await createOrder(cart);
const stripeSession = await stripe.checkout.sessions.create({
customer_email: request.payload.billingEmail,
payment_method_types: ["card"],
line_items: [
{
name: "###",
description: "###" + orderid,
amount: cart.total.total,
currency: cart.total.currency,
quantity: 1
}
],
success_url: "###" + orderid,
cancel_url: "###/checkout"
});
return {
stripeSessionID: stripeSession.id
};在我的客户端上,我有这样一种方法,可以将帖子发送到服务器,并自动重定向到外部条签出页面:
stripeCheckout: function () {
...
axios.post('/pay/get-stripe-session', data)
.then(function (response) {
var checkoutSessionID = response.data.stripeSessionID
stripe.redirectToCheckout({
sessionId: checkoutSessionID
}) ...在成功的支付,条纹发送一个“成功”有效负载到我的成功网钩。我检查条形码-然后收到消息.这一切都有效..。但是,我在有效负载中看不到任何数据,可以用来将付款与订单相匹配(以便更新订单支付状态)。
当我创建我的条纹会话时,有什么可以使用的吗?
**编辑**
client_reference_id.作为惟一键传递到create方法中。然而,条纹成功的web钩子不会在其有效负载中返回这个键-所以这不能用来协调一个成功的付款与一个订单。而且描述会出现在条纹仪表板上,这样就可以很容易地找到付款(以退款或其他方式)。我们不使用条纹‘客户’。我们存储订单,客户在我们的系统中(stripe不是一个客户管理系统)。如果客户在结帐时登录,我们将其链接到他们的订单。客人的订单和任何人都没有联系。
但是,在新的api中,您必须创建一个stripeSession,每个会话都会在条形仪表板中创建一个客户。我们能阻止这一切吗?
而且,没有办法像使用旧的收费api那样向整个会话/收费添加描述--因此,在Stripes支付仪表板中,我们以无法使用的垃圾来处理每个支付描述.
有人知道怎么解决这个问题吗?我希望stripe不会为了遵守PDS2而牺牲他们出色的开发经验
发布于 2019-09-06 10:59:57
解决了:
诀窍是在条带会话上设置元数据:
const stripeSession = await stripe.checkout.sessions.create({
customer_email: billingEmail,
client_reference_id: orderid,
payment_method_types: ["card"],
line_items: [
{
name: "My charge",
description: "Lorem ipsum",
amount: total,
currency: currency,
quantity: 1
}
],
payment_intent_data: {
description: `orderID: ${orderid}`,
metadata: {
orderid : orderid
}
},
success_url: "https://example.com/thankyou/",
cancel_url: "https://example.com/checkout"
});元数据在charge.success事件(web钩子)中返回。使用此元数据,我能够在数据库中找到顺序并更新它。在本例中,我从transaction.id事件中获取charge.success、卡片类型和最后4个卡位,并将支付状态更新为已支付。
如果您不需要这些信息,您可以简单地设置Web钩子以接收包含checkout.session.complete的client_reference_id事件(我认为这是确认事务的条带首选事件)。
因为我们没有在Stripe中使用Customers帐户,所以我也从stripe中删除了该客户:
// Delete the customer from Stripes Dashboard (we don't use it - its clutter)
const customerID = event.data.object.customer
stripe.customers.del(
customerID,
function(err, confirmation) {
// asynchronously called
}
);基本上就是这样。使用元-它似乎被发送到每一个事件。
发布于 2019-09-05 15:36:06
创建CheckoutSession时,可以传递给它一个id。该值稍后将出现在对象上,供您在您自己的系统中引用一个顺序。
https://stackoverflow.com/questions/57808146
复制相似问题