Coinland Payمستندات

خطاها

یک قالب واحد برای هر خطا، و معنای هر کد PAY_ و MERCHANT_

هر پاسخ غیر ۲xx از کوین‌لند پی همین شکل را دارد:

{
  "statusCode": 422,
  "errors": {
    "error": ["PAY_CURRENCY_NOT_ACCEPTED"]
  }
}

errors.error آرایه‌ای از کدهای ماشینیِ پایدار با قالب UPPER_SNAKE است. هیچ پیام خوانا، در هیچ زبانی، در هیچ جای پاسخ وجود ندارد — و این عامدانه است: مشتریان شما متن شما را می‌خوانند، نه متن ما. کد را به جمله‌ای که خودتان نوشته‌اید نگاشت کنید، به زبانی که مشتری شما صحبت می‌کند.

کدها فقط افزوده می‌شوند. کدی که منتشر شود هرگز معنایش تغییر نمی‌کند و هرگز تغییر نام نمی‌دهد، چون ترجمه‌ها و هشدارهای شما بر پایه آن‌ها ساخته شده‌اند. کدهای تازه می‌توانند ظاهر شوند، پس برای کدهایی که مدیریت می‌کنید شاخه بگذارید و بقیه را به یک پیام عمومی بسپارید.

خواندن قالب خطا

const res = await fetch(url, init);
if (!res.ok) {
  const body = await res.json().catch(() => null);
  const code = body?.errors?.error?.[0] ?? "UNKNOWN";
  throw new CoinlandPayError(code, res.status);
}

دو نکته که ارزش دارد بر پایه‌شان بسازید:

  • آرایه می‌تواند بیش از یک کد داشته باشد. خطاهای اعتبارسنجی ممکن است چند کد را یک‌جا گزارش کنند. اولی را برای شاخه‌بندی بگیرید و همه را ثبت کنید.
  • تنها بر پایه کد وضعیت شاخه نگذارید. چند کد یک وضعیت مشترک دارند؛ کد قرارداد است و وضعیت جزئیات انتقال.

کدهای کوین‌لند پی

جلسه‌های پرداخت و پرداخت‌ها

کدHTTPمعناچه کاری کنید
PAY_SESSION_NOT_FOUND۴۰۴جلسه یا پرداختی با آن شناسه زیر حساب شما نیستشناسه را بررسی کنید. جلسه‌ای که به کسب‌وکار دیگری تعلق دارد هم عامدانه همین پاسخ را می‌گیرد
PAY_SESSION_EXPIRED۴۲۲مهلت جلسه پیش از تأیید مشتری گذشتجلسه تازه بسازید؛ چیزی رزرو نشده بود
PAY_SESSION_STATE۴۰۹این عمل در وضعیت فعلی جلسه مجاز نیست، مثلاً لغو یک جلسه تکمیل‌شدهجلسه را بخوانید و بر پایه status شاخه بگذارید
PAY_DUPLICATE_REFERENCE۴۰۹همان reference_id با محتوای متفاوت فرستاده شدشناسه تازه نسازید. یا همان محتوای اصلی را بفرستید، یا این را یک سفارش تازه بگیرید
PAY_CURRENCY_NOT_ACCEPTED۴۲۲ارزی در amounts در مجموعه پذیرفته‌شده شما نیست، در کل پلتفرم غیرفعال است، یا تومان است — این ریل فقط رمزارز استaccepted_currencies را در زمان راه‌اندازی از GET /me بخوانید و ارزها را در کد ثابت نکنید
PAY_AMOUNT_INVALID۴۲۲غیرمثبت، ارقام اعشار بیش از حد آن ارز، یا بیرون از محدوده‌های پلتفرم — همچنین وقتی درخواست ساخت جلسه هم amounts و هم price_usd را بفرستد، یا هیچ‌کدام رامبالغ را به‌صورت رشته اعشاری و با دقت خودِ آن ارز قالب‌بندی کنید، و دقیقاً یکی از amounts یا price_usd را بفرستید
PAY_RATE_UNAVAILABLE۵۰۳price_usd فرستاده شده اما همین حالا هیچ ارز پذیرفته‌شده‌ای قابل قیمت‌گذاری نیستدوباره تلاش کنید؛ خودِ درخواست مشکلی ندارد
PAY_SELF_PAYMENT۴۲۲حسابی که می‌خواهد پرداخت کند همان کسب‌وکاری است که جلسه را ساختهچیزی در کد شما برای اصلاح نیست؛ یک کسب‌وکار نمی‌تواند به خودش پرداخت کند
PAY_RECEIPT_INVALID۴۲۲اعتبارسنجی رسید ناموفق بود: امضای نادرست، محتوای تغییریافته، یا پرداخت ناشناسرسید را نامعتبر بگیرید. یک کد هر سه را پوشش می‌دهد تا تلاش جعل چیزی یاد نگیرد

