PayPal REST API:如何在用户批准付款后检索付款ID。

13
根据https://developer.paypal.com/webapps/developer/docs/integration/web/accept-paypal-payment/上的指南,我已成功创建了一笔支付并重定向用户以批准它。 所创建的付款如下所示,并将其保存在用户会话中以供进一步参考。
{
  "id": "PAY-6RV70583SB702805EKEYSZ6Y",
  "create_time": "2013-03-01T22:34:35Z",
  "update_time": "2013-03-01T22:34:36Z",
  "state": "created",
  "intent": "sale",
  "payer": {
    "payment_method": "paypal"
  },
  "transactions": [
    {
      "amount": {
        "total": "7.47",
        "currency": "USD",
        "details": {
          "subtotal": "7.47"
        }
      },
      "description": "This is the payment transaction description."
    }
  ],
  "links": [
    {
      "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-6RV70583SB702805EKEYSZ6Y",
      "rel": "self",
      "method": "GET"
    },
    {
      "href": "https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=EC-60U79048BN7719609",
      "rel": "approval_url",
      "method": "REDIRECT"
    },
    {
      "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-6RV70583SB702805EKEYSZ6Y/execute",
      "rel": "execute",
      "method": "POST"
    }
  ]
}

当用户批准付款后,PayPal将重定向用户到return_url。例如,http://<return_url>?token=EC-60U79048BN7719609&PayerID=7E7MGXCWTTKK2

为了执行付款,必须向https://api.sandbox.paypal.com/v1/payments/payment/{payment_id}/execute/发出POST请求。

问题

Paypal在URL中提供的唯一两个信息是tokenPayerID。我如何找到相应的payment_id

可能的解决方案

tokenapproval_url的一部分,解析URL并存储token-> payment关系可以解决该问题。但我正在寻找不需要解析的更好的解决方案。

6个回答

10

我认为PayPal文档对此并不清楚。但是您可以通过在返回网址中的参数中传递PaymentID来解决问题。

像这样: return_url = 'http://www.yourdomain.com/paypal/success/?paymentID=PAY-1234567'

当PayPal重定向到您的站点时,它将与其他参数一起返回PaymentID。


2
我认为这是最好的方法,不使用paymentID而是使用随机令牌来连接PayPal异步调用。这样,您可以轻松地分离会话用户而不会出现问题。使用Python Pyramid,我正在创建付款,并将成功URL发送为http://localhost:6543/payment_ok/t-b37b41f1-5146-463a-b248-bad523a2fa79。 - Antonio Beamud
3
是的,安东尼奥,你说得对!事实上,在发送请求之前,你没有付款 ID。因此,可以发送一个随机令牌来标识用户的会话。 - Luiz Fernando
7
这样做行不通。原因是支付 ID 直到返回链接已发送到 PayPal 后才被知晓。目前推荐的最佳实践是将支付 ID 存储在用户的会话中(只需确保会话在用户返回或 PayPal 的付款记录被清除之前不会过期)。如果 PayPal 将支付 ID 与付款人 ID 和交易令牌一起包含,那就更好了。我不确定他们为什么决定省略它。同样令人沮丧的是,他们没有在文档中提及它。 - Aquarelle
是的,在发送请求之前,您没有支付ID。 - Winston

5

在将用户重定向到PayPal批准URL之前,您需要记住您的一侧的付款ID(通常附加在用户会话 - 购物车或订单或作为会话cookie中)。一旦用户通过PayerID重定向回您的返回URL,您需要从用户会话中提取PaymentID并执行付款。


1
我还没有找到比解析并创建类似于数组存储的EC-TOKEN和PAY-TOKEN链接更好的解决方案。 - Valerio

1
在第一个API请求成功响应后,可以使用以下方法在PHP中获取付款ID:
$payment->getId();

这个在线代码示例(http://paypal.github.io/PayPal-PHP-SDK/sample/doc/payments/CreatePaymentUsingPayPal.html)展示了如何发送请求,但是它没有包含getId()方法。

为了找到这个方法,我不得不查看下载的SDK文件中的sample\payments\CreatePayment.php文件,其中包含以下示例代码以显示该方法的使用:

ResultPrinter::printResult('Create Payment Using Credit Card', 'Payment', $payment->getId(), $request, $payment);

0

由于v1/payments API 已经被弃用了一段时间,最好的解决方法是对于所有新集成都使用当前的v2/checkout/orders API。订单ID将在URL中返回。

然而,重定向是旧网站的集成方法。最好不要使用任何重定向,并始终保持您的网站处于加载状态。而是使用此批准流程:https://developer.paypal.com/demo/checkout/#/pattern/server


0

这篇文章并不是真正的回答问题。请注意,StackOverflow不像讨论论坛,它是一个问答网站,每个帖子都是一个问题或者对问题的回答。帖子也可以有评论 - 像这样的小句子 - 可以用来批评或请求作者澄清。这应该是一个评论或新问题 - ρяσѕρєя K

-1
  1. 支付ID

在创建支付后,返回json中将包含支付ID,例如:"id":"PAY-01K00482KX842131HKORKVKY"

  1. 付款人ID

用户批准付款后,您可以使用API:GET /v1/payments/payment/{paymentId} 来获取付款人ID,您将在返回的json中找到付款人ID,例如:

{
    "id":"PAY-01K00482KX842131HKORKVKY",
    "create_time":"2014-06-19T09:17:31Z",
    "update_time":"2014-06-19T09:17:31Z",
    "state":"created",
    "intent":"sale",
    "payer":{
            "payment_method":"paypal",
            "payer_info":{
                    "email":"buyer@samsung.com",
                    "first_name":"buyer",
                    "last_name":"samsung",
                    "payer_id":"H2DKRTTYWW8HS",
                    "shipping_address":{                                              "line1":"Lushan Road Num.188",                                              "line2":"JianYe",
                                              "city":"Tucson",
                                                   "state":"AZ",   
                                                   "postal_code":"85715", 
                                                   "country_code":"US",
                                                    "recipientName":"buyer samsung"}}},
    "transactions":[{
                           "amount":{
                                        "total":"12.00",
                                        "currency":"USD",
                                        "details"{"subtotal":"12.00"}},
                 "description":"creating a payment"}],
    "links":[
                   {"href":"xxxxxxx","rel":"self","method":"GET"},
              {"href":"xxxxxxx","rel":"approval_url","method":"REDIRECT"},
              {"href":"xxxxxxx","rel":"execute","method":"POST"}]}

我需要在checkout.php(在付款之前执行)和pay.php(在付款之后执行)中使用相同的数字...你在这里展示的只是后面的部分... - Jaxx0rr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接