如何在 PayPal 智能按钮交易中发送自定义数据字段

Posted

技术标签:

【中文标题】如何在 PayPal 智能按钮交易中发送自定义数据字段【英文标题】:How to Send Custom data fields in PayPal Smart Button transaction 【发布时间】: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!');
  

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于如何在 PayPal 智能按钮交易中发送自定义数据字段的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Paypal 表单仅在完成交易后收集一些数据

如何将自定义数据发送到 Paypal 并接收回来

Paypal 智能按钮元数据 - Webhook

通过 PayPal Buy Now 按钮的自定义字段发送一个 json 编码的 var

Omnipay - 如何将“自定义”或“发票”参数传递给 Paypal?

Paypal 不会将沙盒交易数据发送到 IPN