当前位置: 首页 > 知识库问答 >
问题:

PayPalAPI返回RESOURCE_NOT_FOUND/INVALID_RESOURCE_ID但事务列在Sandbox Business帐户中

夏侯臻
2023-03-14

我也有类似的问题。

安装程序

  • 贝宝沙箱环境
  • 两个测试帐户(个人帐户和业务帐户)。在测试期间,个人帐户购买产品。交易进入商业账户
  • 我创建了RESTAPI应用程序,它连接到上面的沙盒业务帐户
  • 我登录到:https://www.sandbox.paypal.com/ 使用企业帐户的凭据生成PayPal按钮。按钮的HTML代码被添加到我的网站中

台阶

  • 我打开网站,点击PayPal按钮。
  • 我用个人帐户的凭据登录PayPal沙盒。
  • 我完成付款过程
  • 我登录到业务帐户,我看到交易(订单)列在那里。我可以看到交易ID。

问题

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

之后,我打开了Postman,并向PayPalAPI发送了以下请求以生成访问令牌(Doc: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"

到目前为止,一切都好。然后,我向PayPalAPIv1发送一个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按钮(使用业务帐户生成)发起的付款的默认行为是销售,而不是订单。有关两者之间差异的更多详细信息,请阅读此处-https://www.paypal.com/us/smarthelp/article/what-are-the-differences-between-the-express-checkout-payment-actions-ts1501

解决方案是向另一个PayPalAPI方法发出请求(检查: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"

共有2个答案

公孙嘉禧
2023-03-14

v2/订单对象仅用于付款审批,不是交易记录。出于调试的目的,它们的ID应该只保留一个月左右,因为它们不用于记帐,并且在PayPal中不可引用。通用域名格式

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

柳修平
2023-03-14

解决方案

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

解决方法是向另一个PayPalAPI方法发出请求

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

curl -v -X GET https://api.sandbox.paypal.com/v1/payments/sale/TRANSACTION_ID \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token"
 类似资料:
  • 我正在尝试使用以下命令从匿名方中存储的公钥中获取帐户信息对象: 但每次我都是空的。当我记录来自vault查询的匿名方对象时,我检查了该对象是否为空,并得到以下信息: 匿名(DL 5 Z 9 Sv 3285 QA NUN K 5 Vm 6 c rW tFK 2 tE 4 QX UFo Eo Yu WH 7 a hm) 我仍然无法理解它为什么返回null。 附注:我试图获取信息的帐户托管在另一个节点上

  • 你能告诉我如何只对某些代码块运行事务吗?我有@Transactional的服务函数,并从它们调用存储库函数,在那里执行查询。但当查询失败时,由于事务必须结束,服务功能也随之失效。那么,当存储库函数失败时,如何返回null值呢?我需要在失败时捕获空值,并继续一些逻辑。我的代码: 我尝试了@davidxxx的答案,得到了这个错误:

  • deployment.yaml: 当从nginx-ingress pod获取日志时,我们注意到状态代码是,这意味着它正在工作。 产出: 但是,客户端返回: https://github.com/kubernetes/ingress-nginx/issues/3746 任何帮助都将不胜感激。

  • 问题内容: 我试图从我的Web SQL数据库中调用一个SELECTS值的函数。我想将SELECTED值返回到父函数内的变量中。但是,无论是否为全局变量,变量始终返回空白。 可以看到selectRow函数内部的console.log记录了数据库查询中的正确值,但是console.log在initDB函数中显示为空白。 我还注意到,空白日志显示在selectRow函数内部的日志之前。我找到了一些论坛,

  • 我试图弄清楚如何从angular 6/typescript应用程序向firebase数据库编写事务。 下面是我使用的一个工作示例作为指导: 我确定的关键部分如下: 1)创建一个数组来保存事务:const transactions=[]; 2)开始事务:返回db.runtransactions(function(transactions){… 3)使用事务:transaction.set(newPh

  • 这里我有一个函数,它应该返回秒数作为变量sec,但是return语句在数据库事务之前运行,所以我一直没有定义。我可以做些什么来确保事务在回电话之前完成。类似于用于。