【问题标题】:Adding a custom field in Paypal checkout在 Paypal 结帐中添加自定义字段
【发布时间】:2020-09-09 08:17:57
【问题描述】:

我们正在为我们的网络应用使用 Paypal 结账。我们有设置付款的客户端库。在后端,我们试图通过 webhook 捕获处理后的细节。我们在沙盒帐户上对此进行了测试。除了自定义字段外,webhook 正在按预期发送所有详细信息。我们需要自定义字段才能将付款与特定服务相关联。

在我们的网络应用中,我们有以下内容:

  paypalConfig = {
    env: 'sandbox',
    style: {
          size: 'responsive',
          color: 'white',
          shape: 'rect',
          label: 'pay',
          layout: 'horizontal',
          tagline: 'false'
    },
    client: {
      sandbox: 'SANDBOX_ID',
    },
    commit: false,
    payment: (data, actions) => {
      console.log("data is", data, actions);
      return actions.order.create({
        payment: {
          transactions: [
            { amount: { total: this.finalAmount * 100, currency: 'USD' }, job_id: this.jobId }
          ]
        }
      });
    },
    onApprove: (data, actions) => {
          return actions.order.capture().then((details) => {
            // This function shows a transaction success message to your buyer.
            // alert('Transaction completed by ' + details.payer.name.given_name);
            this.openModel('modal1');
      }).catch(err => {console.log("Error in authorize in paypal", err); this.openModel('modal2');})
    }
  }

如您所见,支付处理程序正在为交易对象添加一个 job_id 属性。在后端,我们正在监听以下事件:

结帐订单完成,付款捕获完成,付款销售完成

我们只需要监听一个事件(如收到付款),它会告诉我们交易何时完成。我不确定,所以我添加了所有似乎相关的事件,因为没有任何名为 Payment Received 的事件。

可以像我们在这里尝试的那样完成吗?我们没有在 webhook 中获取自定义 job_id 字段。

【问题讨论】:

    标签: paypal paypal-sandbox


    【解决方案1】:

    首先你似乎在使用旧的 PayPal checkout.js,切换到最新的 sdk.js

    其次,您正在使用仅客户端集成,切换到正确的客户端-服务器模式。这里是前端:https://developer.paypal.com/demo/checkout/#/pattern/server

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

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


    一旦以上所有工作都为您工作并创建了成功的交易,还有一件事需要考虑:传播失败。也就是说,如果买方的资金来源未能捕捉到,那么在一条不愉快的道路的情况下会发生什么,例如他们的卡被拒绝了? how to send that error back to the UI 有一个指南,因此他们可以添加或选择不同的卡。无论如何,这只是需要担心的最后一个细节。

    【讨论】:

    • 感谢您的回答。我们肯定会更改 SDK。有趣的一点是:如果这是一个同步调用,这意味着 Paypal API 响应将在成功或失败的情况下发送到客户端。这意味着我可以在后端再添加一条路由,在收到 API 响应后,我可以发送 job_id 和事务 ID 以进行进一步跟踪。
    • 您的服务器路由设置交易和捕获交易已经可以根据需要来回传递这些细节。你不需要任何额外的东西。
    • 我首先道歉:“再一个”具有误导性。我的意思是,如果不是 2 个服务器端点,而是通过同步 API 请求在客户端处理付款,我们可以在客户端等待响应并通过单个路由将其传递给服务器。这可以消除后端服务器的一条路由,并将支付处理逻辑保留在客户端。
    • 我不知道你在说什么,但我的建议仍然是你有两条路线,如developer.paypal.com/demo/checkout/#/pattern/server
    • 为什么要从客户那里发送完整的响应?这是 100% 糟糕的设计,要避免,你正在为自己制造各种糟糕的问题。请做明智的事情并创建两条到您的服务器的路由,一条用于设置事务,一条用于捕获事务。您的服务器直接从 PayPal 收到完整的响应。
    【解决方案2】:

    只需创建一个贝宝表单,然后添加自定义作为值之一。这是一个例子。另外,这里有一个很棒的教程来指导你完成它https://youtu.be/HIwRzATH6iU

    <form action="https://sandbox.paypal.com/cgi-bin/webscr" method="post">
        <input type="hidden" name="cmd" value="_xclick">
        <input type="hidden" name="amount" value="50.00">
        <input type="hidden" name="currency_code" value="USD">
        <input type="hidden" name="custom" value="{MemberID}">
        <input type="hidden" name="business" value="youremail@business.example.com">
        <input type="hidden" name="item_name" value="Whatever Item">
        <input type="hidden" name="item_number" value="600">
        <input type="hidden" name="no_shipping" value="2">
        <input type="hidden" name="return" value="https://www.yourwebsite.com/success/">
        <input type="hidden" name="cancel_return" value="https://www.yourwebsite.com/failure">
        <input type="hidden" name="notify_url" value="https://www.yourwebsite.com/ipn">
        <input type="submit" value="Pay Now" name="submit" title="PayPal - The safer, easier way to pay online!" class="btn btn-primary">
    </form>
    

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2019-04-01
      • 2014-06-20
      • 2022-01-20
      相关资源
      最近更新 更多