【问题标题】:PayPal REST API - State doesn't change after purchasePayPal REST API - 购买后状态不会改变
【发布时间】:2016-05-15 00:05:25
【问题描述】:

所以我注意到在检查付款状态时

GET /v1/payments/payment/<Payment-Id>

即使在 PayPal 用户购买了商品之后,PayPal 响应的 “状态” 也不会从 “created” 改变。直到我执行付款,状态才变为“已批准”

这使得很难区分实际已被客户批准的付款和仍在处理中的付款,因为它们都处于“已创建”状态。 json 响应的唯一区别是,一旦付款实际获得批准,它似乎包含 shipping_address。不过,我不确定这是表示差异的标准方式。

在使用上述对 REST API 的调用时,判断客户端是否实际批准 PayPal 交易的标准方法是什么?

注意:我已经设置并运行了 PHP 回调脚本。我正在开发一个故障安全系统,该系统不断检查数据库条目以确保执行批准的付款(以防某些系统故障)。

我以为我可以使用我从 CLASSIC API 设置的 IPN 回调脚本,但似乎 REST APICLASSIC API 不兼容,因为 IPN 回调将不包含事务 ID 或任何必要的信息有用。

似乎在使用 REST API 时,如果您错过了对网络服务器的重定向调用,那么该事务将永远丢失。

【问题讨论】:

    标签: paypal


    【解决方案1】:

    您不会从查找 API 响应中的 state 字段中得知已批准的付款是正确的,相反,您将在 JSON 正文中查找 payer 对象,该信息将指示为您批准的付款资源。

    这是客户重定向(用户批准)之前/之后相同 PAY-ID 的 JSON 响应

    1. 查询付款/v1/payments/payment/PAY-9J02491382988403BK3BMC6I(在用户批准之前):

      {
         "id": "PAY-9J02491382988403BK3BMC6I",
         "intent": "sale",
         "state": "created",
         "cart": "07U14103P0008801U",
         "transactions": [   {
            "amount":       {
               "total": "80.00",
               "currency": "USD"
            },
            "payee": {"email": "USM@email.com"},
            "invoice_number": "55a460ff696br",
            "item_list":       {
               "items":          [
                              {
                     "name": "Test Ticket 1",
                     "sku": "55a460ff65f13",
                     "price": "10.00",
                     "currency": "USD",
                     "quantity": 1
                  },
                              {
                     "name": "Test Ticket 2",
                     "sku": "55a460ff66c7a",
                     "price": "20.00",
                     "currency": "USD",
                     "quantity": 2
                  },
                              {
                     "name": "Test Ticket 3",
                     "sku": "55a460ff66ce2",
                     "price": "10.00",
                     "currency": "USD",
                     "quantity": 3
                  }
               ],
               "shipping_address":          {
                  "recipient_name": "Test Name",
                  "line1": "Main St 1",
                  "city": "San Jose",
                  "state": "CA",
                  "postal_code": "95131",
                  "country_code": "US"
               }
            },
            "related_resources": [],
            "notify_url": "https://bt-pduan-1.c9.io/ipn.php"
         }],
         "redirect_urls":    {
            "return_url": "http://localhost:80/getpaypal?paymentId=PAY-9J02491382988403BK3BMC6I",
            "cancel_url": "http://localhost:80/cancel"
         },
         "create_time": "2016-02-16T06:28:08Z",
         "update_time": "2016-02-16T06:28:08Z",
         "links":    [
                  {
               "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-9J02491382988403BK3BMC6I",
               "rel": "self",
               "method": "GET"
            },
                  {
               "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-9J02491382988403BK3BMC6I/execute",
               "rel": "execute",
               "method": "POST"
            },
                  {
               "href": "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-07U14103P0008801U",
               "rel": "approval_url",
               "method": "REDIRECT"
            }
         ]
      }
      
    2. 在用户批准后查找付款(我正在删除一些 JSON 内容,例如交易/url 数组以提高可读性):

      {
         "id": "PAY-9J02491382988403BK3BMC6I",
         "intent": "sale",
         "state": "created",
         "cart": "07U14103P0008801U",
         "payer":    {
            "payment_method": "paypal",
            "status": "VERIFIED",
            "payer_info":       {
               "email": "USP@email.com",
               "first_name": "Payer",
               "last_name": "US",
               "payer_id": "8FMFQ2KVYYHTY",
               "shipping_address":          {
                  "recipient_name": "Test Name",
                  "line1": "Main St 1",
                  "city": "San Jose",
                  "state": "CA",
                  "postal_code": "95131",
                  "country_code": "US"
               },
               "phone": "408-743-9795",
               "country_code": "US",
               "billing_address":          {
                  "line1": "1 Main St",
                  "line2": "",
                  "city": "San Jose",
                  "state": "CA",
                  "postal_code": "95131",
                  "country_code": "US"
               }
            }
         },
         "transactions": [],
         "redirect_urls": {},
         "create_time": "2016-02-16T06:28:08Z",
         "update_time": "2016-02-16T06:28:08Z",
         "links": []
      }
      

    通过检查记录的 PAY-ID 在 API 响应中查找 payer 对象,您将能够保存订单并继续执行调用,以防在客户退货重定向中丢失。

    此外,在这种情况下,IPN 或 webhook 都无济于事,因为它们是由事务级事件触发的异步消息,这意味着在执行付款之前不会收到通知。

    【讨论】:

    • 感谢回复,终于能得到一点帮助真是太好了。在我使用这些方法进行的测试中,我注意到如果用户登录到贝宝但仍未付款,则存在“付款人”对象。在这种情况下,它不会有 shipping_address。用户完成结帐并付款后,它将包括 shipping_address。你也是这种情况吗?
    • 如果用户在登录时坐在商店的“评论信息”页面上,我可以验证“付款人”对象是否存在。此时他们尚未完全签出并已取消的选项。所以“付款人”对象的存在是不够的。如果有帮助,我可以向您展示我返回的 JSON。
    • 这是登录时的付款人对象。 "payer": { "payer_info": { "country_code": "US", "first_name": "Joshua", "last_name": "Brittain" , "payer_id": "KZNRYBNVQD2FL", "phone": "4084500470" }, "payment_method": "paypal", "status": "VERIFIED" },
    • 结账后的payer对象包括billing_address和shipping_address。也许这足以表明结帐成功,但我找不到 PayPal 文档表明应该这样做。如果客户在请求时已登录 PayPal,那么您仅使用“付款人”对象的建议将失败。
    • 完全正确的观察结果,虽然您不一定要为付款查找进行“轮询”,但只需在返回页面中作为执行调用的备用。
    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多