Welcome Guest, Not a member yet? Register   Sign In
PAypal implementation, error with json response on develompment
#1

(This post was last modified: 02-25-2025, 06:18 AM by pippuccio76.)

Hi , starting by this code:
https://www.codexworld.com/paypal-standa...on-in-php/
 i try to implement paypal payment on ci4 ,
this is my form :
Code:
<?= $this->extend('vetrina/templates/layout_home') ?>
<?= $this->section('custom_css') ?>

<style type="text/css">

.header-style1{

    background-color: black;
}

.video-overlay, .video-placeholder{

    z-index: -1;
}

.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu) {
    -webkit-border-top-left-radius: 1.2rem;
-webkit-border-bottom-left-radius: 1.2rem;
-moz-border-radius-topleft: 1.2rem;
-moz-border-radius-bottomleft: 1.2rem;
border-top-left-radius: 1.2rem;
border-bottom-left-radius: 1.2rem;
}


#buttons-container{

    text-align: center !important;
}

</style>

<?= $this->endSection() ?>

<?= $this->section('content') ?>

<div class="container mt-5 ">
   
    <div class="row mt-5">
          <div class="col-md-12 text-center">



                <div class="card mt-5 mb-5">
                    <div class="overlay hidden"><div class="overlay-content"><i class="fa-solid fa-spinner"></i></div></div>

                    <div class="card-header">
                        <h3 class="panel-title"><?=lang('Clienti_ricerca_tratte.paga') ?> <?=$totale_da_pagare; ?> <?=lang('Clienti_ricerca_tratte.con_paypal') ?></h3>
                       
                        <!-- Product Info -->
                        <p><b><?=lang('Clienti_ricerca_tratte.tratta') ?> <?= $tratta_acquistata_andata->punto_partenza; ?> -> <?= $tratta_acquistata_andata->punto_arrivo; ?> </p>
                        <p><b><?=lang('Clienti_ricerca_tratte.prezzo') ?>:</b> <?php echo 'EUR '.$totale_da_pagare ?></p>
                    </div>

                    <div class="card-body text-center">
                        <!-- Display status message -->
                        <div id="paymentResponse" class="hidden"></div>
                       
                        <!-- Set up a container element for the button -->                                       
                        <center><div id="paypal-button-container" ></div></center>         
                                   
                    </div>
                </div>


           
          </div>
         
    </div>
       


</div>









<?= $this->endSection() ?>

<?= $this->section('script') ?>
<script src="https://www.paypal.com/sdk/js?client-id=<?=$paypal_client_id ?>&currency=EUR"></script>

