【问题标题】:Paypal REST API: How to retrieve payment ID after user has approved the payment.Paypal REST API:如何在用户批准付款后检索付款 ID。
【发布时间】:2013-09-03 20:03:14
【问题描述】:

按照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 请求。

问题

在 URL 中从 Paypal 提供的仅有两条信息是 tokenPayerID。如何找到对应的payment_id

可能的解决方案

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

【问题讨论】:

    标签: paypal


    【解决方案1】:

    我认为贝宝文档对此并不清楚。但是您可以做一些简单的事情来解决通过返回 url 中的参数传递 de PaymentID 的问题。

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

    当 Paypal 重定向到您的站点时,它将返回 paymentID 以及其他参数。


    葡萄牙语:

    Não acho que isso esteja claro na documentação do Paypal。 A solução que eu usei foi simples, eu passo o PaymentID como parâmetro na minha URL de retorno que informo para o Paypal。 Assim, quando o Paypal redirecionar para meu site de volta ele matem o parâmetro com o PaymentID que eu tinha passado。

    【讨论】:

    • 我认为这是最好的方法,不使用支付ID,而是使用随机令牌来连接贝宝异步调用。这样您就可以毫无问题地分离会话用户。使用 python 金字塔我正在创建发送成功 url 为 localhost:6543/payment_ok/… 的付款。
    • 是的安东尼奥,你是对的!事实是您在发送请求之前没有 paymentID。然后,发送一个随机令牌,您可以识别用户的会话。
    • 这行不通。原因是在返回 URL 已经发送到 PayPal 之前,付款 ID 是未知的。当前推荐的最佳实践是将支付 ID 存储在用户的会话中(只要确保会话在用户返回或 PayPal 的支付记录被清除之前不会过期)。如果 PayPal 除了付款人 ID 和交易令牌之外还包括付款 ID,那将是最好的。我不确定他们为什么决定省略它。同样令人沮丧的是,他们没有在文档中提及。
    • 是的,您在发送请求之前没有 paymentID
    【解决方案2】:

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

    【讨论】:

    • 还没有找到比解析和制作类似将 EC-TOKEN 与 PAY-TOKEN 链接的数组存储更好的解决方案
    【解决方案3】:

    在第一个 API 请求返回成功响应后,可以使用以下方法在 PHP 中获取 Payment Id:

    $payment->getId();
    

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

    为了找出答案,我必须在文件 sample\payments\CreatePayment.php 中查看下载的 SDK 文件,其中包含以下示例代码,展示了该方法的使用:

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

    【讨论】:

      【解决方案4】:

      我发现这个链接非常有用,如果有人想查看它:https://github.com/paypal/PayPal-NET-SDK/issues/79

      【讨论】:

      【解决方案5】:
      1. paymentid

      创建payment后,返回json,可以得到paymentid。 像这样:“id”:“PAY-01K00482KX842131HKORKVKY”

      1. payerid:

      您可以在用户批准付款后使用 API:GET /v1/payments/payment/{paymentId} 获取付款人 id,您会在返回的 json 中找到 payerid,如下所示:

      {
          "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 中相同的号码(付款后执行).. 你在这里显示的只是后面的部分......
      猜你喜欢
      • 2013-08-29
      • 2021-10-11
      • 2013-12-26
      • 2017-07-13
      • 2017-11-17
      • 2017-05-13
      • 2016-05-20
      • 2016-12-24
      • 2016-03-07
      相关资源
      最近更新 更多