如何防止 nodeJs 中的多个 paypal 付款?

How do I prevent multiple paypal payments in nodeJs?

我是 node js 的新手,正在尝试将 Paypal 的支付网关集成到我的应用程序中。

付款成功后,用户将被重定向到 http://localhost:3000/success?paymentId=PAYID-M8MU148234F&token=EC-2111Y&PayerID=YX82JX6Q 我们的代码执行订单和 return 付款 object(包含订单详细信息)。

在此页面上,我想向用户显示订单详细信息。

  1. 我想将付款 object 作为 JSON.stringify 存储到我的 Mongoose 数据库中以供将来参考。问题是,如果用户继续重新加载此页面,app.get('/success'..) 中的代码将继续向 mongoose 数据库重复添加相同的列。我不确定如何防止这种情况。

  2. 由于付款实际执行只有当这个URL被用户访问时,用户多次重新加载阻止我使用Paypal API 并给出以下错误:

response: {
    name: 'MAX_NUMBER_OF_PAYMENT_ATTEMPTS_EXCEEDED',
    message: 'You have exceeded the maximum number of 20 payment attempts.',
    information_link: 'https://developer.paypal.com/docs/api/payments/#errors',..........

我现在能想到的唯一解决方案是我的 /success 路由以某种方式执行支付并将数据存储到数据库中,然后将用户重定向到可能带有订单的 /someOtherPage/ 页面详细信息为 headers。我不确定如何进行此重定向并同时传递一些上下文(付款 object)。

您使用的是已弃用的 v1/payments API and/or PayPal-Node-SDK。您应该将集成更改为当前的 v2/checkout/orders 和 Checkout-NodeJS-SDK.

在您的服务器上创建两条路线,一条用于 'Create Order',一条用于 'Capture Order'、documented here。这些路由应该 return 只有 JSON 数据(没有 HTML 或文本)。后者应该(成功)在执行 return(特别是 purchase_units[0].payments.captures[0].id、PayPal 交易 ID)

之前将付款详细信息存储在您的数据库中

将这两条路线与以下批准流程配对:https://developer.paypal.com/demo/checkout/#/pattern/server


以上主要解决了这个问题,并且是推荐的解决方案,因为它不依赖于重定向并提供了改进的用户体验,通过在后台加载您的网站来增加买家的信心。但为了更直接地解决这里提出的问题:在执行或捕获 API 调用时,将 PayPal-Request-Id HTTP header 设置为将在重试期间持续存在的内容,而这些重试不会导致new actions/transactions——例如,只需将此 header 设置为正在处理的 PAYID 或 OrderId。这将提供幂等行为(参见 API idempotency