From 78ecd0b7c88d21343e3875556c7adf4348c42f38 Mon Sep 17 00:00:00 2001 From: David Brownman Date: Fri, 10 Jul 2026 12:41:53 -0700 Subject: [PATCH] make api error fields generated --- stripe/_error_object.py | 71 ++++++++++++++++++++++++++++++++++++++++- tests/test_error.py | 32 +++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/stripe/_error_object.py b/stripe/_error_object.py index 9221218be..4cc563123 100644 --- a/stripe/_error_object.py +++ b/stripe/_error_object.py @@ -5,24 +5,85 @@ from stripe._api_mode import ApiMode if TYPE_CHECKING: + # errorImports: The beginning of the section generated from our OpenAPI spec from stripe._payment_intent import PaymentIntent + from stripe._payment_method import PaymentMethod from stripe._setup_intent import SetupIntent from stripe._source import Source - from stripe._payment_method import PaymentMethod + # errorImports: The end of the section generated from our OpenAPI spec class ErrorObject(StripeObject): + # errorAnnotations: The beginning of the section generated from our OpenAPI spec + advice_code: Optional[str] + """ + For card errors resulting from a card issuer decline, a short string indicating [how to proceed with an error](https://docs.stripe.com/declines#retrying-issuer-declines) if they provide one. + """ charge: Optional[str] + """ + For card errors, the ID of the failed charge. + """ code: Optional[str] + """ + For some errors that could be handled programmatically, a short string indicating the [error code](https://docs.stripe.com/error-codes) reported. + """ decline_code: Optional[str] + """ + For card errors resulting from a card issuer decline, a short string indicating the [card issuer's reason for the decline](https://docs.stripe.com/declines#issuer-declines) if they provide one. + """ doc_url: Optional[str] + """ + A URL to more information about the [error code](https://docs.stripe.com/error-codes) reported. + """ message: Optional[str] + """ + A human-readable message providing more details about the error. For card errors, these messages can be shown to your users. + """ + network_advice_code: Optional[str] + """ + For card errors resulting from a card issuer decline, a 2 digit code which indicates the advice given to merchant by the card network on how to proceed with an error. + """ + network_decline_code: Optional[str] + """ + For payments declined by the network, an alphanumeric code which indicates the reason the payment failed. + """ param: Optional[str] + """ + If the error is parameter-specific, the parameter related to the error. For example, you can use this to display a message near the correct form field. + """ payment_intent: Optional["PaymentIntent"] + """ + The PaymentIntent object for errors returned on a request involving a PaymentIntent. + """ payment_method: Optional["PaymentMethod"] + """ + The PaymentMethod object for errors returned on a request involving a PaymentMethod. + """ + payment_method_type: Optional[str] + """ + If the error is specific to the type of payment method, the payment method type that had a problem. This field is only populated for invoice-related errors. + """ + request_log_url: Optional[str] + """ + A URL to the request log entry in your dashboard. + """ setup_intent: Optional["SetupIntent"] + """ + The SetupIntent object for errors returned on a request involving a SetupIntent. + """ source: Optional["Source"] + """ + The PaymentSource object for errors returned on a request involving a PaymentSource. + """ type: str + """ + The type of error returned. One of `api_error`, `card_error`, `idempotency_error`, or `invalid_request_error` + """ + user_message: Optional[str] + """ + The user message associated with the error. + """ + # errorAnnotations: The end of the section generated from our OpenAPI spec def refresh_from( self, @@ -63,17 +124,25 @@ def _refresh_from( # values here to facilitate generic error handling. values = merge_dicts( { + # errorDefaults: The beginning of the section generated from our OpenAPI spec + "advice_code": None, "charge": None, "code": None, "decline_code": None, "doc_url": None, "message": None, + "network_advice_code": None, + "network_decline_code": None, "param": None, "payment_intent": None, "payment_method": None, + "payment_method_type": None, + "request_log_url": None, "setup_intent": None, "source": None, "type": None, + "user_message": None, + # errorDefaults: The end of the section generated from our OpenAPI spec }, values, ) diff --git a/tests/test_error.py b/tests/test_error.py index f8cfc404f..73de812ac 100644 --- a/tests/test_error.py +++ b/tests/test_error.py @@ -54,6 +54,38 @@ def test_error_object(self): assert err.error.code == "some_error" assert err.error.charge is None + def test_error_object_network_advice_code(self): + err = StripeError( + "message", + json_body={ + "error": { + "type": "card_error", + "network_advice_code": "02", + } + }, + ) + assert err.error is not None + assert err.error.network_advice_code == "02" + + def test_error_object_payment_intent(self): + err = StripeError( + "message", + json_body={ + "error": { + "type": "card_error", + "payment_intent": { + "id": "pi_123", + "object": "payment_intent", + "amount": 1000, + }, + } + }, + ) + assert err.error is not None + assert err.error.payment_intent is not None + assert err.error.payment_intent.id == "pi_123" + assert err.error.payment_intent.amount == 1000 + def test_error_object_not_dict(self): err = StripeError("message", json_body={"error": "not a dict"}) assert err.error is None