首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使用Paypal API退款订单

无法使用Paypal API退款订单
EN

Stack Overflow用户
提问于 2020-04-10 23:44:47
回答 1查看 601关注 0票数 4

我正在使用PHP和cURL集成PayPal,并设法通过https://api.sandbox.paypal.com/v2/checkout/ordershttps://api.sandbox.paypal.com/v2/checkout/orders/<order_id>/capture端点创建订单并捕获支付

我尝试退款的订单已经被成功捕获,查看详细信息显示它们的状态为"COMPLETED“,final_capture字段为true,因此订单已经下达,我可以在商家帐户中看到交易成功结束

现在,我正在尝试使用从capture调用获得的捕获ID来测试退款,但它总是失败,并显示以下响应正文{ "error":"invalid_subject", "error_description":"Subject Authentication failed" }的错误

我追踪到了主题认证失败问题背后的问题是一个错误的Paypal-Auth-Assertion头,我已经打印并重复检查了多次,它似乎是正确的。下面是我用来进行调用的代码

代码语言:javascript
运行
复制
// Codeigniter function to read from $_POST
$capture_id = $this->input->post('paypal_capture_id');

$auth_1 = base64_encode("{\"alg\":\"none\"}");
$auth_2 = base64_encode("{\"payer_id\":<payer_id>,\"iss\":<client_id>}");
$auth_assertion_header = $auth_1 . "." . $auth_2 . ".";


$curlSES=curl_init(); 
curl_setopt($curlSES,CURLOPT_URL,"https://api.sandbox.paypal.com/v2/payments/captures/$capture_id/refund");
curl_setopt($curlSES, CURLOPT_POST, true);
curl_setopt($curlSES, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Authorization: Bearer '. $access_token,
    'PayPal-Auth-Assertion:' . $auth_assertion_header 
));
curl_setopt($curlSES, CURLOPT_POSTFIELDS, '{}'); // empty payload means full refund
curl_setopt($curlSES, CURLOPT_RETURNTRANSFER, true);

$result=curl_exec($curlSES);

其中payer_id和client_id是使用用于沙箱环境的商家id帐户填充的,client_id是由贝宝提供的应用程序的秘密id,$access_token之前是从我在应用程序的其他部分使用的函数生成的,它工作得很好。

此外,如果我尝试使用Postman (以及PayPal API explorer )进行相同的调用,则会产生一个不同的错误,即

代码语言:javascript
运行
复制
{
  "error": "invalid_request",
  "error_description": "No permissions to set target_client_id"
}

没有这个错误的搜索结果是真正有帮助的,所以我迷失在那里我做错了什么,尽管它似乎与Paypal-Auth-Assertion无关,因为如果我故意提供一个错误的值,它会回落到Subject Authentication failed错误。

EN

回答 1

Stack Overflow用户

发布于 2021-02-22 23:52:50

当我试图为某个合作伙伴账户退还捕获的订单时,也遇到了同样的问题。在我看来,您使用的是示例中转义的字符串json。尝试使用如下所示的json_encode函数:

代码语言:javascript
运行
复制
$header = base64_encode(json_encode(['alg' => 'none']));
$body = base64_encode(json_encode(['payer_id' => $merchantId, 'iss' => $clientId]));
$authHeader = $header . "." . $body . ".";

我用这个$authHeader退还了一个捕获的订单。

问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61143763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档