 |
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 ?>¤cy=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 ...
|