Fix some for sign body to montify and not get 401 error|

This commit is contained in:
mahmood
2026-07-27 01:36:02 +03:30
parent 815da9896d
commit 933424ddfc
8 changed files with 381 additions and 36 deletions
+12
View File
@@ -130,9 +130,18 @@ Auth مشتری: `auth:customer` + `customer.active` (به‌جز return/webhook
|-----|------|------|-----|
| GET | `/wallet/payment/options` | مشتری | `{ online_enabled }` |
| POST | `/wallet/payment/initiate` | مشتری | Body: `{ value }` (ریال) → `{ payment_url }` |
| POST | `/wallet/payment/verify-return` | مشتری | verify امضای بازگشت + شارژ |
| GET | `/wallet/payment/status` | مشتری | `?reference_id=WD-123` → استعلام مستقیم از درگاه |
| GET | `/wallet/payment/return/{provider}` | عمومی | برگشت مرورگر؛ verify + گزارش |
| POST | `/wallet/payment/webhook/{provider}` | عمومی (HMAC) | شارژ کیف |
### verify-return و status
- فرانت **همه** پارامترهای query صفحه بازگشت را بدون فیلتر می‌فرستد؛ حذف حتی یک پارامتر امضا را می‌شکند.
- سرور امضا را با چند قالب payload می‌سنجد (مقادیر string، بدون مقادیر خالی، `amount`/`timestamp` عددی) تا اختلاف‌های جزئی پیاده‌سازی پارتنر باعث رد شدن پرداخت واقعی نشود. دستکاری مقادیر همچنان رد می‌شود.
- اگر امضا نخواند یا نتیجه هنوز قطعی نباشد، سرور `GET /external-payment/status` را از Montify می‌پرسد (`SupportsStatusQuery`) و در صورت `paid` کیف را idempotent شارژ می‌کند. redirect مرورگر هیچ‌وقت منبع حقیقت نیست.
- مالکیت `Withdraw` قبل از هر پاسخی با کاربر لاگین‌شده تطبیق داده می‌شود.
### سازگاری قدیمی
| مسیر قدیمی | معادل |
@@ -263,6 +272,8 @@ app/Http/Controllers/pay/
| `مشکل در ارتباط با درگاه` | ساعت سرور (NTP)، `stableStringify`، PATH دقیق، body خام همان hash |
| شارژ دوبل | باید idempotent باشد (`sts=2` + lock) |
| secret در Network | مسیر باید `api/get_settings` باشد نه admin؛ فیلتر `Setting::forPublicApi` |
| `امضای نامعتبر` در verify-return | `php artisan montify:check-return "<کل URL بازگشت>"` را روی سرور بزنید؛ خروجی نشان می‌دهد کدام قالب می‌خواند یا اینکه `client_secret` غلط است. لاگ `montify.return_invalid_signature` هم کلیدهای دریافتی را دارد |
| پرداخت موفق ولی کیف شارژ نشد | `GET /wallet/payment/status?reference_id=WD-…`؛ لاگ `montify.status_failed` و رسیدن webhook را بررسی کنید |
جزئیات امضای HMAC و خطاهای Montify: [`EXTERNAL_PAYMENT_PARTNER.md`](./EXTERNAL_PAYMENT_PARTNER.md)
@@ -275,6 +286,7 @@ server/docs/WALLET_ONLINE_PAYMENT.md ← این سند
server/docs/EXTERNAL_PAYMENT_PARTNER.md ← پروتکل Montify
server/app/Services/Payment/...
server/app/Http/Controllers/pay/WalletPaymentController.php
server/app/Console/Commands/MontifyCheckReturnCommand.php ← عیب‌یابی امضای بازگشت
server/routes/customer.php
server/app/Models/Setting.php ← فیلتر secret
server/database/migrations/2026_07_24_000001_add_external_payment_settings.php