Я тестирую интеграцию PayPal, в демо-тесте php на моем сервере apache с помощью vhost -> test.it/paypal. Я использую Express Checkout + серверный REST (cURL). My js Добавьте кнопку PayPal:
<script> var CREATE_PAYMENT_URL = 'http://test.it/paypal/create-payment.php'; var EXECUTE_PAYMENT_URL = 'http://test.it/paypal/execute-payment.php'; paypal.Button.render({ env: 'sandbox', // Or 'production', commit: true, // Show a 'Pay Now' button locale: 'it_IT', style: { size: 'small', color: 'blue', shape: 'pill', label: 'checkout' }, commit: true, // Show a 'Pay Now' button payment: function() { // Make a call to the merchant server to set up the payment return paypal.request.post(CREATE_PAYMENT_URL).then(function(res) { //return res.payToken; console.log(res); return res.paymentID; }); }, // Wait for the payment to be authorized by the customer onAuthorize: function(data) { //alert(data.payerID); return paypal.request.post(EXECUTE_PAYMENT_URL, { paymentID: data.paymentID, payerID: data.payerID }).then(function(res) { /* Go to a success page */ console.log('SUCCESS!!!!!!!!!'); console.log(res); // The payment is complete! // You can now show a confirmation message to the customer alert('pagamento completato'); }).catch(function (err) { /* Go to an error page */ console.log('ERROR!!!!!!!!!'); console.log(data); console.log(err); }); } }, '#paypal-button'); </script>
Файл create-payment.php выглядит следующим образом:
<?php session_start(); include 'config.php'; // autenticazione per ottenere user token $url_wbs="https://api.sandbox.paypal.com/v1/oauth2/token"; $ch = curl_init(); $clientId = "Aeet9T-pG4XQU-GnDL2uSrkJQ4_qaxgAu9XtVTP6qeuXDGBOnHf2TiVF2Qv5OurFmSo9dPkwVk-x0J3x"; $secret = "EGQguUgHcN4TLjAEAXb4Jo8qoTQCvC3o_54FL2r2wQUtjbGoRoWeRlDyNNhU3HO8lpdexzNsW-ePb2qe"; // id web experience profile $experience_profile_id="XP-V52K-SKNH-FK7Y-HLYQ"; curl_setopt($ch, CURLOPT_URL, $url_wbs); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 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); curl_close($ch); if(empty($result))die("Error: No response."); else { $obj=json_decode( $result ); //var_dump($obj->access_token); $_SESSION['token']=$obj->access_token; // imposto il web profile ottenendone l'id $header_rest_call[]='Authorization: Bearer '.$obj->access_token; $json_body='{ "intent": "sale", "experience_profile_id":"'.$experience_profile_id.'", "redirect_urls": { "return_url": "http://test.it/paypal/checkout.php", "cancel_url": "http://test.it/paypal/pagamento-cancellato.php" }, "payer": { "payment_method": "paypal" }, "transactions": [ { "amount": { "total": "4.00", "currency": "EUR", "details": { "subtotal": "2.00", "shipping": "1.00", "tax": "2.00", "shipping_discount": "-1.00" } }, "item_list": { "items": [ { "quantity": "1", "name": "item 1", "price": "1", "currency": "EUR", "description": "item 1 description", "tax": "1" }, { "quantity": "1", "name": "item 2", "price": "1", "currency": "EUR", "description": "item 2 description", "tax": "1" }] }, "description": "The payment transaction description.", "invoice_number": "merchant invoice", "custom": "merchant custom data" }] }'; $obj_payment=get_obj_json($payment_creation_url,$header_rest_call,$json_body,'POST'); //var_dump($obj_payment->id); $response=array( 'paymentID'=>$obj_payment->id ); echo json_encode($response); } ?>
Исполнение-payment.php выглядит следующим образом:
<?php session_start(); include 'config.php'; // imposto il web profile ottenendone l'id $header_rest_call[]='Authorization: Bearer '.$_SESSION['token']; // indirizzo wbs per pagamento $url_payment="https://api.sandbox.paypal.com/v1/payments/payment/".$_POST['paymentID']."/execute/"; $json_body='{ "payer_id": "'.$_POST['payerID'].'"; }'; $obj_payment=get_obj_json($url_payment,$header_rest_call,$json_body,'POST'); echo json_encode($obj_payment); ?>
Когда я нажимаю кнопку Paypal, форма входа в PayPal правильно отображается с данными о покупке, я вводим учетные данные и, наконец, нажимаю кнопку «платить сейчас». Кажется, что платеж был успешным, но в учетной записи sandbox -> activity -> Нет следов переходов / платежей ..?
Проблема заключалась в некорректном json запроса оплаты / выполнения.
$json_body='{ "payer_id": "'.$_POST['payerID'].'";
} ';
После запятой была введена точка с запятой -> $ _POST ['payerID']. "
Теперь это работает!