fix: honor PayKilla invoice currency

This commit is contained in:
3252a8
2026-06-04 15:24:23 +03:00
parent cd4b40af6b
commit 8d6f91b292
5 changed files with 30 additions and 7 deletions
+13 -4
View File
@@ -396,7 +396,7 @@ class PaykillaService(HttpClientMixin):
@property
def currency(self) -> str:
return (self.config.CURRENCY or "RUB").upper()
return normalize_payment_currency_code(self.config.CURRENCY or "RUB")
@property
def verify_webhook_signature(self) -> bool:
@@ -416,7 +416,7 @@ class PaykillaService(HttpClientMixin):
currency: Optional[str],
description: str,
) -> Dict[str, Any]:
currency_code = normalize_payment_currency_code(currency or self.currency)
currency_code = self.currency
invoice_text = _invoice_text(getattr(self.settings, "WEBAPP_TITLE", None), payment_db_id)
body: Dict[str, Any] = {
"type": _invoice_type_for(self.config, currency_code),
@@ -449,7 +449,8 @@ class PaykillaService(HttpClientMixin):
logging.error("PaykillaService is not configured. Cannot create payment link.")
return False, {"message": "service_not_configured"}
currency_code = normalize_payment_currency_code(currency or self.currency)
payment_currency = normalize_payment_currency_code(currency or self.currency)
currency_code = self.currency
supported = parse_supported_currency_codes(self.config.SUPPORTED_CURRENCIES)
if supported and currency_code not in supported:
return False, {
@@ -457,6 +458,13 @@ class PaykillaService(HttpClientMixin):
"currency": currency_code,
"supported_currencies": list(supported),
}
if payment_currency and payment_currency != currency_code:
logging.info(
"Paykilla create_payment_link: using configured invoice currency %s "
"instead of payment record currency %s; amount is sent unchanged.",
currency_code,
payment_currency,
)
body = self._invoice_body(
payment_db_id=payment_db_id,
@@ -986,7 +994,8 @@ _CONFIG_MANIFEST = (
"string",
"Invoice currency",
description=(
"Fiat or crypto invoice currency. FIAT_BASED is selected for RUB/USD/EUR/AED/GBP."
"PayKilla invoice currency. Amount is sent unchanged, so keep tariffs "
"priced in this currency or use a PayKilla-enabled fiat such as USD."
),
placeholder="RUB",
subsection="PayKilla",
+1 -1
View File
@@ -376,7 +376,7 @@ Webhook настраивается в PayKilla Dashboard: **Settings -> Webhooks
| `PAYKILLA_WIDGET_URL` | URL hosted checkout, по умолчанию `https://gopay.paykilla.com`. |
| `PAYKILLA_API_KEY` / `PAYKILLA_V2_API_KEY` | Public HMAC key с правом `INVOICE`. |
| `PAYKILLA_SECRET_KEY` / `PAYKILLA_V2_SECRET_KEY` | Secret HMAC key для подписи API-запросов и проверки webhook. |
| `PAYKILLA_CURRENCY` | Валюта инвойса. Для RUB/USD/EUR/AED/GBP используется `FIAT_BASED`, для остальных - `FIXED_AMOUNT`. |
| `PAYKILLA_CURRENCY` | Валюта инвойса PayKilla. Сумма отправляется без FX-конвертации, поэтому цены должны быть в этой валюте или валюта должна быть включена у PayKilla. Для RUB/USD/EUR/AED/GBP используется `FIAT_BASED`, для остальных - `FIXED_AMOUNT`. |
| `PAYKILLA_PAYMENT_CURRENCIES` | Crypto tickers для оплаты, например `USDTTRC,BTC,ETH`. |
| `PAYKILLA_SUPPORTED_CURRENCIES` | Валюты инвойса, разрешенные в этом магазине. |
| `PAYKILLA_INVOICE_TYPE` | Необязательный override: `FIAT_BASED`, `FIXED_AMOUNT` или `OPEN_AMOUNT`. |
+1 -1
View File
@@ -181,7 +181,7 @@ PayKilla строго валидирует текстовые поля invoice.
1. Включите `PAYKILLA_ENABLED`.
2. Укажите `PAYKILLA_API_KEY` и `PAYKILLA_SECRET_KEY`.
3. Проверьте `PAYKILLA_CURRENCY` и `PAYKILLA_PAYMENT_CURRENCIES`, например `USDTTRC,BTC,ETH`.
3. Проверьте `PAYKILLA_CURRENCY` и `PAYKILLA_PAYMENT_CURRENCIES`, например `USD` и `USDTTRC,BTC,ETH`. `PAYKILLA_CURRENCY` теперь напрямую задаёт валюту invoice; Minishop не конвертирует сумму между RUB/USD/EUR.
4. Убедитесь, что webhook `/webhook/paykilla` настроен в PayKilla: Minishop не отправляет redirect URLs в PayKilla и полагается на webhook для активации платежа.
5. Добавьте `paykilla` в `PAYMENT_METHODS_ORDER`, если хотите задать явный порядок кнопок.
@@ -3975,7 +3975,7 @@
"section_order": 4,
"subsection": "PayKilla",
"label": "Invoice currency",
"description": "Fiat or crypto invoice currency. FIAT_BASED is selected for RUB/USD/EUR/AED/GBP.",
"description": "PayKilla invoice currency. Amount is sent unchanged, so keep tariffs priced in this currency or use a PayKilla-enabled fiat such as USD.",
"i18n_label_key": "admin_settings_field_paykilla_currency_label",
"i18n_description_key": "admin_settings_field_paykilla_currency_description",
"i18n_subsection_key": "admin_settings_subsection_paykilla",
+14
View File
@@ -260,6 +260,20 @@ class PaykillaServiceTests(unittest.TestCase):
self.assertRegex(body["purpose"], r"^[A-Za-z0-9_\s.,]+$")
self.assertNotIn("urls", body)
def test_invoice_body_uses_configured_paykilla_currency(self):
service = self._make_service()
service.config.CURRENCY = "USD"
body = service._invoice_body(
payment_db_id=556,
amount=100,
currency="RUB",
description="ignored",
)
self.assertEqual(body["currency"], "USD")
self.assertEqual(body["type"], "FIAT_BASED")
def test_invoice_body_omits_redirect_urls(self):
service = self._make_service()