fix(payments): Express-Rueckkehr nach zweiter PayPal-Freigabe nimmt den normalen Rueckweg mit Capture
PayPal Live antwortet auf den Capture nach dem Betrags-PATCH mit 422 PAYER_ACTION_REQUIRED (Sandbox nicht). Der Kunde gibt erneut frei und kehrt ueber ?payment_express= zurueck; dort scheiterte onExpressReturn an custom_id != 'express' und zeigte eine Fehlerseite, waehrend die Bestellung offen blieb (Live-Bestellung 312143).
This commit is contained in:
@@ -128,6 +128,17 @@ abstract class AbstractProvider implements ProviderInterface
|
||||
Log::write($module, 'start', $orderId, $number, $reference, 'open', null, $raw);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt es zu dieser Anbieter-Referenz schon einen Vorgang (mit Bestellung)?
|
||||
* Braucht die Kasse bei der Express-Rueckkehr: verlangt PayPal nach dem Betrags-PATCH
|
||||
* eine zweite Freigabe, kommt der Kunde ueber die Express-URL zurueck, obwohl die
|
||||
* Bestellung laengst existiert -- dann ist es eine normale Rueckkehr mit Capture.
|
||||
*/
|
||||
public function knownReference(string $reference): bool
|
||||
{
|
||||
return $reference !== '' && $this->transactionByReference($reference) !== null;
|
||||
}
|
||||
|
||||
protected function transactionByReference(string $reference): ?object
|
||||
{
|
||||
$stmt = $this->db->prepare('SELECT * FROM payment_transactions WHERE provider=? AND reference=? LIMIT 1');
|
||||
|
||||
@@ -407,6 +407,14 @@ class website_cashdesk {
|
||||
$module = strtolower(trim((string)$_GET['payment_express']));
|
||||
$provider = $this->payment_provider($module);
|
||||
$data = null;
|
||||
// 18.09.2026 -- zweite Freigabe: PayPal Live verlangt nach dem Betrags-PATCH (Versand)
|
||||
// eine erneute Freigabe, der Kunde kommt danach ueber DIESE URL zurueck. Die Bestellung
|
||||
// und der Vorgang existieren dann schon -> normaler Rueckweg mit Capture, nicht noch
|
||||
// einmal die Kasse vorbelegen (custom_id ist da auch nicht mehr 'express').
|
||||
if ($provider && $provider->knownReference((string)($_GET['token'] ?? ''))) {
|
||||
$_GET['payment_return'] = $module;
|
||||
return $this->payment_provider_return();
|
||||
}
|
||||
if ($provider && $provider->supportsExpress()) {
|
||||
try {
|
||||
$data = $provider->onExpressReturn($_GET);
|
||||
|
||||
Reference in New Issue
Block a user