ارسال دوباره و عیناً یکسانِ POST /sessions خطا نیست: همان reference_id با همان محتوا، جلسه اصلی را با وضعیت موفق برمی‌گرداند. تنها محتوای تغییریافته PAY_DUPLICATE_REFERENCE را ایجاد می‌کند. جلسه‌های پرداخت را ببینید.

پرداخت به مشتری و بازپرداخت

این‌ها از جهت پرداخت به مشتری می‌آیند و به کلیدی از کلاس پرداخت به مشتری نیاز دارند.

کدHTTPمعناچه کاری کنید
MERCHANT_PAYOUTS_DISABLED۴۰۳پرداخت به مشتری برای کسب‌وکار شما مسلح نیست، یا مسیر جست‌وجوی ایمیل برایتان فعال نشدهبا کوین‌لند تماس بگیرید. یک کد، هم ریل غیرفعال و هم کسب‌وکار معلق و هم روشن‌نبودن پرداخت و هم تنظیم‌نشدن سقف‌ها را پوشش می‌دهد — راه‌حل یکی است
PAY_WRONG_KEY_KIND۴۰۳کلید پرداخت‌گیری روی مسیر پرداخت به مشتری به کار رفته، یا برعکساز کلید کلاس دیگر استفاده کنید. خودِ کلید معتبر است و به همین دلیل این خطا UNAUTHORIZED نیست
PAY_RECIPIENT_INVALID۴۲۲گیرنده قابل پرداخت نیست، یا درخواست هر دو مسیر گیرنده را فرستاده، یا هیچ‌کدامpayer_id را بررسی کنید یا جست‌وجو را تکرار کنید. یک کد، نشانی ناشناس و حساب غیرواجد شرایط و توکن منقضی یا متعلق به کسب‌وکار دیگر و recipient_confirm ناهم‌خوان را پوشش می‌دهد تا نشود با این اندپوینت فهمید چه کسی حساب دارد
PAY_PAYOUT_LIMIT۴۲۲عبور از بیشینه هر پرداخت یا سقف ۲۴ ساعت گذشتهپرداخت را در چند روز بشکنید، منتظر پایان بازه بمانید، یا از کوین‌لند افزایش سقف بخواهید
PAY_REFUND_EXCEEDS_PAYMENT۴۲۲جمع بازپرداخت‌ها از charged_amount آن پرداخت عبور می‌کندجمع بازپرداخت‌های خودتان از آن پرداخت را با charged_amount مقایسه کنید و فقط باقی‌مانده را بازپرداخت کنید
PAY_LOOKUP_THROTTLED۴۲۹سهمیه جست‌وجوی گیرنده در آن دقیقه یا آن روز تمام شده استروی جست‌وجو عقب بکشید. پرداخت با payer_id تأثیری نمی‌گیرد

کدهای INSUFFICIENT_BALANCE (۴۲۲) و PAY_RATE_UNAVAILABLE (۵۰۳) هم روی این سطح دیده می‌شوند: اولی وقتی کیف‌پول کسب‌وکارتان amount + fee را پوشش نمی‌دهد، و دومی وقتی ارز نرخ زنده دلاری ندارد و در نتیجه سقف‌ها قابل اعمال نیستند. پرداخت رد می‌شود، نه اینکه بدون سنجش برود.

اتصال هویت مشتری

این‌ها از اتصال هویت پرداخت‌کننده می‌آیند: شیء الزامی customer روی هر جلسه، و پیوند دائمی میان customer.id شما و حساب کوین‌لند پرداخت‌کننده.

