PayPal 快速结帐服务器端,身份验证失败
PayPal express checkout server side, authentication failure
我到处搜索但没有找到问题的答案。
我做不到。我的 PayPal 按钮使用快速结帐服务器端 Rest,但我测试了客户端,它很简单,而且有效。
我正在使用 CodeIgniter,所以这是我的代码。
这是我的视图文件夹中的 javascript 代码。 CREATE_URL
和 EXECUTE_URL
转到控制器。
paypal.Button.render({
env: 'sandbox', // sandbox | production
// Show the buyer a 'Pay Now' button in the checkout flow
commit: true,
// payment() is called when the button is clicked
payment: function() {
// Set up a url on your server to create the payment
var CREATE_URL = '/projects/createurl';
// Make a call to your server to set up the payment
return paypal.request.post(CREATE_URL)
.then(function(res) {
return res.paymentID;
});
},
// onAuthorize() is called when the buyer approves the payment
onAuthorize: function(data, actions) {
// Set up a url on your server to execute the payment
var EXECUTE_URL = '/projects/executeurl';
// Set up the data you need to pass to your server
var data = {
paymentID: data.paymentID,
payerID: data.payerID
};
// Make a call to your server to execute the payment
return paypal.request.post(EXECUTE_URL, data)
.then(function (res) {
window.alert('Payment Complete!');
});
}
}, '#paypal-button-container');
这里是CREATE_URL
控制器
public function createurl() {
$ch = curl_init();
$clientId = "something";
$secret = "something";
curl_setopt($ch, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/oauth2/token");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSLVERSION , 6);
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("Error: No response.");
else
{
$json = json_decode($result, TRUE);
}
curl_close($ch);
$ch2 = curl_init();
$token = $json['access_token'];
$data = '{
"transactions": [{
"amount": {
"currency":"EUR",
"total":"12"
},
"description":"creating a payment"
}],
"payer": {
"payment_method":"paypal"
},
"intent":"sale",
"redirect_urls": {
"cancel_url":"https://mysite.gr/projects/project/10",
"return_url":"https://mysite.gr/projects/project/10"
}
}';
curl_setopt($ch2, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/payments/payment");
curl_setopt($ch2, CURLOPT_VERBOSE, 1);
curl_setopt($ch2, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch2, CURLOPT_HTTPHEADER , "Content-Type: application/json");
curl_setopt($ch2, CURLOPT_HTTPHEADER , "Authorization: Bearer ".$token);
curl_setopt($ch2, CURLOPT_POST, 1);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch2);
$json = json_decode($result, TRUE);
print_r($json);
curl_close($ch2);
}
所以当我点击 PayPal 按钮时 - 它失败了。来自控制台的日志:
ppxo_no_token_passed_to_payment
ppxo_unhandled_error {stack: "Error: No value passed to payment↵ at
https://w…://www.paypalobjects.com/api/checkout.js:3076:13
)", errtype:
"[object Error]"
Uncaught Error: No value passed to payment
而且当我将控制器输入 url 以查看数组时,它会这样说:
Array ( [name] => AUTHENTICATION_FAILURE [message] => Authentication
failed due to invalid authentication credentials or a missing
Authorization header. [links] => Array ( [0] => Array ( [href] =>
https://developer.paypal.com/docs/api/overview/#error
[rel] =>
information_link ) ) )
好的,经过 1 周的努力,我解决了我的问题,我终于找到了解决方案,现在效果很好!
AUTHENTICATION_FAILURE [message] => Authentication failed due to
invalid authentication credentials or a missing Authorization header.
这是因为我发送的是两个单独的 HTTPHEADERS 而不是一个,结果是互相覆盖。所以正确的做法是在 HTTPHEADER 的第三个参数中传递一个数组,如下所示:
curl_setopt($ch2, CURLOPT_HTTPHEADER , array("Content-Type: application/json", "Authorization: Bearer myaccesstokenishere"));
之后我仍然遇到问题:
ppxo_no_token_passed_to_payment
ppxo_unhandled_error {stack: "Error: No value passed to payment↵
Uncaught Error: No value passed to payment
为了解决这个问题,我只是回显结果而不是 json_decode,就像这样:
$result = curl_exec($ch2);
echo $result;
curl_close($ch2);
现在一切正常。
executeurl 控制器很简单,如果有人想让我post告诉我。
我希望我帮助了遇到类似问题的人。
我到处搜索但没有找到问题的答案。
我做不到。我的 PayPal 按钮使用快速结帐服务器端 Rest,但我测试了客户端,它很简单,而且有效。
我正在使用 CodeIgniter,所以这是我的代码。
这是我的视图文件夹中的 javascript 代码。 CREATE_URL
和 EXECUTE_URL
转到控制器。
paypal.Button.render({
env: 'sandbox', // sandbox | production
// Show the buyer a 'Pay Now' button in the checkout flow
commit: true,
// payment() is called when the button is clicked
payment: function() {
// Set up a url on your server to create the payment
var CREATE_URL = '/projects/createurl';
// Make a call to your server to set up the payment
return paypal.request.post(CREATE_URL)
.then(function(res) {
return res.paymentID;
});
},
// onAuthorize() is called when the buyer approves the payment
onAuthorize: function(data, actions) {
// Set up a url on your server to execute the payment
var EXECUTE_URL = '/projects/executeurl';
// Set up the data you need to pass to your server
var data = {
paymentID: data.paymentID,
payerID: data.payerID
};
// Make a call to your server to execute the payment
return paypal.request.post(EXECUTE_URL, data)
.then(function (res) {
window.alert('Payment Complete!');
});
}
}, '#paypal-button-container');
这里是CREATE_URL
控制器
public function createurl() {
$ch = curl_init();
$clientId = "something";
$secret = "something";
curl_setopt($ch, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/oauth2/token");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSLVERSION , 6);
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("Error: No response.");
else
{
$json = json_decode($result, TRUE);
}
curl_close($ch);
$ch2 = curl_init();
$token = $json['access_token'];
$data = '{
"transactions": [{
"amount": {
"currency":"EUR",
"total":"12"
},
"description":"creating a payment"
}],
"payer": {
"payment_method":"paypal"
},
"intent":"sale",
"redirect_urls": {
"cancel_url":"https://mysite.gr/projects/project/10",
"return_url":"https://mysite.gr/projects/project/10"
}
}';
curl_setopt($ch2, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/payments/payment");
curl_setopt($ch2, CURLOPT_VERBOSE, 1);
curl_setopt($ch2, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch2, CURLOPT_HTTPHEADER , "Content-Type: application/json");
curl_setopt($ch2, CURLOPT_HTTPHEADER , "Authorization: Bearer ".$token);
curl_setopt($ch2, CURLOPT_POST, 1);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch2);
$json = json_decode($result, TRUE);
print_r($json);
curl_close($ch2);
}
所以当我点击 PayPal 按钮时 - 它失败了。来自控制台的日志:
ppxo_no_token_passed_to_payment
ppxo_unhandled_error {stack: "Error: No value passed to payment↵ at
https://w…://www.paypalobjects.com/api/checkout.js:3076:13
)", errtype: "[object Error]"Uncaught Error: No value passed to payment
而且当我将控制器输入 url 以查看数组时,它会这样说:
Array ( [name] => AUTHENTICATION_FAILURE [message] => Authentication failed due to invalid authentication credentials or a missing Authorization header. [links] => Array ( [0] => Array ( [href] =>
https://developer.paypal.com/docs/api/overview/#error
[rel] => information_link ) ) )
好的,经过 1 周的努力,我解决了我的问题,我终于找到了解决方案,现在效果很好!
AUTHENTICATION_FAILURE [message] => Authentication failed due to invalid authentication credentials or a missing Authorization header.
这是因为我发送的是两个单独的 HTTPHEADERS 而不是一个,结果是互相覆盖。所以正确的做法是在 HTTPHEADER 的第三个参数中传递一个数组,如下所示:
curl_setopt($ch2, CURLOPT_HTTPHEADER , array("Content-Type: application/json", "Authorization: Bearer myaccesstokenishere"));
之后我仍然遇到问题:
ppxo_no_token_passed_to_payment
ppxo_unhandled_error {stack: "Error: No value passed to payment↵
Uncaught Error: No value passed to payment
为了解决这个问题,我只是回显结果而不是 json_decode,就像这样:
$result = curl_exec($ch2);
echo $result;
curl_close($ch2);
现在一切正常。
executeurl 控制器很简单,如果有人想让我post告诉我。
我希望我帮助了遇到类似问题的人。