Salve a tutti , avevo un applicazione che si basava su ipn , visto che è deprecato ho deciso di implementare Javascript SDK seguendo la seguente guida :
https://www.codexworld.com/paypal-st...ration-in-php/
Ho adattato il codice lato server per adeguarlo al framework php codeigniter 4 e tutto sembra funzionare correttamente (inserisco la transazione nel db ed eseguo il response in formato json).
Il problema è lato client , ho inserito un pò di console.log per cercare di capire dove è il problema , di seguito il codice JS (all'interno c'è un minimo di php):
codice:
<script>
paypal.Buttons({
// Sets up the transaction when a payment button is clicked
createOrder: (data, actions) => {
console.log('create_order');
return actions.order.create({
"purchase_units": [{
"custom_id": "<?=$tratta_acquistata_andata->id; ?>",
//"description": "<?php ?>",
"amount": {
"currency_code": "EUR",
"value": "<?= $totale_da_pagare; ?>",
"breakdown": {
"item_total": {
"currency_code": "EUR",
"value": "<?= $totale_da_pagare; ?>"
}
}
},
"items": [
{
"name": "<?= $tratta_acquistata_andata->id; ?>",
"description": "<?= $tratta_acquistata_andata->punto_partenza.'->'.$tratta_acquistata_andata->punto_arrivo ?>",
"unit_amount": {
"currency_code": "EUR",
"value": "<?=$totale_da_pagare; ?>"
},
"quantity": "1",
"category": "DIGITAL_GOODS"
},
]
}]
});
},
// Finalize the transaction after payer approval
onApprove: (data, actions) => {
console.log('onApprove');
return actions.order.capture().then(function(orderData) {
setProcessing(true);
console.log('orderData'+JSON.stringify(orderData));
var postData = {paypal_order_check: 1, order_id: orderData.id};
fetch(' <?=base_url('paypal/check_validate') ?>', {
method: 'POST',
headers: {'Accept': 'application/json'},
body: encodeFormData(postData)
})
.then(
console.log('response'),
(response) => response.json(),
)
.then((result) => {
console.log('result:'+ result );
if(result.status == 1){
console.log('resultStatus-if');
window.location.href = "payment-status.php?checkout_ref_id="+result.ref_id;
}else{
console.log('resultStatus-else');
const messageContainer = document.querySelector("#paymentResponse");
messageContainer.classList.remove("hidden");
messageContainer.textContent = result.msg;
setTimeout(function () {
messageContainer.classList.add("hidden");
messageText.textContent = "";
}, 5000);
}
setProcessing(false);
})
.catch(error => console.log(error));
});
}
}).render('#paypal-button-container');
const encodeFormData = (data) => {
console.log('encodeFormData');
var form_data = new FormData();
for ( var key in data ) {
form_data.append(key, data[key]);
}
return form_data;
}
// Show a loader on payment form processing
const setProcessing = (isProcessing) => {
console.log('setProcessing');
if (isProcessing) {
document.querySelector(".overlay").classList.remove("hidden");
} else {
document.querySelector(".overlay").classList.add("hidden");
}
}
</script>
Mi aspetterei, visto che lato server tutto funziona di entrare nell'if qui :
codice:
if(result.status == 1){
in realtà il risultato in console è :
codice:
create_order
135:526 onApprove
135:596 setProcessing
135:532 orderData{//non mostro tutto ma ho tutti i dati correttamente}
135:582 encodeFormData
135:541 response
135:547 result:[object Response]
135:557 resultStatus-else
135:596 setProcessing
Inanzitutto perchè ho un then(response) e poi un then(result) ?
se può essere utile in fetch/XHR di chrome nel tab response ho :
codice:
{"status":1,"msg":"Transaction completed!","ref_id":"NzhXNDQ3NzlXRTUwMTIzMEU="}