کدHTTPمعناچه کاری کنید
PAY_CUSTOMER_REQUIRED۴۲۲POST /sessions بدون شیء customer فراخوانی شددر هر فراخوانی ساخت، customer.id و customer.name و customer.email را بفرستید. این شیء برای هر کسب‌وکاری الزامی است و راهی برای انصراف ندارد
PAY_BINDING_REQUIRED۴۰۳پرداخت‌کننده پیش از آنکه فرایند اتصال او را متصل کند خواست پرداخت را تأیید کندسمت ویجت است؛ پرداخت‌کننده اول فرایند را کامل می‌کند. چیزی در کد شما برای اصلاح نیست
PAY_BINDING_REVIEW۴۰۳اتصال در انتظار بررسی شماست، پس پرداخت رد می‌شوددر زبانه «مشتریان» کنسول یا با POST /customers/{id}/binding/review تأیید یا رد کنید
PAY_BINDING_MISMATCH۴۰۳حساب کوین‌لندی که وارد شده همانی نیست که به این customer.id متصل استمشتری با حساب متصل‌شده وارد شود — یا اگر پیوند واقعاً اشتباه است، شما اتصال را قطع کنید
PAY_BINDING_CONFLICT۴۰۹این customer.id یا آن حساب کوین‌لند همین حالا یک اتصال زنده دارداتصال را بخوانید و تصمیم بگیرید؛ اگر پیوند موجود اشتباه است اول قطعش کنید
PAY_BINDING_STATE۴۰۹این عمل در وضعیت فعلی اتصال مجاز نیست، مثلاً بررسی یک اتصال فعالاتصال را بخوانید و بر پایه status شاخه بگذارید

مرحله تأیید پرداخت ممکن است TOTP_REQUIRED، TOTP_NOT_ENROLLED یا TOTP_INVALID هم پاسخ بدهد — همان گام دوعاملی که هر پرداختی دارد، هم‌سطح امنیتی یک برداشت. این‌ها داخل ویجت به پرداخت‌کننده نشان داده می‌شوند و هرگز به یکپارچه‌سازی شما نمی‌رسند.

حساب کسب‌وکار شما

کدHTTPمعناچه کاری کنید
MERCHANT_NOT_FOUND۴۰۴حسابی که این کلید به آن تعلق دارد یک کسب‌وکار نیستاز پشتیبانی کوین‌لند ارتقای حساب را بخواهید
MERCHANT_DISABLED۴۰۳این کسب‌وکار در حال حاضر نمی‌تواند پرداخت بگیردبا کوین‌لند تماس بگیرید. یک کد هم کسب‌وکار معلق و هم ریل غیرفعال در کل پلتفرم را پوشش می‌دهد؛ تفکیک آن‌ها فقط برای اپراتور است، چون راه‌حل یکی است
MERCHANT_KEY_LIMIT۴۲۲سقف کلیدهای API فعال پر شده استپیش از ساخت کلید تازه، یکی را در کنسول کسب‌وکار باطل کنید
MERCHANT_WEBHOOK_URL_INVALID۴۲۲https نیست، غیرقابل‌تحلیل است، یا به یک آدرس خصوصی اشاره می‌کنداز یک نشانی https قابل دسترسی از اینترنت عمومی استفاده کنید
MERCHANT_LOGO_INVALID۴۲۲لوگوی بارگذاری‌شده بیرون از فهرست مجاز نوع یا اندازه استمحدودیت‌های نمایش‌داده‌شده در کنسول را ببینید
MERCHANT_CONVERT_TARGET_INVALID۴۲۲ارز مقصد تبدیل خودکار در فهرست مقصدهای مجاز کوین‌لند نیستیکی از مقصدهایی را که کنسول پیشنهاد می‌دهد انتخاب کنید
MERCHANT_EXISTS۴۰۹ارتقا روی حسابی انجام شد که پیش از این کسب‌وکار بودهکاری لازم نیست؛ حساب شما ارتقا یافته است

پنج مورد آخر از کنسول کسب‌وکار می‌آیند، نه از API کسب‌وکار. اینجا فهرست شده‌اند چون کنسول و API یک قالب خطا و یک فهرست کد مشترک دارند، پس کدی که در مرورگر می‌بینید همان معنایی را دارد که روی API داشت.

