PayPal 交易搜索 API:PERMISSION_DENIED,请求的操作没有权限

Posted

技术标签:

【中文标题】PayPal 交易搜索 API:PERMISSION_DENIED,请求的操作没有权限【英文标题】:PayPal Transaction Search API: PERMISSION_DENIED, No Permission for the requested operation 【发布时间】:2020-07-05 13:58:31 【问题描述】:

我正在编写一个服务(在 .NET Core 3.1 和 Refit 中,如果重要的话),它从我的 PayPal 业务帐户中提取给定日期范围内的交易活动,以便在管理仪表板上使用。目前我正在这里学习教程:

https://developer.paypal.com/docs/api/get-an-access-token-postman/

这里:

https://developer.paypal.com/docs/api/transaction-search/v1/

第一部分,我可以得到一个授权密钥就好了(使用curl或postman,curl下面

curl --location --request POST 'https://api.paypal.com/v1/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic <my client id>:<my secret>' \
--header 'Content-Type: application/x-www-form-urlencoded' \

// not sure what this is, postman specific maybe? 
--header 'Cookie: tsrce=devdiscoverynodeweb; ts=vr%3D0cee9361171ac120001362adffec14c3%26vreXpYrS%3D1679730671%26vteXpYrS%3D1585061694%26vt%3D0cee9390171ac120001362adffec14c2' \
--data-urlencode 'grant_type=client_credentials'

这在邮递员和我的自定义服务中都为我提供了一个身份验证令牌。接下来,当我尝试提取交易时(在 Postman 和代码中),我得到一个错误

cUrl:

curl --location --request GET 'https://api.paypal.com/v1/reporting/transactions?start_date=2020-03-01T00:00:00Z&end_date=2020-03-31T23:59:59Z' \
--header 'Authorization: Bearer <my token>' \
// Postman???
--header 'Cookie: tsrce=devdiscoverynodeweb; ts=vr%3D0cee9361171ac120001362adffec14c3%26vreXpYrS%3D1679730671%26vteXpYrS%3D1585061694%26vt%3D0cee9390171ac120001362adffec14c2'

错误:


    "localizedMessage": "No permission for the requested operation. ",
    "suppressed": [],
    "name": "PERMISSION_DENIED",
    "message": "No permission for the requested operation. ",
    "details": [
        
            "field": null,
            "value": null,
            "location": null,
            "issue": "No permission for the requested operation. "
        
    ],
    "information_link": "https://developer.paypal.com/docs/classic/products/permissions/",
    "debug_id": "7e315038e8073"

错误中的信息链接开始谈论第 3 方权限,我不确定这是否适用,因为它是我的企业帐户。谁有想法?我在 PayPal 中检查了我的应用程序的交易历史记录,所以我很迷茫。

提前致谢

【问题讨论】:

您的 oauth2 调用实际返回了什么?我相信您需要范围 https://uri.paypal.com/services/reporting/search/read .. 如果它不存在,请仔细检查您的 REST 应用程序设置是否为 LIVE(不是沙盒) 感谢您的及时回复。这是范围参数 "scope": "https://uri.paypal.com/services/payments/initiatepayment openid https://uri.paypal.com/services/applications/webhooks", ... @PrestonPHX 我能够通过删除和重新创建应用程序来修复它。更改设置对原始版本没有任何作用。您能否将您的回复创建为答案,以便我将其标记为答案? 【参考方案1】:

您需要范围 https://uri.paypal.com/services/reporting/search/read .. 如果 oauth2 响应中没有它,请仔细检查您的 REST 应用的权限。

刷新访问令牌

现有访问令牌缓存 9 小时 - 因此,如果您已请求 API 令牌,然后只是将此权限添加到您的应用,则该权限的新范围可能需要长达 9 小时才能反映在下一个令牌的一代。

为避免等待 9 小时,您可以使用以下命令终止现有的缓存令牌:

curl -X POST https://api.sandbox.paypal.com/v1/oauth2/token/terminate \
     -d "token=REPLACE_WITH_YOUR_TOKEN"

然后,您下一次获取令牌的调用将获得一个新生成的令牌,包括刚刚添加到 REST 应用程序的新范围。

【讨论】:

我还必须删除我的应用程序,然后更改权限才能使其生效 更新了关于缓存的注释和刷新访问令牌的说明 这方面的 PayPal 文档到底在哪里?谷歌搜索“uri.paypal.com/services/reporting/search/read”(包括引号)返回 2 个结果——这个 SO 帖子和另一个随机站点。 顺便说一句,我不必终止旧令牌。一旦我请求了新的范围,我就会获得一个新的令牌。 如果您手动指定请求的范围,那么当然,这也可以。我觉得解释起来并不容易【参考方案2】:

我也遇到了同样的问题,看了很多遍后,我通过以下方式解决了它:

    在支付开发账户的 API 中勾选“交易搜索”

    将 Accept-Language: en_US 和 Content-Type: application/json 添加到标题中,这是主要的难题。这是我的最终代码(在 php 中):

    $clientId = 'AfC.....'; $secret = "EJs......"; $url_base= 'https://api-m.sandbox.paypal.com/';

    $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url_base . "v1/oauth2/token"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json','Accept-Language: en_US')); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERPWD, $clientId.":".$secret); curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");

    $result = curl_exec($ch);

    if(empty($result))die("错误:无响应。"); 别的 //收到的令牌 $json = json_decode($result, true); print_r($json['scope']);

              //place a call
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $url_base . "v1/reporting/transactions?start_date=2020-12-01T00:00:00-0700&end_date=2020-12-30T23:59:59-0700&fields=all");
              curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json',"Authorization: Bearer ".$json['access_token']."", 'Accept-Language: en_US', 'Content-Type: application/json'));
              curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
              //curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($test));
    
              $result = curl_exec($ch);
              if(empty($result))die("Error: No response.");
              else
              
                  $result= json_decode($result, true);
                print_r($result);
              
    

    //收到的令牌结束

    curl_close($ch);

希望这对其他人有帮助,我知道这个问题很老了!

【讨论】:

以上是关于PayPal 交易搜索 API:PERMISSION_DENIED,请求的操作没有权限的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 API 获取我的 PayPal 账户的交易历史

如何在 Paypal API 中查看交易详情

PayPal 如何计算和分配并行支付交易费用?

通过 API 从 Paypal 获取交易信息

在 Zapier 中使用 Webhooks 和 PayPal API 从特定 PayPal 交易中获取交易信息

PayPal API:获取交易的主题/消息