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="}