【问题标题】:Smart Payment Buttons passing custom variable for IPN为 IPN 传递自定义变量的智能支付按钮
【发布时间】:2020-03-08 05:49:11
【问题描述】:

我的网站上有两个智能按钮用于每月订阅(运行良好)。我成功收到了 IPN 响应,其中包含准备好添加到数据库的付款信息。但我需要通过 IPN 响应获取我的应用程序的用户 ID。

如何使用我的智能支付按钮传递自定义变量,以便将其传递给 IPN(如果可能,用于购买交易和退款/取消交易?)

这是我的智能按钮代码:

<div id="paypal_button"></div>

<script src="https://www.paypal.com/sdk/js?client-id=[ID]...></script>

<script>
paypal.Buttons({
    style:{
        color:"blue",
        shape:"rect",
        label:"paypal",
        tagline:false
    },
    createSubscription: function(data, actions) {
        return actions.subscription.create({'plan_id': 'P-02S33....'});
    },
    onApprove: function(data, actions) {
        alert('You have successfully created subscription ENTERPRISE' + data.subscriptionID);
    }
}).render('#paypal_button');
</script>

【问题讨论】:

    标签: paypal-sandbox paypal-ipn paypal-subscriptions


    【解决方案1】:
    createOrder: function(data, actions) {
       return actions.order.create({
          purchase_units: [{
             invoice_id: 'your_value_1',
             custom_id: 'your_value_2',
             amount: {
                value: '10'
             }
          }]
       });
    },
    

    IPN 将包含这些 POST 变量:

    $_POST['invoice']; // your_value_1
    $_POST['custom']   // your_value_2
    

    更多信息:https://developer.paypal.com/docs/api-basics/notifications/ipn/IPNandPDTVariables/#ipn-transaction-types

    【讨论】:

    • 这个_id 剪裁实在是太荒谬了,但它的工作原理与您描述的完全一样!谢谢!
    • 这在创建订阅时不起作用
    • 如果可行,它应该是公认的解决方案。
    【解决方案2】:

    从 2020 年 6 月起,您可以使用这样的 paypal 订阅按钮传递custom_id

      createSubscription: function(data, actions) {
        return actions.subscription.create({
          plan_id: "P-1234567897897AAA",
          custom_id: "1344", // for example your internal userid
        });
      },
    

    现在使用 webhook(如果您使用 PHP):

    // get data from Paypal Webhook POST
    $data = json_decode(file_get_contents("php://input"));
    
    error_log('custom_id: '.$data->resource->custom_id);
    
    // also helpful for debugging
    error_log(print_r($data, true));
    

    如上所述包含custom_id 的事件:

    • BILLING.SUBSCRIPTION.创建
    • BILLING.SUBSCRIPTION.ACTIVATED

    对于活动:

    • PAYMENT.SALE.COMPLETED

    你需要使用:

    error_log('custom_id: '.$data->resource->custom);
    

    最后没有_id


    注意:我编写了一个综合教程,希望能帮助开发人员完成工作。 Tutorial: How to integrate Paypal Subscription API with PHP and Javascript (2021) - Complete Guide

    【讨论】:

      【解决方案3】:

      当他完成付款时,我在 Paypal IPN 和客户重定向响应之间混合使用。

      客户端完成支付后,会调用JS函数onApprove。如果需要,我使用此函数从我的应用程序中收集 data.subscriptionID 以及用户 ID 和其他信息。然后我将这些信息发送到我的数据库中( 贝宝订阅 ID 和我的用户 ID 用于我的案例)。

      然后我等待 paypal IPN 调用我的一条路线。 IPN 会发送很多关于付款的信息。其中之一是我之前存储的 SubscriptionID。所以我只需要使用匹配的 SubscriptionID 更新我的数据库条目。

      为了提高安全性,如果 Subscription_ID 与我的数据库中的任何条目都不匹配(如果 IPN 在客户端之前触发,或者如果客户端关闭),我的客户端调用和 IPN 调用都将创建一个新的数据库条目在拨打客户电话之前我的网站页面)。

      【讨论】:

      • 这不是一个好主意,因为如果在对 Paypal 的调用和在 Paypal 回发后对您自己的服务器的调用之间的任何点连接丢失,那么您将永远不会关联订阅id 与用户 ID。最好是直接在payload中传递自定义id的解决方案。
      【解决方案4】:

      您可以将自定义数据传递给订阅按钮,如下所示:

         <script>
          paypal.Buttons({
              style: {
                  shape: 'rect',
                  color: 'black',
                  layout: 'horizontal',
                  label: 'subscribe'
              },
              createSubscription: function(data, actions) {
                  let plan = $("#frequency").data("paypal");
                
                  return actions.subscription.create({
                      'custom_id' : JSON.stringify( {'u': app.session.User_ID } ),
                      'plan_id': plan
                  });
              },
              onApprove: function(data, actions) {
                  console.log(data);
                  console.log(actions);
                  alert(data.subscriptionID);
              }
          }).render('#paypal-button-container');
      </script>
      

      我使用 JSON.stringify 是因为它不需要复杂的对象。然后在你的钩子监听器上,你会得到以下 json:

      {
      "id": "...",
      "event_version": "1.0",
      "create_time": "2021-01-31T15:17:07.379Z",
      "resource_type": "subscription",
      "resource_version": "2.0",
      "event_type": "BILLING.SUBSCRIPTION.ACTIVATED",
      "summary": "Subscription activated",
      "resource": {
          "quantity": "1",
          "subscriber": {
              "name": {
                  "given_name": "John",
                  "surname": "Doe"
              },
              "email_address": "...",
              "payer_id": "...",
              "shipping_address": {
                  "address": {
                      "address_line_1": "1 Main St",
                      "admin_area_2": "San Jose",
                      "admin_area_1": "CA",
                      "postal_code": "95131",
                      "country_code": "US"
                  }
              }
          },
          "create_time": "2021-01-31T15:16:32Z",
          "custom_id": "{\"u\":1,\"v\":\"yolo\"}",
      

      ...

      【讨论】:

      • 这个不行,2021年IPN没有发送custom_id字段
      • 它有效,请参阅我的回答如何从 Paypal 读取 POST。
      猜你喜欢
      • 2020-03-04
      • 2020-03-23
      • 2019-10-31
      • 2012-01-22
      • 2014-02-21
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多