我正在使用PHP和cURL集成PayPal,并设法通过https://api.sandbox.paypal.com/v2/checkout/orders
和https://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头,我已经打印并重复检查了多次,它似乎是正确的。下面是我用来进行调用的代码
// 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 )进行相同的调用,则会产生一个不同的错误,即
{
"error": "invalid_request",
"error_description": "No permissions to set target_client_id"
}
没有这个错误的搜索结果是真正有帮助的,所以我迷失在那里我做错了什么,尽管它似乎与Paypal-Auth-Assertion无关,因为如果我故意提供一个错误的值,它会回落到Subject Authentication failed错误。
发布于 2021-02-22 23:52:50
当我试图为某个合作伙伴账户退还捕获的订单时,也遇到了同样的问题。在我看来,您使用的是示例中转义的字符串json。尝试使用如下所示的json_encode函数:
$header = base64_encode(json_encode(['alg' => 'none']));
$body = base64_encode(json_encode(['payer_id' => $merchantId, 'iss' => $clientId]));
$authHeader = $header . "." . $body . ".";
我用这个$authHeader退还了一个捕获的订单。
问候
https://stackoverflow.com/questions/61143763
复制相似问题