474 lines
17 KiB
PHP
474 lines
17 KiB
PHP
// Create the Card Fields Component and define callbacks MSIN-3855 checkout
|
||
//<script>
|
||
|
||
|
||
|
||
|
||
if ($('#card-name-field-container').length > 0) {
|
||
console.log("paypal exist");
|
||
|
||
cardcheck=true;
|
||
const cardField = paypal.CardFields({
|
||
inputEvents: {
|
||
onChange: function(data) {
|
||
console.log("on change");
|
||
console.log(data.cards[0].type);
|
||
|
||
// the variable is defined
|
||
if (data.cards[0].type=="visa" || data.cards[0].type=="mastercard" || data.cards[0].type=="unknown") {
|
||
console.log("on change ok");
|
||
cardcheck=true;
|
||
|
||
}else{
|
||
|
||
|
||
console.log("on change bad");
|
||
cardcheck=false;
|
||
|
||
|
||
let translatedErrorMessage = translateErrorMessage('OnlyVisaandMastercard');
|
||
|
||
|
||
resultMessage(`${translatedErrorMessage}`);
|
||
}
|
||
}
|
||
|
||
,
|
||
onFocus: function(data){
|
||
// Do something when a field gets focus
|
||
},
|
||
onBlur: function(data){
|
||
// Do something when a field loses focus
|
||
}
|
||
|
||
},
|
||
createOrder: function (data) {
|
||
setProcessing(true);
|
||
console.log("createOrder 1");
|
||
console.log(data.paymentSource);
|
||
|
||
|
||
const cardNumber = data.number;
|
||
const cardType = detectCardType(cardNumber);
|
||
|
||
|
||
|
||
var postData = {request_type: 'create_order', payment_source: data.paymentSource};
|
||
return fetch("/paypal_advanced/paypal_checkout_init.php", {
|
||
method: "POST",
|
||
headers: {'Accept': 'application/json'},
|
||
body: encodeFormData(postData)
|
||
})
|
||
.then((res) => {
|
||
|
||
console.log("createOrder 2");
|
||
console.log(res);
|
||
return res.json();
|
||
})
|
||
.then((result) => {
|
||
resultMessage("<?php afficheTexte('preloader_wait', 1, 0, 1);?> ");
|
||
setProcessing(false);
|
||
console.log("createOrder 3");
|
||
console.log(result.msg);
|
||
console.log(result.detail);
|
||
console.log(result.status);
|
||
if (result.type == "OUT") {
|
||
window.location.href = "/<?php echo $strPage; ?>/somaire/<?php echo $tabEvenement['general']['eve_label_url']?>" ;
|
||
return false;
|
||
}
|
||
if (result.status == 1) {
|
||
console.log("createOrder 4");
|
||
return result.data.id;
|
||
} else {
|
||
|
||
console.log("createOrder 5");
|
||
let errorMessage = result.msg;
|
||
let translatedErrorMessage = translateErrorMessage(errorMessage);
|
||
resultMessage(`${translatedErrorMessage}`);
|
||
|
||
return false;
|
||
}
|
||
});
|
||
|
||
},
|
||
onApprove: function (data) {
|
||
setProcessing(true);
|
||
|
||
console.log("onApprove 1");
|
||
const {orderID} = data;
|
||
var postData = {request_type: 'capture_order', order_id: orderID};
|
||
return fetch('/paypal_advanced/paypal_checkout_init.php', {
|
||
method: "POST",
|
||
headers: {'Accept': 'application/json'},
|
||
body: encodeFormData(postData)
|
||
})
|
||
.then((res) => {
|
||
console.log("onApprove 2");
|
||
|
||
return res.json();
|
||
})
|
||
.then((result) => {
|
||
// Redirect to success page
|
||
if (result.status == 1) {
|
||
console.log("onApprove 3");
|
||
window.location.href = "/paiement_update.php?checkout_ref_id=" + result.ref_id;
|
||
} else {
|
||
|
||
|
||
console.log("onApprove 4");
|
||
let errorMessage = result.msg;
|
||
let translatedErrorMessage = translateErrorMessage(errorMessage);
|
||
resultMessage(`${translatedErrorMessage}`);
|
||
|
||
}
|
||
setProcessing(false);
|
||
});
|
||
},
|
||
onError: function (error) {
|
||
//console.error('Erreur lors du traitement du paiement', error);
|
||
},
|
||
});
|
||
|
||
// Render the PayPal Button for PayPal account payments MSIN-3856
|
||
paypal.Buttons({
|
||
style: {
|
||
shape: 'rect',
|
||
color: 'gold',
|
||
layout: 'vertical',
|
||
label: 'paypal',
|
||
height: 40, // Hauteur du bouton
|
||
size: 'responsive' // Option pour rendre le bouton responsive
|
||
},
|
||
// Custom onClick event handler
|
||
onClick: function (data, actions) {
|
||
// Perform your custom logic here
|
||
console.log('PayPal button clicked!');
|
||
|
||
let isValid = true;
|
||
|
||
|
||
var $termes = $('input.chk_termes[type=checkbox]:not(:checked)');
|
||
|
||
if (!$termes.length) {
|
||
isValid = true;
|
||
|
||
} else {
|
||
|
||
|
||
var str_alert = "<?php afficheTexte('terme_accepter') ?>";
|
||
|
||
setTimeout(function () {
|
||
alert(str_alert);
|
||
}, 1000);
|
||
return actions.reject();
|
||
}
|
||
|
||
|
||
// Example: Validate a form, show a message, or track the event
|
||
|
||
if (!isValid) {
|
||
// Prevent the payment flow if the form is not valid
|
||
console.log('Reject the payment and prevent the flow');
|
||
return actions.reject(); // Reject the payment and prevent the flow
|
||
} else {
|
||
console.log('Continue with the payment flow');
|
||
return actions.resolve(); // Continue with the payment flow
|
||
}
|
||
},
|
||
createOrderbad: function (data) {
|
||
console.log("create_order paypal !");
|
||
|
||
const payload = { request_type: 'create_order', payment_source: 'paypal' };
|
||
|
||
return fetch("/paypal_advanced/paypal_checkout_init.php", {
|
||
method: "POST",
|
||
// ⚠️ envoie du JSON (ou garde x-www-form-urlencoded mais alors change aussi côté PHP)
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'Accept': 'application/json'
|
||
},
|
||
body: JSON.stringify(payload)
|
||
})
|
||
.then(async (res) => {
|
||
|
||
|
||
// On lit TOUJOURS le texte brut pour debugger
|
||
const raw = await res.text();
|
||
console.debug('create_order RAW →', raw.slice(0, 400));
|
||
console.debug('status:', res.status, 'content-type:', res.headers.get('content-type'));
|
||
console.debug('type:', res.type, 'content-type:', res.headers.get('content-type'));
|
||
console.debug(res.type);
|
||
if (res.type == "OUT") {
|
||
window.location.href = "/<?php echo $strPage; ?>/somaire/<?php echo $tabEvenement['general']['eve_label_url']?>" ;
|
||
return false;
|
||
}
|
||
// On tente le JSON, sinon on voit l’erreur réelle
|
||
let json;
|
||
try { json = JSON.parse(raw); }
|
||
catch (e) {
|
||
throw new Error(
|
||
`create_order_error: réponse NON-JSON (HTTP ${res.status}) ` +
|
||
`(ct=${res.headers.get('content-type')||'?'}) → ${raw.slice(0, 200)}`
|
||
);
|
||
}
|
||
|
||
if (!res.ok) {
|
||
throw new Error(json.message || json.msg || 'Erreur serveur (create_order)');
|
||
}
|
||
if (json.status !== 1 || !json.data || !json.data.id) {
|
||
throw new Error(json.message || json.msg || 'Réponse JSON invalide: id manquant');
|
||
}
|
||
|
||
console.log("create_order paypal ok");
|
||
return json.data.id;
|
||
})
|
||
.catch((err) => {
|
||
// Tu vas voir ici la vraie cause (HTML, warning PHP, redirect, etc.)
|
||
console.error('create_order_error', err);
|
||
|
||
console.error('err.message');
|
||
resultMessage(err.message);
|
||
setProcessing(false);
|
||
// IMPORTANT: pour interrompre le flow PayPal, on REJETTE (ne pas "return false")
|
||
throw err;
|
||
});
|
||
}
|
||
,
|
||
|
||
createOrder: function (data) {
|
||
console.log("create_order paypal");
|
||
|
||
var postData = {request_type: 'create_order', payment_source: 'paypal'};
|
||
return fetch("/paypal_advanced/paypal_checkout_init.php", {
|
||
method: "POST",
|
||
headers: {'Accept': 'application/json'},
|
||
body: encodeFormData(postData)
|
||
})
|
||
.then((res) => {
|
||
|
||
|
||
return res.json();
|
||
})
|
||
.then((result) => {
|
||
if (result.type == "OUT") {
|
||
window.location.href = "/<?php echo $strPage; ?>/somaire/<?php echo $tabEvenement['general']['eve_label_url']?>" ;
|
||
return false;
|
||
}
|
||
|
||
resultMessage("<?php afficheTexte('preloader_wait', 1, 0, 1);?> ");
|
||
setProcessing(false);
|
||
if (result.status == 1) {
|
||
console.log("create_order paypal ok");
|
||
return result.data.id;
|
||
|
||
} else {
|
||
console.log("erreur create_order pay pal");
|
||
|
||
let errorMessage = result.msg;
|
||
let translatedErrorMessage = translateErrorMessage(errorMessage);
|
||
resultMessage(`${translatedErrorMessage}`);
|
||
|
||
return false;
|
||
}
|
||
});
|
||
}
|
||
,
|
||
|
||
onApprove: async function (data, actions) {
|
||
const orderID = data.orderID;
|
||
console.log("onApprove paypal");
|
||
|
||
try {
|
||
|
||
// 2) Capture
|
||
const details = await actions.order.capture();
|
||
|
||
// 3) Finalisation côté serveur (ton code existant)
|
||
const transactionID = details.purchase_units[0].payments.captures[0].id;
|
||
const postData = {
|
||
payeremail: details.payer.email_address,
|
||
payername: (details.payer.name?.surname || "") + (details.payer.name?.given_name || ""),
|
||
request_type: "fin_paypal",
|
||
payment_source: "paypal",
|
||
order_id: orderID,
|
||
transaction_id: transactionID,
|
||
order_status: details.status
|
||
};
|
||
|
||
const res = await fetch("/paypal_advanced/paypal_checkout_init.php", {
|
||
method: "POST",
|
||
headers: { "Accept": "application/json" },
|
||
body: encodeFormData(postData)
|
||
});
|
||
const result = await res.json();
|
||
|
||
resultMessage("<?php afficheTexte('preloader_wait', 1, 0, 1);?> ");
|
||
setProcessing(false);
|
||
|
||
if (result.status == 1) {
|
||
window.location.href = "/paiement_update.php?checkout_ref_id=" + result.ref_id;
|
||
} else {
|
||
let translatedErrorMessage = translateErrorMessage(result.msg);
|
||
resultMessage(`${translatedErrorMessage}`);
|
||
return false;
|
||
}
|
||
} catch (err) {
|
||
console.error("Erreur PayPal (invoice/capture):", err);
|
||
resultMessage("Erreur PayPal: Request Failed!");
|
||
setProcessing(false);
|
||
return false;
|
||
}
|
||
},
|
||
|
||
|
||
|
||
|
||
|
||
onError: function (err) {
|
||
console.error('An error occurred during the transaction', err);
|
||
}
|
||
}).render('#paypal-button-container');
|
||
|
||
// Render each field after checking for eligibility
|
||
if (cardField.isEligible()) {
|
||
|
||
const nameField = cardField.NameField({
|
||
placeholder: "<?php echo afficheTexte('checkout_nomsurlacarte', 0)?>" // Translate placeholder
|
||
});
|
||
nameField.render("#card-name-field-container");
|
||
|
||
|
||
const numberField = cardField.NumberField({
|
||
placeholder: "<?php echo afficheTexte('checkout_ccnumber', 0)?>" // Translate placeholder
|
||
});
|
||
numberField.render("#card-number-field-container");
|
||
|
||
|
||
const cvvField = cardField.CVVField({
|
||
placeholder: "<?php echo afficheTexte('checkout_cvv', 0)?>" // Translate placeholder
|
||
});
|
||
cvvField.render("#card-cvv-field-container");
|
||
|
||
const expiryField = cardField.ExpiryField({
|
||
placeholder: "<?php echo afficheTexte('checkout_cexpiryField', 0)?>" // Translate placeholder
|
||
});
|
||
|
||
|
||
expiryField.render("#card-expiry-field-container");
|
||
|
||
// Add click listener to submit button and call the submit function on the card-number-field-container component
|
||
// checkout
|
||
document
|
||
.getElementById("card-field-submit-button")
|
||
.addEventListener("click", () => {
|
||
// valide term et condition
|
||
let isValid = true;
|
||
var $termes = $('input.chk_termes[type=checkbox]:not(:checked)');
|
||
if (!$termes.length) {
|
||
isValid = true;
|
||
} else {
|
||
isValid = false;
|
||
var str_alert = "<?php afficheTexte('terme_accepter') ?>";
|
||
/*if ($termes.data('pop_up') == 'location_policy') {
|
||
str_alert = $("#chk_location_policy").data('msg') + "\n" + str_alert;
|
||
}*/
|
||
|
||
alert(str_alert);
|
||
}
|
||
if (!isValid) {
|
||
return; // Stop further execution if validation fails
|
||
}
|
||
//verifie si cheques
|
||
|
||
console.log("type paiement");
|
||
var element = document.getElementById('chk_pai_6');
|
||
if (element){
|
||
if (document.getElementById('chk_pai_6').checked) {
|
||
grecaptcha.ready(function () {
|
||
grecaptcha.execute('<?php echo RECAPTCHA_SITE_KEY; ?>', {action: 'achat'}).then(function (token) {
|
||
document.getElementById('g-recaptcha-response').value = token;
|
||
console.log("checkboxValue == 6 payadv");
|
||
$("#frm_panier").submit();
|
||
$('body').css('cursor', 'wait');
|
||
});
|
||
});
|
||
}
|
||
}
|
||
|
||
console.log("test cart");
|
||
|
||
if (cardcheck) {
|
||
console.log("ok cart");
|
||
}else{return;}
|
||
cardField.submit().then(() => {
|
||
// si tout est ok
|
||
console.log("cardField.submit");
|
||
}) .catch((error) => {
|
||
console.log("erreur avant start");
|
||
let str = error.message;
|
||
|
||
console.log(str.length );
|
||
|
||
if(str.length >200){
|
||
let result = str.substring(str.indexOf('.') + 1);
|
||
let resultObject = JSON.parse(result);
|
||
let description = resultObject.details[0].description;
|
||
console.log(description);
|
||
let errorMessage = description;
|
||
let translatedErrorMessage = translateErrorMessage(errorMessage);
|
||
resultMessage(`${translatedErrorMessage}`);
|
||
|
||
}else{
|
||
|
||
let translatedErrorMessage = translateErrorMessage(str);
|
||
resultMessage(`${translatedErrorMessage}`);
|
||
|
||
}
|
||
console.log("erreur fin");
|
||
});
|
||
console.log("erreur 1");
|
||
});
|
||
console.log("erreur 2");
|
||
} else {
|
||
console.log("erreur 3");
|
||
// Hides card fields if the merchant isn't eligible
|
||
document.querySelector("#checkout-form").style = "display: none";
|
||
}
|
||
console.log("erreur 4");
|
||
const encodeFormData = (data) => {
|
||
var form_data = new FormData();
|
||
|
||
for (var key in data) {
|
||
form_data.append(key, data[key]);
|
||
}
|
||
return form_data;
|
||
}
|
||
console.log("erreur 5");
|
||
// Show a loader on payment form processing
|
||
const setProcessing = (isProcessing) => {
|
||
if (isProcessing) {
|
||
document.querySelector(".overlay").classList.remove("hidden");
|
||
} else {
|
||
document.querySelector(".overlay").classList.add("hidden");
|
||
}
|
||
|
||
}
|
||
|
||
// Display status message
|
||
const resultMessage = (msg_txt) => {
|
||
console.log(msg_txt);
|
||
|
||
const messageContainer = document.querySelector("#paymentResponse");
|
||
|
||
messageContainer.classList.remove("hidden");
|
||
messageContainer.textContent = msg_txt;
|
||
|
||
setTimeout(function () {
|
||
messageContainer.classList.add("hidden");
|
||
messageContainer.textContent = "";
|
||
}, 5000);
|
||
console.log('fin message');
|
||
}
|
||
}
|
||
// fin paypal adv
|