Ich habe ein Problem bei der Einbuchung von Bestellungen festgestellt, die mit PayPal bezahlt werden. Im Formular
#checkout_confirmation werden Datenfeld beim Abschicken dieses Formulars nicht
checkout_process übermittelt.
Im Zahlungs-Modul
/incudes/modules/payment/paypal.php lautet der Code für diesen Vorgang wie folgt:
$paypalscript = '
paypal.Buttons({
fundingSource: paypal.FUNDING.PAYPAL,
style: {
...
},
createOrder: function(data, actions) {
...
},
onApprove: function(data, actions) {
$("#checkout_confirmation").submit();
$("#checkout_confirmation").html("");
},
onError: function (err) {
...
},
onRender: function() {
....
}
}).render("#apms_button1");
';
Obiger Code-Schnipsel bedeutet: Das Formular #checkout_confirmation wird "onApprove" übermittelt ("
$("#checkout_confirmation").submit.()") und dann sofort aus dem DOM-Tree entfernt (
$("#checkout_confirmation").html()).
Dies führt bei meinem Browser (Chrome in Version 111.0.5563.149) zu Timing-Problemen: Das Formular ist mit seinen Feldern schon weg, bevor der Submit-Vorgang alle Formularfelder für sein POST eingesammelt hat. Dann fehlen eben diese Formularfelder. Die darin enthaltenen Daten kommen also nicht in "checkout_process" an.
Kann man problemlos beheben, in dem man das Entfernen des Formulars einfach etwas zeitverzögert durchführt. Ich habe mich für 200 Millisekunden Verzögerung entschieden. Et voilà: Alle Daten aus dem Formular checkout_confirmation kommen in checkout_process an.
Deshalb möchte ich folgende kleine Ergänzung im Code vorschlagen: Der Timeout sorgt für die vorgeschlagene Verzögerung - und alle Timing-Probleme sind erfolgreich umschifft.
$paypalscript = '
paypal.Buttons({
fundingSource: paypal.FUNDING.PAYPAL,
style: {
...
},
createOrder: function(data, actions) {
...
},
onApprove: function(data, actions) {
$("#checkout_confirmation").submit();
setTimeout(function(){
$("#checkout_confirmation").html("");
}, 200);
},
onError: function (err) {
...
},
onRender: function() {
....
}
}).render("#apms_button1");
';