php - 由于身份验证凭据无效,Paypal 交易 API 显示身份验证失败
问题描述
我正在使用贝宝沙箱 api 来获取使用贝宝沙箱进行的交易,但我收到身份验证失败错误。
来自 api 的消息响应是:
{"name":"AUTHENTICATION_FAILURE","message":"由于身份验证凭据无效或缺少授权标头,身份验证失败。","links":[{"href":"https://developer.paypal.com/ docs/api/overview/#error","rel":"information_link"}]}
我的代码是
$PAYPAL_SANDBOX = true;
$_GET['PayerID'] = ''; // this value i received after successful payment
$api_endpoint = ($PAYPAL_SANDBOX === true)?'https://api-m.sandbox.paypal.com':'https://api-m.paypal.com';
$accessToken = '';
$clientId = 'AazdUEXrw50silSvZHi0ZqbJRW1Ya5jcFqFm0Yc8YrDXdiMku329JaFtrLI259QIyQ6ICkczDriBdEij';
$secret = 'EGod-yeKmVOGcf2B0B4cVP5_iADQddza-GlakzYw_oYfC4bO9zZrK1gP2OWjIAljHRTfAJtLm5KDRKMy';
$PAYPAL_DB_TABLE = 'paypal_donor';
/*get access token*/
$headers = [];
$headers['Accept'] = 'application/json';
$headers['Accept-Language'] = 'en_US';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_endpoint.'/v1/oauth2/token/');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, $clientId.':'.$secret);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,"grant_type=client_credentials");
$token_output = curl_exec($ch);
curl_close ($ch);
$token_output = json_decode($token_output, true);
if (count($token_output) > 0) {
/*get token*/
$dbtoken = $db->rawQuery("SELECT access_token,nonce,expires_in FROM " . $PAYPAL_DB_TABLE);
if ($dbtoken) {
foreach ($dbtoken as $key => $value) {
$nonceTime = strtotime(str_replace('T', ' ', substr($value->nonce, 0, 19)));
$timeDif = time() - $nonceTime;
if ($value->expires_in < $timeDif) {
$dbtoken = $db->rawQuery("DELETE * FROM " . $PAYPAL_DB_TABLE);
tokenInDb($token_output);
$accessToken = $token_output['access_token'];
}else{
$accessToken = $value->access_token;
}
}
}else{
tokenInDb($token_output);
$accessToken = $token_output['access_token'];
}
/*get token*/
/*get transaction*/
if ($accessToken) {
$headers = [];
$headers['Content-Type'] = 'application/json';
$headers['Authorization'] = 'Bearer '.$accessToken;
$data = '{
"transaction_details" : [
{
"payer_info" : {
"account_id" : "'.$_GET['PayerID'].'"
}
}
]
}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_endpoint.'/v1/reporting/transactions/'.'?transaction_currency=USD');
//curl_setopt($ch, CURLOPT_VERBOSE, 1);
//curl_setopt($ch, CURLOPT_HEADER, 0);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$trans = curl_exec($ch);
curl_close($ch);
print_r($trans);
die;
}
/*get transaction*/
}
/*get access token*/
function tokenInDb($token_output){
//print_r($token_output);
//die;
global $db;
global $PAYPAL_DB_TABLE;
/*insert token in db*/
$db->insert($PAYPAL_DB_TABLE, [
'access_token' => $token_output['access_token'],
'token_type' => $token_output['token_type'],
'app_id' => $token_output['app_id'],
'expires_in' => $token_output['expires_in'],
'nonce' => $token_output['nonce']
]);
/*insert token in db*/
}
我在哪里做错了,我找不到,但我得到了访问令牌,请帮忙
解决方案
推荐阅读
- json - .Net5 后端接收空 JSON
- php - PHP MySQL在不同的表中找到相同的值
- flutter - 杀死所有火焰的游戏进程
- python - OpenCV imshow 修复感兴趣区域
- android - 在 Ktor JWT 身份验证中,我们如何通过刷新令牌或任何其他方法安全地重新生成令牌?
- html - 在jquery中如何乘法
- java - 从遗留代码对 Spring 的事务调用
- opencv - 如何在opencv中使用Skimage轮廓?
- javascript - Javascript:无法读取未定义的属性“classList” // 但是当我在控制台中尝试时,它可以工作
- azure - az devops 在 docker 容器内登录