智能付款按钮传递IPN的自定义变量

时间:2019-11-12 13:42:05

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

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

如何使用智能付款按钮传递自定义变量,以便将其传递到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>

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

从 2020 年 6 月起,您可以像这样使用贝宝订阅按钮传递 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.CREATED
  • BILLING.SUBSCRIPTION.ACTIVATED

对于事件:

  • 付款、销售、完成

您需要使用:

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

最后没有 _id


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

答案 2 :(得分:0)

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

客户完成付款后,它将调用JS函数onApprove。如果需要,我使用此函数从用户的应用程序中收集带有用户ID和其他信息的data.subscriptionID。然后,我将这些信息发送到数据库中(  贝宝SubscriptionID和我的用户ID(针对我的案例)。

然后,我等待贝宝IPN呼叫我的一条路线。 IPN将发送很多有关付款的信息。其中之一是我之前存储的SubscriptionID。因此,我只需要使用匹配的SubscriptionID更新数据库条目即可。

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

答案 3 :(得分:0)

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

   <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\"}",

...