PayPal API 返回 RESOURCE_NOT_FOUND / INVALID_RESOURCE_ID 但交易列在 Sandbox Business 帐户中

Posted

技术标签:

【中文标题】PayPal API 返回 RESOURCE_NOT_FOUND / INVALID_RESOURCE_ID 但交易列在 Sandbox Business 帐户中【英文标题】:PayPal API returns RESOURCE_NOT_FOUND / INVALID_RESOURCE_ID but the transaction is listed in the Sandbox Business account 【发布时间】:2020-07-17 10:47:31 【问题描述】:

我也有类似的问题。

设置

PayPal 沙盒环境 两个测试帐户(个人和企业帐户)。在测试期间,个人帐户购买产品。交易转到企业帐户。 我创建了 REST API 应用程序,它连接到上面的 Sandbox Business 帐户。 我使用企业帐户的凭据登录到:https://www.sandbox.paypal.com/ 以生成 PayPal 按钮。按钮的 html 代码已添加到我的网站。

步骤

我打开网站并点击 PayPal 按钮。 我使用个人帐户的凭据登录 PayPal Sandbox。 我完成了付款流程。 我登录到企业帐户,我看到交易(订单)列在那里。我可以看到交易 ID。

问题

在对 API 的所有请求中,我使用客户端 ID 和已为测试目的创建的 REST API 应用程序的机密。

之后我打开 Postman 并向 PayPal API 发送以下请求以生成访问令牌(文档:https://developer.paypal.com/docs/api/get-an-access-token-curl/)。

curl -v https://api.sandbox.paypal.com/v1/oauth2/token \
   -H "Accept: application/json" \
   -H "Accept-Language: en_US" \
   -u "client_id:secret" \
   -d "grant_type=client_credentials"

到目前为止,一切都很好。然后我向 PayPal APIv1 发送 API 请求以获取有关订单的更多详细信息。我使用的交易 ID 根据我阅读的内容与订单 ID 相同。

curl -v -X GET https://api.sandbox.paypal.com/v1/checkout/orders/TRANSACTION_ID \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token"

我明白了:


    "http_code": 404,
    "body": 
        "name": "INVALID_RESOURCE_ID",
        "message": "INVALID_RESOURCE_ID",
        "information_link": "https://developer.paypal.com/docs/api/orders/v1/#error-INVALID_RESOURCE_ID",
        "debug_id": "c02871817abba"
    

我试过 APIv2:

curl -v -X GET https://api.sandbox.paypal.com/v1/checkout/orders/ORDER_ID \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token"

我明白了:


    "http_code": 404,
    "body": 
        "name": "RESOURCE_NOT_FOUND",
        "details": [
            
                "issue": "INVALID_RESOURCE_ID",
                "description": "Specified resource ID does not exist. Please check the resource ID and try again."
            
        ],
        "message": "The specified resource does not exist.",
        "debug_id": "c2c24f91a44fd",
        "links": [
            
                "href": "https://developer.paypal.com/docs/api/orders/v2/#error-INVALID_RESOURCE_ID",
                "rel": "information_link",
                "method": "GET"
            
        ]
    

混乱

业务帐户中明确列出了该交易,但 API 显示没有此类交易。

建议/解决方案?


解决方案

通过 PayPal 按钮发起的付款(使用企业帐户生成)的默认行为是 Sale,而不是 Order。有关两者之间差异的更多详细信息,请阅读此处 - https://www.paypal.com/us/smarthelp/article/what-are-the-differences-between-the-express-checkout-payment-actions-ts1501

解决方案是向另一个 PayPal API 方法发出请求(检查:https://developer.paypal.com/docs/paypal-plus/germany/how-to/show-sale/?fbclid=IwAR30yROZMjKT2LlRgSRuVBMGrjdmN1MGbuJ50rUiUBWwW11FSpGdxk5JNpY#show-sale-details)

这是返回正确数据的请求。

curl -v -X GET https://api.sandbox.paypal.com/v1/payments/sale/TRANSACTION_ID \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token"

【问题讨论】:

【参考方案1】:

v2/orders 对象仅用于付款批准,它们不是交易。出于调试目的,他们的 ID 应该只保留大约一个月,因为它们不用于会计目的并且在 PayPal.com 中不可引用

另一方面,PayPal 交易由 v2/payments 对象表示,当您捕获 v2/订单时返回。您可以通过适当的 GET 调用再次获取捕获的详细信息:https://developer.paypal.com/docs/api/payments/v2/#captures_get

【讨论】:

【参考方案2】:

解决方案

通过 PayPal 按钮(使用企业帐户生成)发起的付款的默认行为是销售,而不是订单。有关两者之间差异的更多详细信息,请阅读here。

解决方法是向另一个PayPal API方法发出请求检查this

这是返回正确数据的请求。

curl -v -X GET https://api.sandbox.paypal.com/v1/payments/sale/TRANSACTION_ID \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token"

【讨论】:

以上是关于PayPal API 返回 RESOURCE_NOT_FOUND / INVALID_RESOURCE_ID 但交易列在 Sandbox Business 帐户中的主要内容,如果未能解决你的问题,请参考以下文章

Paypal Refund Sale REST API 返回:远程服务器返回错误:(404)未找到

Paypal API,Curl 不返回任何输出

PayPal Sandbox API 端点返回 503“内部服务错误”错误

PayPal REST API 未返回 payment_info

PayPal Rest API for Payments 在沙箱中返回 NULL

PayPal Rest API 创建付款不返回销售 ID