MERCHANT_DISABLED کدی نیست که با تلاش مجدد رد شود

یعنی کوین‌لند پرداخت‌های شما را خاموش کرده است، یا مخصوص کسب‌وکار شما یا در کل پلتفرم. تلاش مجدد آن را برطرف نمی‌کند. برای مشتریانتان یک حالت «موقتاً در دسترس نیست» نشان دهید و با ما تماس بگیرید.

کدهای عمومی

این‌ها در سطح پلتفرم هستند و هر اندپوینتی می‌تواند برگرداندشان.

کدHTTPمعنا
UNAUTHORIZED۴۰۱کلید API غایب، بدشکل، باطل‌شده یا ناشناس. یک کد برای هر رد شدن در لایه احراز هویت، تا فراخواننده نتواند بفهمد کدام بخش اشتباه بوده
FORBIDDEN۴۰۳احراز هویت شده، اما مجاز نیست
VALIDATION_FAILED۴۲۲بدنه درخواست از اعتبارسنجی طرح‌واره رد شد: فیلد الزامی جاافتاده، نوع نادرست، رشته بیش از حد بلند
RATE_LIMITED۴۲۹درخواست بیش از حد. پیش از تلاش مجدد با تأخیر تصادفی عقب بکشید
NOT_FOUND۴۰۴چنین مسیری وجود ندارد
CONFLICT۴۰۹تضاد وضعیت عمومی، جایی که کد مشخص‌تری کاربرد ندارد
INTERNAL_SERVER_ERROR۵۰۰چیزی در سمت ما شکست خورد
SERVICE_UNAVAILABLE۵۰۳موقتاً قادر به پاسخ‌دهی نیست. با عقب‌نشینی تلاش کنید
MAINTENANCE_MODE۵۰۳کوین‌لند در حالت تعمیرات است. خواندن و نوشتن هر دو خاموش‌اند

کدام خطاها را دوباره تلاش کنیم

وضعیتتلاش مجدد؟
وقفه زمانی یا قطع اتصالبله، با همان reference_id. ایدمپوتنسی برای همین است
429 RATE_LIMITEDبله، پس از عقب‌نشینی با تأخیر تصادفی
500، 502، 503بله، با عقب‌نشینی نمایی
هر ۴xx دیگرنه. درخواست نادرست است؛ تلاش مجدد بدون تغییر همان پاسخ را می‌دهد

وقفه زمانی یک شکست نیست

به شما نمی‌گوید جلسه ساخته شده یا نه. همان درخواست را عیناً و با همان reference_id دوباره بفرستید: اگر انجام شده بود جلسه اصلی را می‌گیرید و اگر نشده بود یک جلسه تازه. ساختن یک شناسه تازه به‌جای آن، همان کاری است که یک سفارش را به دو جلسه پرداخت می‌رساند.

نگاشت کدها به متن خودتان

نگاشت را در یک جا و بر پایه کد نگه دارید، با یک حالت پیش‌فرض:

const MESSAGES = {
  PAY_SESSION_EXPIRED: "این پرداخت منقضی شده است. برای گرفتن یک پرداخت تازه دوباره شروع کنید.",
  PAY_CURRENCY_NOT_ACCEPTED: "در حال حاضر نمی‌توانیم این ارز را بپذیریم.",
  PAY_AMOUNT_INVALID: "مبلغ سفارش مشکلی دارد.",
  MERCHANT_DISABLED: "پرداخت با کوین‌لند در حال حاضر در دسترس نیست.",
  RATE_LIMITED: "تلاش‌های بیش از حد. یک دقیقه دیگر امتحان کنید.",
};

// کدی که هرگز ندیده‌اید هم باید یک جمله تولید کند، چون کدهای تازه بدون تغییر
// نسخه منتشر می‌شوند.
export const messageFor = (code) => MESSAGES[code] ?? "پرداخت انجام نشد.";

هر چیزی که به مشتری نشان می‌دهید، کد خام را در کنار شناسه درخواست خودتان ثبت کنید. وقتی با پشتیبانی کوین‌لند تماس می‌گیرید، کد به‌همراه شناسه جلسه یا پرداخت برای پیدا کردن دقیق آن رویداد کافی است.

در این صفحه