【问题标题】:How to Send Custom data fields in PayPal Smart Button transaction如何在 PayPal 智能按钮交易中发送自定义数据字段
【发布时间】:2020-09-08 17:45:46
【问题描述】:

我是 PayPal 集成的新手,但我设法使用客户端 JavaScript SDK 创建按钮并完成交易。我还添加了一个 webhook,用于侦听 PAYMENT.CAPTURE.* 事件并将返回数据记录到我自己数据库中的事务表中。缺点是我无法跟踪交易是针对哪个服务或客户。所以我想知道如何在按钮中添加至少一个自定义字段,以便它在 webhook POST 中返回给我,以便我可以为该特定客户执行一些业务逻辑。

我最初的选择是 POST 数据返回 onApprove:(data, actions)=>{},但如果在此之前发生灾难性事件,例如断电或一般的客户端-服务器连接失败,我将没有恢复选项。

这是我现在的 JS 基本代码:

try{
        paypal.Buttons({

        // Set up the transaction
        createOrder: function(data, actions) {
            return actions.order.create({
                purchase_units: [{
                    amount: {
                        value: charge.amount,
                        currency_code:'USD'
                    }
                }]
            });
        },
        // Finalize the transaction
        onApprove: function(data, actions) {
            return actions.order.capture().then(function(details) {
                console.log(details);
                if(details.status == "COMPLETED"){
                  localStorage.clear();
                  window.location.href = "thank-you";
                }
                //alert('Transaction completed by ' + details.payer.name.given_name + '!');
            });
        }


    }).render('#paypal-button-container');
  }catch(e){
     console.error('PayPal not loaded!');
  }

【问题讨论】:

    标签: javascript paypal paypal-rest-sdk


    【解决方案1】:

    切换到适当的客户端-服务器集成。

    这里是要使用的前端:https://developer.paypal.com/demo/checkout/#/pattern/server

    您的服务器上需要两条对应的路由,“设置事务”和“捕获事务”,记录在此:https://developer.paypal.com/docs/checkout/reference/server-integration/

    (如果您想成为一点科学怪人,您可以尝试保持 createOrder 函数原样(客户端代码)并仅在 onApprove 部分中集成单个服务器端路由。我不'不是真的推荐这个,但你可以尝试一下,也许作为一个迭代开发步骤。最好也从你的服务器“设置事务”。)


    使用上述解决方案,您可以在支付捕获时获得即时、同步的 API 响应。不需要来自 webhook 的额外异步通知,因此这些对您来说基本上是多余的。

    【讨论】:

      【解决方案2】:

      可以切换到客户端-服务器集成(根据@Preston PHK 的回答),但对于某些应用程序(而不是 OP 所要求的),这可能是矫枉过正。

      对于只需要传递一些特定信息的简单购买,您可以尝试利用 purchase_units.invoice_id 字段(假设您不需要该字段用于其他事情)。

      需要注意的是,invoice_id 每次使用时都必须是唯一的。这意味着您不能只使用客户的内部 ID。你需要添加一些额外的东西来确保唯一性。

      您的 createOrder 调用可能如下所示:

      createOrder: function(data, actions) {
          return actions.order.create({
              purchase_units: [{
                  invoice_id: customerId + "-" + randString,
                  amount: {
                      value: charge.amount,
                      currency_code:'USD'
                  }
              }]
          });
      },
      

      由字母数字(大写和小写)组成的 6 个字符的随机字符串提供了超过 560 亿种可能性,对于大多数用途而言,这应该提供足够的唯一性。如果你想更安全,那就让它更长。我不确定invoice_id 的确切限制,但我认为它至少是 40 个字符。

      当您在服务器上处理事务(来自 webhook)时,您只需丢弃多余的字符。

      $custId = substr($invoice_id, 0, -7);
      

      【讨论】:

        猜你喜欢
        • 2021-02-09
        • 2021-04-14
        • 2021-09-07
        • 2017-03-21
        • 1970-01-01
        • 2019-11-21
        • 2011-10-13
        • 2020-09-19
        • 2020-03-11
        相关资源
        最近更新 更多