假设我的用户向我的服务器提交了信用卡令牌以完成购买。然后,将此令牌保存在用户的购物车中,并按顺序收费。
我收到带有费用ID的成功响应,并且突然,我的服务器停止工作,直到我可以将此费用ID存储在用户的购物车中。
费用肯定是确定的,但是我无法将其保存在数据库中以生成用户的订单并提供产品,所以我不知道费用是否成功。
我想做的是减轻重复付款的可能性。我已经研究了整个Stripe的API,但是我找不到关于是否有可能使用用于创建它的卡令牌来检索费用的任何信息。
每次我的服务器重新启动时,都会触发一些过程来验证数据库完整性(顺便说一句,我正在使用MongoDB),并且其中一个过程试图对所有用户购物车收费(使用已经生成的卡令牌)处于“等待付款”状态。如果尚未对卡令牌进行收费,则一切正常,但如果已对卡进行收费,我只是不知道收费是否成功,所以我无法将购物车更新为一致的状态。
我可以使用“ stripe.tokens.retrieve(token).then(...”)来检索卡令牌,但是我只知道它是否被使用过。我必须找到一种方法来发现它是否被使用过。收费,如果成功。
我已尝试将卡令牌存储为我的费用的元数据,因此我能够检索包含该卡令牌作为元数据的费用,但看来这种查询是不可能的。
有人知道如何克服这个问题,或者是否有更好的逻辑来在MongoDB付款实现中授予付款一致性?
答案 0 :(得分:0)
正如@karllekko所说,这是我的问题的答案:
“”您可以在购物车结帐尝试开始时生成并保存一个唯一ID,并在提出计费请求时将其用作幂等键:stripe.com/docs/api#idempotent_requests然后,如果发生崩溃,您可以安全地重试该请求,并且如果您使用相同的密钥,它不会产生重复的费用(您只需返回原始响应)“
按照我的逻辑,我使那些失败的支付尝试再次执行,而无需用户手动重试,因此我将生成的卡令牌客户端存储在用户的购物车和我将向同一令牌收取序列并将其用作幂等密钥,以避免重复付款,因为它们在Stripe数据库中是唯一的。
这是一个避免重复付款的请求,并且始终为我提供相同的令牌令牌(无论成功与否)相同的响应,并且可以为用户的购物车授予一致的状态:
stripe.charges.create(
{
amount: amount,
currency: 'usd',
source: token
},
{
idempotency_key: token
}
).then(
res => resolve(res),// Proceed to a success card/order state and allow products/services to be accessed by user. If an attempt of make duplicate payments using the same card-token happens, you'll receive the same success response and will be able to proceed to the same success card/order state.
err => reject({e: err, m: 'PAYMENT_ERROR', i: 'STRIPE_CHARGE_ERROR'})// An error occurred with the original charge request, so you'll have to rollback to the pre-checkout cart state. Even if you couldn't get the original error response, using an idempotency key will give you the exactly same error response in this step when you retry the charge attempt for this same card-token, so you know you have to rollback.
)
谢谢@karllekko!