Was GoCardless sagt
| Reason | Typ | Text von GoCardless |
|---|---|---|
retry_failed | invalid_state | Payment could not be retried. |
Die Dokumentation zur Wiederholung (POST /payments/{id}/actions/retry) nennt die Regeln: Die Zahlung wird wiederholt, wenn ihr Mandat aktiv ist, die API liefert retry_failed, wenn die Zahlung nicht fehlgeschlagen ist, und «Payments can be retried up to 3 times.». Wie bei allen invalid_state-Fehlern rät GoCardless, den Anwender zu informieren und ihn nicht erneut versuchen zu lassen. Der Konnektor vermerkt in seinem Code, dass auch eine vierte Wiederholung in der GoCardless-Sandbox retry_failed erhielt.

Warum der Fehler auftritt
Laut Dokumentation kommt retry_failed, wenn die Zahlung nicht fehlgeschlagen ist, und der Konnektor hat ihn auch bei einer vierten Wiederholung gesehen. Bei einem Mandat, das nicht mehr aktiv ist, sagt die Dokumentation nicht, welcher Fehler kommt: Der Konnektor erwartet retry_failed oder mandate_is_inactive und behandelt beide gleich.
Eine nicht fehlgeschlagene Zahlung umfasst mehr, als es scheint. Ein ausstehender oder bestätigter Einzug ist nicht fehlgeschlagen, und ein zurückgebuchter (charged_back) ebenfalls nicht: Das Geld ist angekommen, und die Bank des Kunden hat es danach wieder abgezogen. Laut GoCardless-Dokumentation würde jeder von ihnen retry_failed erhalten.
Beim Limit der Wiederholungen verwirrt vor allem Success+. Wenn Success+ eine Zahlung wiederholt, sendet GoCardless ein Ereignis resubmission_requested, genau wie bei jeder anderen Wiederholung. Der Konnektor zählt pro solchem Ereignis eins hoch, egal ob es von Success+ oder von einer aus Odoo angeforderten Wiederholung stammt, und vermerkt in seinem Code, dass das GoCardless-Limit von 3 die Wiederholungen von Success+ einschließt. Da jeder vom Konnektor gesendete Einzug retry_if_possible anfordert, ist bei aktiviertem Success+ leicht ein Teil dieses Kontingents schon verbraucht, wenn Sie die Rechnung ansehen.
Was Sie in Odoo mit dem Konnektor sehen
Die Transaktion öffnen Sie über die Rechnung, mit der Schaltfläche «Zahlungstransaktion» oben; das Menü der Transaktionen erscheint nur im Entwicklermodus und existiert in Odoo 20 nicht. Die Schaltfläche «Retry collection» der Transaktion erscheint nur, wenn der Konnektor die Wiederholung akzeptieren würde: Sie wird von einem berechneten Feld gesteuert, das dieselbe Regel verwendet, die der Server beim Klick prüft. Sagt die Regel nein, erscheint die Schaltfläche nicht, und ihr Grund wird nicht auf dem Bildschirm angezeigt. Sie sehen den Status der Transaktion und ihre GoCardless-Gruppe:
| Situation | Was Sie in der Transaktion sehen |
|---|---|
| Success+ wird sie wiederholen | Status «Ausstehend», das Kästchen «Success+ Will Retry» angehakt und in «Mitteilung» der Text «GoCardless could not collect this payment (…). Success+ will retry it automatically; there is nothing to do.». Keine Schaltfläche. |
| Fehlgeschlagen, ohne Success+, mit weniger als 3 Wiederholungen und aktivem Mandat | Status «Fehler» und die Schaltfläche «Retry collection». |
| Es sind bereits 3 Wiederholungen | Status «Fehler» und «GoCardless Retries» auf 3. Keine Schaltfläche. |
| Das Mandat ist archiviert | Status «Fehler»; im Kontakt die Notiz zum Mandat und die Aktivität «GoCardless mandate lost». Keine Schaltfläche. |
| Ausstehend oder bestätigt | Keine Schaltfläche. |
| Zurückgebucht, zum Beispiel mit MD06 | Status «Fehler», auch wenn das Mandat noch aktiv ist. Keine Schaltfläche: In GoCardless steht die Zahlung auf charged_back, nicht auf failed. |
Beim Klick auf die Schaltfläche bittet Odoo um Bestätigung: «GoCardless will try to collect this payment again, which can cost a fee. Continue?». Akzeptiert GoCardless, wechselt die Transaktion auf ausstehend mit «Retry requested. GoCardless will confirm the new charge date.». Sobald das Ereignis resubmission_requested eintrifft, zählt der Konnektor die Wiederholung hoch und schreibt das Datum: «GoCardless will collect this payment again on … (retry requested, retry 1 of 3).». Beim Klick wird nichts hochgezählt, sodass jede Wiederholung nur einmal zählt.
Was mit den Ereignissen eintrifft, schreibt der Konnektor ohne Zutun eines Benutzers: die Success+-Meldung aus der Tabelle, das neue Einzugsdatum und, wenn das Mandat durch ein Ereignis erloschen ist, die Notiz und die Aktivität im Kontakt. Der Konnektor ist nicht ins Deutsche übersetzt: Diese Texte erscheinen immer auf Englisch, auch in einem deutschen Odoo, egal ob ein Benutzer oder eine geplante Aktion sie auslöst: «GoCardless could not collect this payment (…). Success+ will retry it automatically; there is nothing to do.», «GoCardless will collect this payment again on … (retry requested, retry 1 of 3).» und «GoCardless mandate lost». Auch was beim Klick auf die Schaltfläche erscheint, steht auf Englisch.

