Da ich keine Lösung von niemandem bekommen haben so grub ich in meinen Code Schritt für Schritt und gefunden Lösung.
function paypalFuturePayment($userID,$amount)
{
$amount=number_format($amount,2);
/* paypal App truxx dev client and secret key*/
if($userID && $amount){
$userData = selectById('tbl_users','*',"id='".$userID."'");
$refresh_token = $userData['paypal_refresh_tokens'];
$Metadata_id = $userData['paypal_metadata_id'];
if($refresh_token && $Metadata_id){
if ($_SERVER['SERVER_NAME'] == 'syonserver.com') {
$clientId = "xxxxx";
$secret = "xxx";
$url1="https://api.sandbox.paypal.com/v1/oauth2/token";
$url2="https://api.sandbox.paypal.com/v1/payments/payment";
}else{
$account = 0; // 0 for sandbox ,1 for live
if ($account == 1) {
//client live
$clientId = "xxx";
$secret = xxx";
$url1 = "https://api.paypal.com/v1/oauth2/token";
$url2 = "https://api.paypal.com/v1/payments/payment";
} else {
//client sandbox
$clientId = "xxx";
$secret = "xxx";
$url1 = "https://api.sandbox.paypal.com/v1/oauth2/token";
$url2 = "https://api.sandbox.paypal.com/v1/payments/payment";
}
}
//print_r($refresh_token);die;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url1);
curl_setopt($ch, CURLOPT_HEADER, "Content-Type: application/x-www-form-urlencoded");
curl_setopt($ch, CURLOPT_USERPWD, $clientId . ":" . $secret);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=refresh_token&refresh_token=" . $refresh_token);
$result = curl_exec($ch);
curl_close($ch);
$result=json_decode($result);
//11111111 for payment Authorize: For example, to first authorize the payment, use a request similar to this:
$access_token = $result->access_token;
$data = array(
"intent" => "authorize",
"payer" => array(
"payment_method" => "paypal"
),
"transactions" => array(
array("amount" => array(
"currency" => "USD",
"total" => $amount
),
"description" => "future of sauces")
));
$data_string = json_encode($data);
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, $url2);
$headers = array(
'Content-Type: application/json',
'PayPal-Client-Metadata-Id: '.$Metadata_id,
'Authorization: Bearer '.$access_token,
'Content-Length: ' . strlen($data_string)
);
curl_setopt($ch1, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch1, CURLOPT_POST, true);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch1, CURLOPT_POSTFIELDS, $data_string);
$result1 = curl_exec($ch1);
curl_close($ch1);
$result1=json_decode($result1);
$message = $result1->message;
if($result1->state=='approved'){
$access_id= $result1->transactions[0]->related_resources[0]->authorization->id;
}else{
if(empty($message)){
$message ='Authorization error, Please try again.';
}
return array('response' => '', 'success' => '0','message'=>$message);
}
// print_r($result1);die;
//2222222 capture the payment:
$data = array("amount" => array(
"currency" => "USD",
"total" => $amount
),
"is_final_capture" => "true"
);
$data_string = json_encode($data);
$ch2 = curl_init();
if ($_SERVER['SERVER_NAME'] == 'syonserver.com') {
curl_setopt($ch2, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/payments/authorization/$access_id/capture");
}else {
$account = 0; // 0 for sandbox ,1 for live
if ($account == 1) {
//client live
curl_setopt($ch2, CURLOPT_URL, "https://api.paypal.com/v1/payments/authorization/$access_id/capture");
}else{
curl_setopt($ch2, CURLOPT_URL, "https://api.sandbox.paypal.com/v1/payments/authorization/$access_id/capture");
}
}
$headers = array(
'Content-Type: application/json',
'Authorization: Bearer '.$access_token,
'Content-Length: ' . strlen($data_string)
);
curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch2, CURLOPT_POST, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_POSTFIELDS, $data_string);
$response = curl_exec($ch2);
curl_close($ch2);
$response_a = json_decode($response, true);
$state = $response_a['state'];
$message = $response_a['message'];
if(!empty($response_a)){
if($state=='completed') {
return array('response' => $response_a, 'success' => '1','message'=>'Data received');
}else{
if(empty($message)){
$message ='Payment authorization error, Please try again.';
}
return array('response' => '', 'success' => '0','message'=>$message);
}
}
else{
return array('response' => '','success'=>'0','message'=>'Response nil');
}
}
else
{
return array('response' => '', 'success' => '0','message'=>'Authorization code not available.');
}
}else{
return array('response' => '', 'success' => '0','message'=>'Unauthorize request.');
}
}
Aus Neugier, gibt es eine gewisse Abneigung gegen die Verwendung des PayPal SDK? Es behandelt viel davon und sorgt für Konsistenz. Ich frage, weil ich in der Anfrage nicht sowohl eine * gültige * Client-ID als auch einen geheimen Schlüssel sehe - ich denke, das ist der Grund, warum Sie Fehler bekommen. Die ID scheint viel zu klein zu sein (vielleicht hast du sie aussortiert, falls ja, ignoriere das). –
Er hat ein Bearer-Token in der Anfrage - das sollte gültig sein, solange das Bearer-Token nicht abgelaufen ist. –
Sie können dies überprüfen, wenn Sie dies nicht gelesen haben: https://developer.paypal.com/docs/integration/mobile/make-future-payment/, überprüfen Sie die in der 'Get a auth code' genannten Schritte – HardikDG