مقدمه
سوپر اپلیکیشن مهراد
مهراد یک کیف پول دیجیتال با قابلیت مدیریت انواع دارایی است. کاربر میتواند داراییهای خود را در سایت، اپلیکیشن یا فروشگاه فیزیکی پذیرندگان خرج کند. این مجموعهمستندات، راهنمای پیادهسازی این ارتباط برای توسعهدهندگان پذیرنده است.
انتخاب مستند مناسب
بر اساس هدف پیادهسازی، یکی از مسیرهای زیر انتخاب میشود:
| هدف | مستند مربوطه | روش authentication |
|---|---|---|
| ورود کاربر مهراد به سایت پذیرنده بدون ثبتنام مجدد و دریافت اطلاعات پایهٔ او | مستندات SSO | کد موقت + امضای کلاینت |
| پرداخت سبد خرید کاربر در سایت پذیرنده با دارایی مهراد | مستندات سفارش | token SSO و/یا token اپلیکیشن پذیرنده |
| پرداخت مشتری در فروشگاه فیزیکی پذیرنده با اپلیکیشن مهراد | مستندات خرید حضوری | پنل پذیرنده یا token اپلیکیشن پذیرنده |
| ارسال requestهای محافظتشدهٔ سفارش از سرور پذیرنده | مستندات ارتباط پذیرندگان | token اپلیکیشن پذیرنده |
| صدور بستهٔ حمایتی برای کاربران توسط سازمان | مستندات ارتباط سازمانی | امضای دیجیتال request |
مسیر متداول یک پذیرندهٔ فروشگاهی، ترکیب SSO (ورود کاربر) و سفارش (پرداخت) است.
مدل کلی یکپارچهسازی
requestهای پذیرنده به API مهراد از سمت سرور ارسال میشوند و بسته به نوع عملیات، یکی از روشهای authentication زیر به کار میرود:
| روش | کاربرد | مستند مربوطه |
|---|---|---|
| SSO (ورود یکپارچه) | ورود کاربر مهراد به سایت پذیرنده و دریافت Access Token در زمینهٔ همان کاربر؛ برای دریافت اطلاعات کاربر و ایجاد پرداخت | مستندات SSO |
| token اپلیکیشن پذیرنده | token سرور-به-سرور مستقل از کاربر؛ برای تأیید پرداخت، عملیات بعدی سفارش و خرید حضوری | مستندات ارتباط پذیرندگان |
| امضای درخواست سازمانی | امضای هر request با کلید خصوصی سازمان؛ مخصوص ارتباط سازمانها | مستندات ارتباط سازمانی |
برخی عملیات، مانند خرید حضوری، از طریق رابط کاربری پنل پذیرنده نیز در دسترس هستند و در این حالت به پیادهسازی API نیاز ندارند.
آدرس سرویس
| محیط | آدرس پایه |
|---|---|
| عملیاتی (Production) | https://api.mehrad.app |
| تست (Staging) | https://dev-api.mehrad.app |
فرآیند دسترسی به محیط عملیاتی: پیادهسازی باید ابتدا بهطور کامل روی محیط تست (Staging) انجام شود. پس از ارائهٔ دمو و تأیید آن از سمت مهراد، دسترسی محیط عملیاتی (Production) در اختیار شما قرار میگیرد.
تمام pathهای این مستندات نسبت به همین آدرس پایه هستند؛ برای مثال POST /gateway/sso/token یعنی https://api.mehrad.app/gateway/sso/token.
هر آدرسی که API بازمیگرداند — مانند
payment_url،draft_urlیا آدرس بازگشت کاربر — باید دقیقاً به همان شکل استفاده شود. ساختار این آدرسها بخشی از قرارداد نیست و نباید توسط پذیرنده ساخته یا تغییر داده شود.
قالب responseها
بیشتر endpointها response را در یک پوشش استاندارد برمیگردانند:
{
"success": true,
"data": {},
"meta": null
}endpointهای استاندارد SSO (token، introspection، discovery و JWKS) و endpointهای اطلاعات کاربر، بنا بر استاندارد OpenID، response را بدون این پوشش و به صورت شیء مستقیم برمیگردانند. در هر بخش نمونهٔ دقیق response آمده است.
خطاها همیشه این ساختار را دارند:
{
"success": false,
"error": {
"code": "SSO_INVALID_GRANT",
"message": "کد موقت ورود نامعتبر است یا دیگر قابل استفاده نیست.",
"details": null
}
}مقدار code برای تصمیمگیری برنامهنویسی پایدار است؛ متن message برای نمایش به کاربر نهایی نوشته شده و ممکن است تغییر کند. منطق برنامه باید بر مبنای code پیادهسازی شود، نه بر مبنای متن پیام.
details در بیشتر خطاها null است. خطاهایی که در details اطلاعات تکمیلی دارند، در فهرست خطاهای هر مستند مشخص شدهاند. کد HTTP و کد خطای هر مورد به تفکیک endpoint در بخش «فهرست خطاها» هر مستند آمده است.
خطای اعتبارسنجی
اگر فیلدی از body، path یا query ارسال نشده باشد، نوع آن نادرست باشد یا مقدارش خارج از محدودهٔ مجاز باشد، response آن با کد ۴۲۲ و خطای VALIDATION_ERROR برگردانده میشود. در details، کلید هر عضو مسیر فیلد و مقدار آن فهرست پیامهای خطای همان فیلد است. مسیر فیلدهای تودرتو با . و اندیس آرایهها با عدد مشخص میشود؛ خطایی که به کل body مربوط است، کلید خالی ("") دارد.
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "بعضی فیلدها را اشتباه پر کردهاید یا مقدارشان خارج از محدودهٔ مجاز است.",
"details": {
"amount": ["Field required"],
"shipments.0.items.1.price": ["Input should be greater than 0"]
}
}
}پیامهای داخل details برای اشکالزدایی هستند و نباید به کاربر نهایی نمایش داده شوند.
خطاهای مشترک
خطاهای زیر در همهٔ مستندات مشترکاند و در فهرست خطاهای هر endpoint تکرار نمیشوند، مگر آنکه معنای خاصی داشته باشند:
| کد خطا | HTTP | توضیح و اقدام پیشنهادی |
|---|---|---|
| VALIDATION_ERROR | 422 | ساختار request نامعتبر است؛ جزئیات هر فیلد در details آمده است. |
| HTTP_EXCEPTION | 401 | در endpointهایی که token لازم دارند، header Authorization ارسال نشده یا قالب Bearer <token> ندارد. message در این حالت Not authenticated است. |
| FINANCIAL_OPERATIONS_FROZEN | 503 | عملیات مالی موقتاً متوقف شده است؛ request باید بعداً با همان مقادیر دوباره ارسال شود. این خطا فقط در ایجاد پرداخت، تأیید پرداخت، اصلاح و لغو سفارش و اعطای اعتبار برگردانده میشود. |
{
"success": false,
"error": {
"code": "FINANCIAL_OPERATIONS_FROZEN",
"message": "عملیات مالی بهطور موقت متوقف شده است؛ لطفاً بعداً دوباره تلاش کنید.",
"details": null
}
}مفاهیم مشترک
| مفهوم | توضیح |
|---|---|
| پذیرنده (Merchant) | کسبوکاری که کاربر مهراد در آن خرید میکند. |
| سرویس (Service) | نوع سرویسی که پذیرنده ارائه میدهد (مثلاً خرید کالا). دسترسیها و تنظیمات SSO برای هر ترکیب پذیرنده+سرویس جداگانه تعریف میشود. |
| سفارش (Order) | یک خرید ثبتشده در مهراد. |
| تلاش پرداخت (Payment Attempt) | هر بار تلاش کاربر برای پرداخت یک سفارش. ID هر تلاش پرداخت authority نام دارد. |
| تأیید پرداخت (Verify) | مرحلهٔ نهایی که پذیرنده پرداخت را تأیید میکند و مبلغ برای او قطعی میشود. |
واحد مبلغ
همهٔ مبالغ در API عدد صحیح و به ریال هستند و باید به صورت عدد صحیح ارسال شوند.
نکات مشترک امنیتی
client_secret، کلید خصوصی و tokenها فقط باید روی سرور پذیرنده نگهداری شوند؛ نباید در اپلیکیشن موبایل، کد سمت مرورگر یاlocalStorageقرار گیرند.- requestهای حساس (ایجاد پرداخت، تأیید پرداخت، اصلاح و لغو سفارش) باید از سمت سرور پذیرنده ارسال شوند.