Wenn GoCardless retry_failed antwortet
Antwortet die API trotzdem mit retry_failed oder mandate_is_inactive, prüft der Konnektor das Mandat, bevor er etwas anzeigt:
- Ist das Mandat erloschen, archiviert er es und vermerkt das in der Transaktion: «The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.».
- Ist es noch aktiv, zeigt er den GoCardless-Fehler unverändert an: «GoCardless rejected the request.» und darunter die Meldung der API, mit ihrem Reason und der
request_id.
Bei einem zurückgebuchten Einzug gelangt man nicht mehr hierher: Seit Version 1.1.4 bietet der Konnektor die Schaltfläche nicht an, wenn die Zahlung in GoCardless nicht auf failed steht, und eine zurückgebuchte steht auf charged_back.
Was zu tun ist
- Erscheint die Schaltfläche nicht, prüfen Sie den Status der Transaktion, «Success+ Will Retry» und «GoCardless Retries»: Eine der Situationen in der Tabelle erklärt es.
- Sind es 3 Wiederholungen, sprechen Sie mit dem Kunden: Der Konnektor fordert keine weitere an.
- Ist das Mandat archiviert, fordern Sie ein neues an und ziehen Sie damit ein.
- Bei einem zurückgebuchten Einzug gibt es keine Schaltfläche: Sprechen Sie zuerst mit dem Kunden und ziehen Sie die Rechnung gegebenenfalls mit einem neuen Einzug erneut ein.
Kostet jede Wiederholung Geld?
Möglicherweise. Die Schaltfläche weist vorher darauf hin, bevor etwas gesendet wird, und der Konnektor bietet sie nicht an, solange Success+ den Einzug wiederholen wird, denn eine manuelle Wiederholung würde nur eine Gebühr hinzufügen. Die genauen Tarife hängen von Ihrem Vertrag mit GoCardless ab.
Kann ich einen vom Kunden zurückgebuchten Einzug wiederholen?
Mit dieser Schaltfläche nicht: Der Konnektor bietet sie bei einem zurückgebuchten Einzug nicht an, weil GoCardless nur fehlgeschlagene Zahlungen wiederholt und eine zurückgebuchte keine ist. Eine Rückbuchung, etwa mit MD06, löst man im Gespräch mit dem Kunden und gegebenenfalls mit einem neuen Einzug.
Mit unserem Konnektor
In Odoo 17, 18, 19 und 20 zählt der Konnektor die Wiederholungen anhand der GoCardless-Ereignisse und zeigt die Schaltfläche nur, wenn seine Regel es erlaubt: nicht bei laufendem Success+, nicht bei 3 Wiederholungen und nicht bei archiviertem Mandat. Kommt trotzdem retry_failed, prüft er das Mandat, bevor er Ihnen den Fehler anzeigt.
Weiterlesen
Geprüft im Quellcode des Connectors (Version 17.0, 18.0, 19.0 und 20.0) und in den verlinkten Quellen
Quellen
- docs.gocardless.com/docs/api-reference/payment
- docs.gocardless.com/docs/api-reference/responses-and-errors
- Quellcode des Moduls: flexigo_payment_gocardless: const.py, Zeile 119 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 680 in 17.0 (d203ee6), Zeile 680 in 18.0 (e2ab18b), Zeile 679 in 19.0 (ce7f5a3) und Zeile 703 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 449 in 17.0 (d203ee6), Zeile 449 in 18.0 (e2ab18b), Zeile 448 in 19.0 (ce7f5a3) und Zeile 463 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: const.py, Zeile 122 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 260 in 17.0 (d203ee6), Zeile 260 in 18.0 (e2ab18b), Zeile 260 in 19.0 (ce7f5a3) und Zeile 271 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: views/payment_transaction_views.xml, Zeile 13 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 63 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 418 in 17.0 (d203ee6), Zeile 418 in 18.0 (e2ab18b), Zeile 417 in 19.0 (ce7f5a3) und Zeile 432 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: views/payment_transaction_views.xml, Zeile 27 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: views/payment_transaction_views.xml, Zeile 28 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/de.po
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 729 in 17.0 (d203ee6), Zeile 729 in 18.0 (e2ab18b), Zeile 728 in 19.0 (ce7f5a3) und Zeile 752 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 713 in 17.0 (d203ee6), Zeile 713 in 18.0 (e2ab18b), Zeile 712 in 19.0 (ce7f5a3) und Zeile 736 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 430 in 17.0 (d203ee6), Zeile 430 in 18.0 (e2ab18b), Zeile 429 in 19.0 (ce7f5a3) und Zeile 444 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 437 in 17.0 (d203ee6), Zeile 437 in 18.0 (e2ab18b), Zeile 436 in 19.0 (ce7f5a3) und Zeile 451 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 442 in 17.0 (d203ee6), Zeile 442 in 18.0 (e2ab18b), Zeile 441 in 19.0 (ce7f5a3) und Zeile 456 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 435 in 17.0 (d203ee6), Zeile 435 in 18.0 (e2ab18b), Zeile 434 in 19.0 (ce7f5a3) und Zeile 449 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_token.py, Zeile 131 in 17.0 (d203ee6), Zeile 131 in 18.0 (e2ab18b), Zeile 131 in 19.0 (ce7f5a3) und Zeile 130 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 469 in 17.0 (d203ee6), Zeile 469 in 18.0 (e2ab18b), Zeile 468 in 19.0 (ce7f5a3) und Zeile 487 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 321 in 17.0 (d203ee6), Zeile 321 in 18.0 (e2ab18b), Zeile 321 in 19.0 (ce7f5a3) und Zeile 332 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_provider.py, Zeile 397 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_provider.py, Zeile 462 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 484 in 17.0 (d203ee6), Zeile 484 in 18.0 (e2ab18b), Zeile 483 in 19.0 (ce7f5a3) und Zeile 502 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 683 in 17.0 (d203ee6), Zeile 683 in 18.0 (e2ab18b), Zeile 682 in 19.0 (ce7f5a3) und Zeile 706 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 1016 in 17.0 (d203ee6), Zeile 1016 in 18.0 (e2ab18b), Zeile 1016 in 19.0 (ce7f5a3) und Zeile 1031 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 567 in 17.0 (d203ee6), Zeile 567 in 18.0 (e2ab18b), Zeile 567 in 19.0 (ce7f5a3) und Zeile 569 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 1063 in 17.0 (d203ee6), Zeile 1063 in 18.0 (e2ab18b), Zeile 1063 in 19.0 (ce7f5a3) und Zeile 1070 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 408 in 17.0 (d203ee6), Zeile 408 in 18.0 (e2ab18b), Zeile 408 in 19.0 (ce7f5a3) und Zeile 410 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 436 in 17.0 (d203ee6), Zeile 436 in 18.0 (e2ab18b), Zeile 436 in 19.0 (ce7f5a3) und Zeile 438 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 1083 in 17.0 (d203ee6), Zeile 1083 in 18.0 (e2ab18b), Zeile 1083 in 19.0 (ce7f5a3) und Zeile 1090 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 495 in 17.0 (d203ee6), Zeile 495 in 18.0 (e2ab18b), Zeile 495 in 19.0 (ce7f5a3) und Zeile 497 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 1022 in 17.0 (d203ee6), Zeile 1022 in 18.0 (e2ab18b), Zeile 1022 in 19.0 (ce7f5a3) und Zeile 1037 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 560 in 17.0 (d203ee6), Zeile 560 in 18.0 (e2ab18b), Zeile 560 in 19.0 (ce7f5a3) und Zeile 562 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 1481 in 17.0 (d203ee6), Zeile 1481 in 18.0 (e2ab18b), Zeile 1481 in 19.0 (ce7f5a3) und Zeile 1488 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 1233 in 17.0 (d203ee6), Zeile 1233 in 18.0 (e2ab18b), Zeile 1233 in 19.0 (ce7f5a3) und Zeile 1240 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 521 in 17.0 (d203ee6), Zeile 521 in 18.0 (e2ab18b), Zeile 521 in 19.0 (ce7f5a3) und Zeile 523 in 20.0 (688d86b)
- Quellcode des Moduls: flexigo_payment_gocardless: __manifest__.py, Zeile 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/events/payment
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