<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( 
                    response =>{return  response.json() }
                    //console.log('response'+ JSON.stringify(response)),

            )
            .then((result) => {

                console.log('result:'+ JSON.stringify(result) );
               
                if(result.status == 1){

                    console.log('resultStatus-if');

                    window.location.href = "<?=base_url('paypal/success_pagamento_tratta/') ?>"+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>

<?= $this->endSection() ?>
This is my method check_validate:
Code:
public function check_validate()
    {

        //log_message('debug','inside check_validate');

        $pagamenti_paypal_model = new Pagamenti_paypalModel();
        $tratte_acquistate_model = new Tratte_acquistateModel();

        $paypal = new PaypalCheckout;


       
        $response = array('status' => 0, 'msg' => 'Transaction Failed!');

        if(!empty($_POST['paypal_order_check']) && !empty($_POST['order_id'])){
            // Validate and get order details with PayPal API
            try { 
                $order = $paypal->validate($_POST['order_id']);
            } catch(Exception $e) { 
                $api_error = $e->getMessage(); 
            }

            //log_message('debug','Order:'.print_r($order,true));
           
            if(!empty($order)){
                $order_id = $order['id'];
                $intent = $order['intent'];
                $order_status = $order['status'];
                $order_time = date("Y-m-d H:i:s", strtotime($order['create_time']));
       
                if(!empty($order['purchase_units'][0])){



                    $purchase_unit = $order['purchase_units'][0];
       
                    $id_tratta_acquistata = $purchase_unit['custom_id'];

                    $item = $purchase_unit['items'][0];

                    //log_message('debug','items'.json_encode($item));

                    $category = $item['category'];

                    $item_name = $item['description'];
                   

                    if(!empty($purchase_unit['amount'])){
                        $currency_code = $purchase_unit['amount']['currency_code'];
                        $amount_value = $purchase_unit['amount']['value'];
                    }
       
                    if(!empty($purchase_unit['payments']['captures'][0])){
                        $payment_capture = $purchase_unit['payments']['captures'][0];
                        $transaction_id = $payment_capture['id'];
                        $payment_status = $payment_capture['status'];

                        $seller_receivable_breakdown = $payment_capture['seller_receivable_breakdown'];


                        //log_message('debug','seller_receivable_breakdown'.print_r($seller_receivable_breakdown,true));

                        $paid_fee = $seller_receivable_breakdown['paypal_fee']['value'];

                        log_message('debug','seller_receivable_breakdown'.print_r($seller_receivable_breakdown['paypal_fee'],true));


                    }


                    /*
                    if(!empty($purchase_unit['payee'])){
                        $payee = $purchase_unit['payee'];
                        $payee_email_address = $payee['email_address'];
                    }
                    */
                }
       
                $payment_source = '';

                if(!empty($order['payment_source'])){
                    foreach($order['payment_source'] as $key=>$value){
                        $payment_source = $key;
                    }
                }
       
                if(!empty($order['payer'])){
                    $payer = $order['payer'];
                    $payer_id = $payer['payer_id'];
                    $payer_name = $payer['name'];
                    $payer_given_name = !empty($payer_name['given_name'])?$payer_name['given_name']:'';
                    $payer_surname = !empty($payer_name['surname'])?$payer_name['surname']:'';
                    $payer_full_name = trim($payer_given_name.' '.$payer_surname);
                    $payer_full_name = htmlspecialchars($payer_full_name);

                    //log_message('debug','payer_full_name:'.$payer_full_name);
       
                    $payer_email_address = $payer['email_address'];
                    $payer_address = $payer['address'];
                    $payer_country_code = !empty($payer_address['country_code'])?$payer_address['country_code']:'';
                }
       
                if(!empty($order_id) && $order_status == 'COMPLETED'){


                    $db = \Config\Database::connect();
                   
                    $db->transStart();
                       
                   


                    // Check if any transaction data is exists already with the same TXN ID
                    $pagamenti_paypal_model->where('transaction_id',$transaction_id)
                                            ->first();

                    log_message('debug','pagamenti_paypal_model:'.$pagamenti_paypal_model->getLastQuery());

                    if(!empty($row_id)){
                   
                        $payment_id = $row_id;
                   
                    }else{
                       
                        // Insert transaction data into the database
                        $data_to_insert_pagamenti = [

                            'id_tratte_acquistate' => $id_tratta_acquistata,
                            'payer_id' => $payer_id,
                            'payer_name' => $payer_full_name,
                            'payer_email' => $payer_email_address,
                            'payer_country' => $payer_country_code,
                            'order_id' => $order_id,
                            'transaction_id' => $transaction_id,
                            'paid_amount' => $amount_value,
                            'paid_fee' => $paid_fee,
                            'paid_amount_currency' => $currency_code,
                            'payment_source' => $payment_source,
                            'payment_status' => $payment_status,

                        ];

                        log_message('debug','data_to_insert_pagamenti'.json_encode($data_to_insert_pagamenti));


                        $pagamenti_paypal_model->insert($data_to_insert_pagamenti);


                        if($pagamenti_paypal_model->getInsertID()){

                            $data_to_update_tratta_acquistata=[

                                'deleted_at' =>NULL

                            ];

                            $tratte_acquistate_model->update($id_tratta_acquistata,$data_to_update_tratta_acquistata);

                        }
                    }
       
                    $db->transComplete();



                    if($db->transStatus()!==false) {

                        $ref_id_enc = base64_encode($transaction_id);
                        $response = array('status' => 1, 'msg' => 'Transaction completed!', 'ref_id' => $ref_id_enc);
                   
                    }



                }


            }else{

                $response['msg'] = $api_error;
            }
        }
       
        // Make sure file is not cached (as it happens for example on iOS devices)
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");

        log_message('debug','response:'.json_encode($response));
        echo json_encode($response);
   
    }
   
I spend several hours tofind the error and the error was debug bar on     CI_ENVIRONMENT = development
Why?


ANother question how can i resend transaction encoded on url ? because base64_encode($transaction_id);  return equal at and of string ...
Reply




Theme © iAndrew 2016 - Forum software by © MyBB