Добавлено сохранение заказов в postgres
This commit is contained in:
@@ -88,9 +88,10 @@ class TBankAdapter:
|
||||
)
|
||||
|
||||
if 400 <= response.status_code < 500:
|
||||
raise TBankPaymentRequestError(
|
||||
"TBank payment init request was rejected with status "
|
||||
f"{response.status_code}."
|
||||
raise _build_tbank_request_error(
|
||||
"TBank payment init request was rejected.",
|
||||
status_code=response.status_code,
|
||||
payload=_response_json_or_none(response),
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -134,7 +135,10 @@ class TBankAdapter:
|
||||
)
|
||||
|
||||
if payload.get("Success") is False:
|
||||
raise TBankPaymentRequestError("TBank payment init request was rejected.")
|
||||
raise _build_tbank_request_error(
|
||||
"TBank payment init request was rejected.",
|
||||
payload=payload,
|
||||
)
|
||||
|
||||
payment_url = payload.get("PaymentURL")
|
||||
if not isinstance(payment_url, str) or not payment_url.strip():
|
||||
@@ -155,3 +159,71 @@ def _build_tbank_token(payload: dict[str, Any], *, password: str) -> str:
|
||||
str(token_payload[key]) for key in sorted(token_payload)
|
||||
)
|
||||
return hashlib.sha256(token_source.encode("utf-8")).hexdigest()
|
||||
|
||||
|
||||
def _response_json_or_none(response: httpx.Response) -> object | None:
|
||||
try:
|
||||
return response.json()
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
|
||||
|
||||
def _build_tbank_request_error(
|
||||
message: str,
|
||||
*,
|
||||
status_code: int | None = None,
|
||||
payload: object | None = None,
|
||||
) -> TBankPaymentRequestError:
|
||||
error_code = _payload_text_value(payload, "ErrorCode")
|
||||
provider_message = _payload_text_value(payload, "Message")
|
||||
details = _payload_text_value(payload, "Details")
|
||||
return TBankPaymentRequestError(
|
||||
_format_tbank_request_error_message(
|
||||
message,
|
||||
status_code=status_code,
|
||||
error_code=error_code,
|
||||
provider_message=provider_message,
|
||||
details=details,
|
||||
),
|
||||
status_code=status_code,
|
||||
error_code=error_code,
|
||||
provider_message=provider_message,
|
||||
details=details,
|
||||
)
|
||||
|
||||
|
||||
def _payload_text_value(payload: object | None, key: str) -> str | None:
|
||||
if not isinstance(payload, dict):
|
||||
return None
|
||||
|
||||
value = payload.get(key)
|
||||
if value is None:
|
||||
return None
|
||||
|
||||
text = str(value).strip()
|
||||
if not text:
|
||||
return None
|
||||
return text
|
||||
|
||||
|
||||
def _format_tbank_request_error_message(
|
||||
message: str,
|
||||
*,
|
||||
status_code: int | None,
|
||||
error_code: str | None,
|
||||
provider_message: str | None,
|
||||
details: str | None,
|
||||
) -> str:
|
||||
fields: list[str] = []
|
||||
if status_code is not None:
|
||||
fields.append(f"status_code={status_code}")
|
||||
if error_code is not None:
|
||||
fields.append(f"error_code={error_code}")
|
||||
if provider_message is not None:
|
||||
fields.append(f"message={provider_message}")
|
||||
if details is not None:
|
||||
fields.append(f"details={details}")
|
||||
|
||||
if not fields:
|
||||
return message
|
||||
return f"{message} {' '.join(fields)}"
|
||||
|
||||
Reference in New Issue
Block a user