درگاه پرداخت اعتباری آمیوا
مشتریان شما بدون کارت اعتباری و بدون پرداخت نقدی، خرید را از سقف اعتبار شخصی خود میپردازند و بدهی آن را قسطی به آمیوا بازپرداخت میکنند. شما مبلغ خرید را کامل تسویه میگیرید. این صفحه تمام چیزی است که برای اتصال فروشگاه آنلاینتان لازم دارید: مرجع کامل API، امضای دیجیتال، وبهوک و افزونهٔ آمادهٔ ووکامرس با لوگوی آمیوا.
نشانی پایهٔ سرویس شما: https://87.107.12.84
درگاه اعتباری چیست
یک درگاه پرداخت با همان الگوی آشنای درگاههای بانکی: ساخت تراکنش، انتقال مشتری، بازگشت و تأیید نهایی. تفاوت در منبع پول است.
پرداخت از اعتبار، نه از کارت
مبلغ خرید از سقف اعتبار تأییدشدهٔ مشتری برداشت میشود و همان لحظه اقساط ماهانهٔ او ساخته میشود. مشتری نیازی به کارت اعتباری یا ضامن ندارد.
ریسک اعتباری با آمیوا است
اعتبارسنجی، وصول اقساط و پیگیری معوقات بر عهدهٔ آمیوا است. فروشگاه پس از تکمیل خرید بر اساس چرخهٔ تسویهٔ قرارداد خود، مبلغ را دریافت میکند.
یکپارچگی استاندارد
REST روی HTTPS، احراز هویت Bearer، بازگشت امضاشده با HMAC-SHA256 و وبهوک با بازتلاش. هر پلتفرم فروشگاهی که بتواند یک درخواست HTTP بزند قابل اتصال است.
این درگاه پول نقد جابهجا نمیکند
verify یا وبهوک معتبر، پرداختشده تلقی کنید.جریان پرداخت
پنج گام از لحظهٔ کلیک مشتری روی «پرداخت قسطی» تا ثبت نهایی سفارش.
- 1
ساخت نشست پرداخت روی سرور شما
سرور فروشگاه با کلید API خود درخواستPOST /api/v1/checkout-sessionsمیفرستد و مبلغ، مدت اقساط و نشانی بازگشت را میدهد. پاسخ شاملcheckoutUrlاست. - 2
انتقال مشتری به صفحهٔ پرداخت آمیوا
مرورگر مشتری را بهcheckoutUrlهدایت کنید. این صفحه میزبان آمیوا است؛ ورود، احراز هویت و نمایش اقساط آنجا انجام میشود و هیچ داده حساسی وارد سایت شما نمیشود. - 3
تأیید مشتری و برداشت از اعتبار
مشتری قسط ماهانه و جمع بازپرداخت را میبیند و تأیید میکند. برداشت از اعتبار و ساخت اقساط در یک تراکنش اتمیک انجام میشود؛ نشست پرداخت یکبارمصرف است. - 4
بازگشت امضاشده به فروشگاه
مشتری بهreturnUrlشما برمیگردد، همراه با پارامترهایsession_id،status،transaction_idوsign. - 5
تأیید نهایی سمت سرور
سرور شماPOST /api/v1/checkout-sessions/:id/verifyرا با مبلغ سفارش صدا میزند. فقط پاسخverified: trueمجوز تکمیل سفارش است. وبهوک هم بهعنوان مسیر پشتیبان همین نتیجه را میفرستد.
فروشگاه آمیوا مشتری
│ │ │
│ 1) POST /checkout-sessions │
├─────────────────────────▶│ │
│◀─── checkoutUrl ─────────┤ │
│ │ │
│ 2) redirect به checkoutUrl │
├───────────────────────────────────────────────────────▶
│ │◀── 3) تأیید پرداخت قسطی ───┤
│ │ │
│◀── 4) redirect به returnUrl (+sign) ───────────────────┤
│ │ │
│ 5) POST /:id/verify │ │
├─────────────────────────▶│ │
│◀─── verified: true ──────┤ │
│ │ │
│◀══ webhook (مسیر پشتیبان، مستقل از مرورگر) ═══════════│پیشنیازها و کلیدها
قبل از شروع پیادهسازی، این سه مورد را از پنل فروشگاه آماده کنید.
- 1
فروشگاه فعال
قرارداد فروشگاه باید تأیید و وضعیت آن ACTIVE باشد. درخواستهای فروشگاه غیرفعال با خطای ۴۰۱ رد میشوند. - 2
کلید API
از مسیر پنل فروشگاه ← درگاه پرداخت آنلاین کلید بسازید. مقدار کامل کلید (sk_live_…) فقط همان یکبار نمایش داده میشود؛ بعد از آن تنها پیشوند آن دیده میشود. ساخت کلید فقط برای نقش «مالک فروشگاه» مجاز است. اگر به این صفحه دسترسی ندارید، پشتیبانی آمیوا میتواند همین کلیدها را از پنل مدیریت برای فروشگاه شما بسازد. - 3
کلید امضا (Signing Secret)
مقدارwhsec_…که با ساخت اولین کلید API بهصورت خودکار ساخته میشود و در همان صفحهٔ «درگاه پرداخت آنلاین» قابل مشاهده و چرخش است. هم امضای وبهوک و هم پارامترsignدر بازگشت مشتری با همین کلید بررسی میشوند؛ با چرخش کلید، امضاهای قبلی بیاعتبار میشوند.
کلیدها را هرگز در سمت مرورگر قرار ندهید
احراز هویت
تمام درخواستهای API با هدر Authorization و کلید مخفی فروشگاه انجام میشوند.
Authorization: Bearer sk_live_XXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/jsonهر کلید مجموعهای از scopeها دارد. کلیدهای ساختهشده از پنل بهصورت پیشفرض هر دو scope زیر را دارند:
scopeهای کلید API
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
checkout:create | scope | اختیاری | ساخت نشست پرداخت و لغو نشست باز |
checkout:read | scope | اختیاری | خواندن وضعیت نشست و فراخوانی verify |
شناسنامهٔ فروشگاه
برای تست کلید و خواندن شرایط قرارداد، بدون ساخت هیچ نشست پرداختی.
/api/v1/merchantاعتبارسنجی کلید و دریافت شرایط فروشگاهاین تنها فراخوانیای است که هیچ اثر جانبی ندارد؛ برای دکمهٔ «تست اتصال» در پنل فروشگاهساز خود از همین مسیر استفاده کنید، نه از ساخت و لغو نشست آزمایشی.
{
"code": "10231",
"slug": "digikala-sample",
"name": "فروشگاه نمونه",
"status": "ACTIVE",
"allowedTenures": [3, 6, 12],
"minAmount": "500000",
"maxAmount": "80000000",
"webhookUrl": "https://shop.example.com/?wc-api=noqte_credit_webhook",
"webhookConfigured": true,
"scopes": ["checkout:create", "checkout:read"],
"checkoutBaseUrl": "https://87.107.12.84/pay",
"apiVersion": "v1"
}allowedTenures را پیش از ساخت نشست بخوانید و tenureMonths را از همان فهرست انتخاب کنید؛ مدت خارج از قرارداد هنگام ساخت نشست با خطای INVALID رد میشود. پاسخ ۴۰۱ یعنی کلید نامعتبر، لغوشده یا متعلق به فروشگاه غیرفعال است.ساخت نشست پرداخت
اولین و تنها فراخوانی لازم پیش از انتقال مشتری.
/api/v1/checkout-sessionsساخت نشست و دریافت لینک پرداختبدنهٔ درخواست
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
amount | number | الزامی | مبلغ کل خرید به تومان (عدد صحیح و مثبت). اگر واحد فروشگاه شما ریال است، پیش از ارسال بر ۱۰ تقسیم کنید. |
tenureMonths | number | الزامی | تعداد اقساط ماهانه. باید یکی از مدتهای مجاز قرارداد فروشگاه شما باشد. |
returnUrl | string | اختیاری | نشانی مطلق http/https که مشتری پس از تأیید یا انصراف به آن بازگردانده میشود. |
metadata | object | اختیاری | هر دادهای که میخواهید بعداً در verify و وبهوک دریافت کنید؛ معمولاً شمارهٔ سفارش فروشگاه. |
curl -X POST https://87.107.12.84/api/v1/checkout-sessions \
-H "Authorization: Bearer sk_live_XXXX" \
-H "Content-Type: application/json" \
-d '{
"amount": 12500000,
"tenureMonths": 6,
"returnUrl": "https://shop.example.com/checkout/noqte-return",
"metadata": { "orderId": "WC-10432" }
}'{
"id": "cksess_9f2c1ab4e7",
"token": "0b5f3a…",
"checkoutUrl": "https://87.107.12.84/pay/0b5f3a…",
"expiresAt": "2026-09-19T12:34:56.000Z"
}مهلت ۳۰ دقیقهای
وضعیت نشست
برای پیگیری یا نمایش وضعیت سفارش، بدون اثر جانبی.
/api/v1/checkout-sessions/:idخواندن وضعیت فعلی نشست — نیازمند scope checkout:read{
"id": "cksess_9f2c1ab4e7",
"status": "COMPLETED",
"amount": "12500000",
"tenureMonths": 6,
"transactionId": "txn_77c1…",
"expiresAt": "2026-09-19T12:34:56.000Z",
"completedAt": "2026-09-19T12:11:02.000Z"
}مقادیر ممکن status
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
OPEN | string | اختیاری | نشست ساخته شده و منتظر تأیید مشتری است. |
COMPLETED | string | اختیاری | مشتری پرداخت را تأیید کرده و اقساط ساخته شده است. |
CANCELLED | string | اختیاری | مشتری انصراف داده یا فروشگاه نشست را لغو کرده است. |
EXPIRED | string | اختیاری | مهلت ۳۰ دقیقهای بدون تأیید تمام شده است. |
amount بهصورت رشته برگردانده میشود، چون مبالغ در سمت سرویس عدد ۶۴ بیتیاند. در زبانهایی با عدد اعشاری پیشفرض، پیش از مقایسه آن را به عدد صحیح تبدیل کنید.تأیید نهایی (verify)
تنها منبع حقیقت برای «پرداختشده بودن» سفارش. این مرحله را هرگز حذف نکنید.
/api/v1/checkout-sessions/:id/verifyتأیید پرداخت و مقابلهٔ مبلغبدنهٔ درخواست
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
amount | number | اختیاری | مبلغ سفارش در سیستم شما به تومان. در صورت ارسال، با مبلغ نشست مقابله میشود و در صورت اختلاف خطای ۴۲۲ برمیگردد. ارسال آن بهشدت توصیه میشود. |
curl -X POST https://87.107.12.84/api/v1/checkout-sessions/cksess_9f2c1ab4e7/verify \
-H "Authorization: Bearer sk_live_XXXX" \
-H "Content-Type: application/json" \
-d '{ "amount": 12500000 }'{
"id": "cksess_9f2c1ab4e7",
"verified": true,
"status": "COMPLETED",
"amount": "12500000",
"tenureMonths": 6,
"transactionId": "txn_77c1…",
"metadata": { "orderId": "WC-10432" },
"completedAt": "2026-09-19T12:11:02.000Z"
}{
"id": "cksess_9f2c1ab4e7",
"verified": false,
"status": "EXPIRED",
"amount": "12500000",
"tenureMonths": 6,
"transactionId": null,
"metadata": null,
"completedAt": null
}idempotent است
به پارامترهای مرورگر اکتفا نکنید
status و transaction_id در نشانی بازگشت، از طریق مرورگر مشتری میآیند. حتی با امضای معتبر، مبلغ را باید با verify مقابله کنید تا سفارشی با مبلغ کمتر از مبلغ واقعی تکمیل نشود.لغو نشست
وقتی سفارش در سمت شما منتفی شد، نشست باز را ببندید تا مشتری نتواند بعداً آن را بپردازد.
/api/v1/checkout-sessions/:id/cancelبستن نشست باز{ "id": "cksess_9f2c1ab4e7", "status": "CANCELLED" }اگر نشست از قبل تکمیل، منقضی یا لغو شده باشد پاسخ ۴۰۹ با کد NOT_CANCELLABLE برمیگردد. این حالت خطا نیست؛ یعنی وضعیت نهایی پیشتر تعیین شده است.
بازگشت مشتری و بررسی امضا
آمیوا پارامترهای بازگشت را با HMAC-SHA256 امضا میکند تا دستکاری در مرورگر قابل تشخیص باشد.
پارامترهای اضافهشده به returnUrl
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
session_id | string | اختیاری | شناسهٔ نشست پرداخت |
status | completed | cancelled | اختیاری | نتیجهٔ اقدام مشتری در صفحهٔ پرداخت |
transaction_id | string | اختیاری | شناسهٔ خرید ثبتشده؛ در حالت انصراف رشتهٔ خالی است. |
sign | string (hex) | اختیاری | امضای HMAC-SHA256 سه مقدار بالا با کلید امضای فروشگاه |
فرمول امضا
payload = session_id + "." + status + "." + transaction_id
sign = HMAC_SHA256(signing_secret, payload) → hexنمونهٔ بررسی — PHP
<?php
$secret = getenv('NOQTE_SIGNING_SECRET');
$payload = $_GET['session_id'] . '.' . $_GET['status'] . '.' . $_GET['transaction_id'];
$expected = hash_hmac('sha256', $payload, $secret);
if (!hash_equals($expected, $_GET['sign'] ?? '')) {
http_response_code(400);
exit('امضای بازگشت معتبر نیست');
}
// امضا درست است؛ حالا مبلغ را سمت سرور تأیید کنید
$ch = curl_init($base . '/api/v1/checkout-sessions/' . $_GET['session_id'] . '/verify');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('NOQTE_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['amount' => $orderAmountToman]),
]);
$result = json_decode(curl_exec($ch), true);
if (!empty($result['verified'])) {
// سفارش را تکمیل کنید
}نمونهٔ بررسی — Node.js
import { createHmac, timingSafeEqual } from 'node:crypto';
function isValidReturn(query, secret) {
const payload = `${query.session_id}.${query.status}.${query.transaction_id}`;
const expected = createHmac('sha256', secret).update(payload).digest('hex');
const given = String(query.sign ?? '');
if (given.length !== expected.length) return false;
return timingSafeEqual(Buffer.from(expected), Buffer.from(given));
}مقایسهٔ امضا باید زمانثابت باشد
hash_equals در PHP و timingSafeEqual در Node استفاده کنید، نه از مقایسهٔ معمولی رشته.وبهوک
مسیر پشتیبان و مستقل از مرورگر. اگر مشتری صفحه را ببندد یا اینترنتش قطع شود، سفارش از این مسیر تکمیل میشود.
نشانی وبهوک را در پنل فروشگاه ثبت کنید. نشانی باید با https شروع شود و بدون نیاز به ورود در دسترس باشد. آمیوا بلافاصله پس از تکمیل خرید یک درخواست POST با بدنهٔ JSON ارسال میکند.
{
"event": "checkout_session.completed",
"checkoutSessionId": "cksess_9f2c1ab4e7",
"transactionId": "txn_77c1…",
"status": "COMPLETED",
"amount": "12500000",
"tenureMonths": 6,
"metadata": { "orderId": "WC-10432" },
"returnUrl": "https://shop.example.com/checkout/noqte-return",
"occurredAt": "2026-09-19T12:11:02.000Z"
}بررسی امضای وبهوک
امضا در هدر x-noqte-signature قرار دارد و روی بدنهٔ خام درخواست محاسبه میشود. حتماً بدنه را پیش از هر پردازشی به شکل خام بخوانید؛ اگر ابتدا JSON را decode و دوباره encode کنید، امضا نامعتبر میشود.
<?php
$raw = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_NOQTE_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $raw, getenv('NOQTE_SIGNING_SECRET'));
if (!hash_equals($expected, $signature)) {
http_response_code(401);
exit;
}
$event = json_decode($raw, true);
$orderId = $event['metadata']['orderId'] ?? null;
// سفارش را پیدا کنید، اگر قبلاً تکمیل نشده آن را تکمیل کنید (idempotent)
http_response_code(200); // هر پاسخ غیر ۲xx به معنای شکست تحویل استسیاست تحویل
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
تلاش بیدرنگ | — | اختیاری | بلافاصله پس از تکمیل خرید یکبار ارسال میشود؛ مهلت پاسخ ۸ ثانیه. |
بازتلاش | — | اختیاری | در صورت شکست تا ۶ نوبت با فاصلهٔ فزاینده تلاش میشود. پس از آن رویداد ناموفق علامت میخورد و دیگر ارسال نمیشود. |
پاسخ موفق | — | اختیاری | هر کد وضعیت ۲xx بهمعنای دریافت موفق است. پاسخ را سریع برگردانید و پردازش سنگین را به صف بسپارید. |
تکرار | — | اختیاری | ممکن است یک رویداد بیش از یکبار برسد. پردازش را بر اساس checkoutSessionId ایدمپوتنت کنید. |
اگر وبهوک تنظیم نشده باشد
نمونهٔ کامل یکپارچهسازی
کمترین کدی که یک فروشگاه سفارشی برای اتصال کامل لازم دارد.
import express from 'express';
import { createHmac, timingSafeEqual } from 'node:crypto';
const app = express();
const BASE = 'https://87.107.12.84';
const API_KEY = process.env.NOQTE_API_KEY;
const SECRET = process.env.NOQTE_SIGNING_SECRET;
// ۱) شروع پرداخت
app.post('/pay/noqte/:orderId', async (req, res) => {
const order = await loadOrder(req.params.orderId);
const response = await fetch(`${BASE}/api/v1/checkout-sessions`, {
method: 'POST',
headers: {
authorization: `Bearer ${API_KEY}`,
'content-type': 'application/json',
},
body: JSON.stringify({
amount: order.totalToman,
tenureMonths: 6,
returnUrl: 'https://shop.example.com/pay/noqte/return',
metadata: { orderId: order.id },
}),
});
if (!response.ok) return res.status(502).send('ساخت نشست پرداخت ناموفق بود');
const session = await response.json();
await saveSessionId(order.id, session.id);
res.redirect(session.checkoutUrl);
});
// ۲) بازگشت مشتری
app.get('/pay/noqte/return', async (req, res) => {
const { session_id, status, transaction_id, sign } = req.query;
const payload = `${session_id}.${status}.${transaction_id}`;
const expected = createHmac('sha256', SECRET).update(payload).digest('hex');
if (String(sign).length !== expected.length ||
!timingSafeEqual(Buffer.from(expected), Buffer.from(String(sign)))) {
return res.status(400).send('امضای بازگشت معتبر نیست');
}
if (status !== 'completed') return res.redirect('/cart?canceled=1');
const order = await findOrderBySession(session_id);
// ۳) تأیید نهایی سمت سرور — تنها مبنای معتبر
const verify = await fetch(
`${BASE}/api/v1/checkout-sessions/${session_id}/verify`,
{
method: 'POST',
headers: {
authorization: `Bearer ${API_KEY}`,
'content-type': 'application/json',
},
body: JSON.stringify({ amount: order.totalToman }),
},
);
const result = await verify.json();
if (!result.verified) return res.status(402).send('پرداخت تأیید نشد');
await markOrderPaid(order.id, result.transactionId); // ایدمپوتنت
res.redirect(`/orders/${order.id}?paid=1`);
});افزونهٔ ووکامرس
اگر فروشگاه شما روی وردپرس و ووکامرس است، نیازی به نوشتن هیچ کدی نیست. افزونه دو بخش دارد: پیشخوان مدیریتی در وردپرس و درگاه پرداخت روی فروشگاه.
افزونهٔ «درگاه پرداخت اعتباری آمیوا» برای ووکامرس
نسخهٔ 2.0.0 · سازگار با WooCommerce 6.0 به بالا و PHP 7.4 به بالا · پشتیبانی از HPOS و بلوک checkout
دو بخش افزونه
بخشهای افزونه و کار هرکدام
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
پیشخوان وردپرس | منوی «درگاه پرداخت اعتباری» | اختیاری | چهار صفحه: «تنظیمات درگاه» (کلیدها، تعداد اقساط، بازهٔ مبلغ، واحد پول، وضعیت سفارش)، «خریدهای قسطی» (فهرست سفارشهای پرداختشده با اعتبار آمیوا همراه با فیلتر وضعیت، تعداد اقساط، مبلغ ارسالی، شناسهٔ نشست و تراکنش و دکمهٔ پیگیری)، «وضعیت و تست اتصال» و «راهنمای راهاندازی». دسترسی لازم: manage_woocommerce. |
درگاه روی فروشگاه | روش پرداخت در صفحهٔ تسویه | اختیاری | روش «پرداخت قسطی آمیوا» در چکاوت کلاسیک و بلوکی نمایش داده میشود. با انتخاب آن، افزونه نشست پرداخت میسازد و مشتری به صفحهٔ میزبانیشدهٔ آمیوا میرود؛ احراز هویت مشتری و کسر از سقف اعتبار او آنجا انجام میشود، نه روی سایت فروشگاه. هیچ اطلاعات هویتی یا اعتباری مشتری وارد فروشگاه نمیشود. |
نصب
- 1
بارگذاری افزونه
در پیشخوان وردپرس به «افزونهها ← افزودن ← بارگذاری افزونه» بروید، فایل zip دانلودشده را انتخاب و پس از نصب، فعال کنید. - 2
ورود به منوی درگاه
پس از فعالسازی، منوی «درگاه پرداخت اعتباری» در پیشخوان وردپرس اضافه میشود؛ چهار صفحهٔ «تنظیمات درگاه»، «خریدهای قسطی»، «وضعیت و تست اتصال» و «راهنمای راهاندازی» دارد. همان تنظیمات از «ووکامرس ← پیکربندی ← پرداختها» هم در دسترس است. - 3
ثبت کلیدها
نشانی سرویس، کلید API و کلید امضا را از پنل فروشگاه ← درگاه پرداخت آنلاین کپی و در «تنظیمات درگاه» وارد کنید. - 4
ثبت نشانی وبهوک
افزونه نشانی وبهوک اختصاصی این سایت را در بالای صفحهٔ تنظیمات نمایش میدهد. آن را در پنل فروشگاه آمیوا ثبت کنید تا سفارشها در صورت بستهشدن مرورگر هم تکمیل شوند. - 5
تست اتصال
در «وضعیت و تست اتصال» دکمهٔ تست را بزنید. این تست هیچ سفارش یا نشست پرداختی نمیسازد و باید نام و کد فروشگاه، مدتهای مجاز قرارداد و وضعیت وبهوک را برگرداند. - 6
آزمون یک سفارش
یک سفارش کممبلغ ثبت کنید و مسیر کامل پرداخت، بازگشت و تغییر وضعیت سفارش را ببینید. لاگ افزونه در «ووکامرس ← وضعیت ← گزارشها» با نام noqte-credit ثبت میشود.
تنظیمات افزونه
فیلدهای صفحهٔ تنظیمات
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
نشانی سرویس | URL | الزامی | نشانی پایهٔ آمیوا، بدون اسلش پایانی. برای شما: https://87.107.12.84 |
کلید API | sk_live_… | الزامی | کلید مخفی فروشگاه؛ فقط روی سرور ذخیره میشود. |
کلید امضا | whsec_… | الزامی | برای بررسی امضای بازگشت و وبهوک. |
تعداد اقساط | number | الزامی | مدت بازپرداختی که به مشتریان پیشنهاد میدهید؛ باید در مدتهای مجاز قرارداد شما باشد. |
حداقل / حداکثر مبلغ سفارش | number | اختیاری | اگر مبلغ سبد خرید خارج از این بازه باشد، روش پرداخت قسطی در صفحهٔ تسویه نمایش داده نمیشود. صفر یعنی بدون محدودیت. |
وضعیت سفارش پس از پرداخت | select | اختیاری | وضعیتی که سفارش پس از تأیید موفق میگیرد؛ پیشفرض «در حال انجام» (processing). |
واحد پول فروشگاه | auto | toman | rial | اختیاری | بهصورت خودکار از واحد پول ووکامرس تشخیص داده میشود؛ ریال پیش از ارسال به تومان تبدیل میگردد. در صورت استفاده از افزونههای واحد پول سفارشی، مقدار را دستی تعیین کنید. |
رفتار افزونه در سفارشها
نگاشت وضعیت
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
پرداخت موفق | — | اختیاری | سفارش با payment_complete تکمیل میشود، شمارهٔ تراکنش آمیوا روی سفارش ثبت و یادداشت سفارش اضافه میشود. |
انصراف مشتری | — | اختیاری | سفارش در وضعیت «در انتظار پرداخت» میماند، سبد خرید حفظ میشود و مشتری به صفحهٔ تسویه بازمیگردد. |
امضای نامعتبر | — | اختیاری | سفارش تکمیل نمیشود، رویداد در لاگ ثبت میگردد و پیام خطا به مشتری نمایش داده میشود. |
اختلاف مبلغ | — | اختیاری | اگر مبلغ سفارش با مبلغ نشست یکی نباشد سفارش تکمیل نمیشود و یادداشت هشدار روی سفارش ثبت میشود. |
رسیدن همزمان وبهوک و بازگشت | — | اختیاری | تکمیل سفارش ایدمپوتنت است؛ سفارشی که قبلاً پرداختشده علامت خورده دوباره تکمیل نمیشود. |
عیبیابی سریع
نشانه و علت
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
روش پرداخت دیده نمیشود | — | اختیاری | افزونه فعال نیست، کلیدها ناقصاند، یا مبلغ سبد خرید خارج از بازهٔ حداقل/حداکثر است. |
خطای ۴۰۱ هنگام پرداخت | — | اختیاری | کلید API اشتباه یا لغو شده است، یا وضعیت فروشگاه فعال نیست. |
خطای ۴۲۲ با پیام مدت اقساط | — | اختیاری | تعداد اقساط تنظیمشده در افزونه جزو مدتهای مجاز قرارداد فروشگاه نیست. |
سفارش پرداختشده ولی باز مانده | — | اختیاری | وبهوک ثبت نشده و مشتری پیش از بازگشت، مرورگر را بسته است. نشانی وبهوک را در پنل ثبت کنید و برای سفارشهای قبلی در صفحهٔ «خریدهای قسطی» دکمهٔ «پیگیری» را بزنید؛ این دکمه اول وضعیت نشست را میخواند و فقط اگر خرید واقعاً تکمیل شده باشد سفارش را پرداختشده میکند و چیزی از اعتبار مشتری کسر نمیکند. |
مبلغ ده برابر یا یکدهم | — | اختیاری | واحد پول فروشگاه ریال است ولی تنظیم واحد پول افزونه روی تومان مانده (یا برعکس). |
کدهای خطا
همهٔ خطاها با بدنهٔ JSON و کلیدهای error و message برمیگردند.
خطاهای API
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
UNAUTHORIZED · 401 | — | اختیاری | کلید API نامعتبر، لغوشده، منقضی یا متعلق به فروشگاه غیرفعال است. |
FORBIDDEN · 403 | — | اختیاری | کلید معتبر است ولی scope لازم برای این عملیات را ندارد. |
INVALID_BODY · 400 | — | اختیاری | بدنهٔ درخواست JSON معتبر نیست یا مقدار مبلغ قابل تفسیر نیست. |
INVALID · 422 | — | اختیاری | مبلغ یا مدت اقساط نامعتبر است، returnUrl مطلق نیست، یا مدت اقساط در قرارداد فروشگاه مجاز نیست. |
BLOCKED · 422 | — | اختیاری | این خرید نیاز به پیشپرداخت نقدی دارد و از این مسیر قابل انجام نیست. |
AMOUNT_MISMATCH · 422 | — | اختیاری | مبلغ ارسالی در verify با مبلغ ثبتشدهٔ نشست یکی نیست. |
NOT_FOUND · 404 | — | اختیاری | نشست وجود ندارد یا متعلق به فروشگاه دیگری است. |
NOT_CANCELLABLE · 409 | — | اختیاری | نشست در وضعیت باز نیست و قابل لغو نمیباشد. |
چکلیست امنیت پیش از انتشار
پیش از فعالکردن درگاه روی فروشگاه واقعی، این موارد را تأیید کنید.
- کلید API و کلید امضا فقط در متغیرهای محیطی سرور نگهداری میشوند و در مخزن کد یا خروجی HTML دیده نمیشوند.
- امضای بازگشت با تابع مقایسهٔ زمانثابت بررسی میشود، نه با تساوی ساده.
- مبلغ سفارش در مرحلهٔ verify ارسال و مقابله میشود.
- تکمیل سفارش ایدمپوتنت است و رسیدن همزمان وبهوک و بازگشت مرورگر، سفارش را دوبار تکمیل نمیکند.
- نشانی وبهوک روی https است و امضای بدنهٔ خام را بررسی میکند.
- نشست پرداخت دقیقاً در لحظهٔ کلیک مشتری ساخته میشود، نه زودتر.
- در صورت خروج مشتری بدون پرداخت، سفارش در وضعیت در انتظار میماند و موجودی انبار آزاد میشود.
پرسشهای متداول
مبلغ را به تومان بفرستم یا ریال؟
همیشه تومان، بهصورت عدد صحیح و بدون جداکننده. اگر واحد فروشگاه شما ریال است پیش از ارسال بر ۱۰ تقسیم کنید. افزونهٔ ووکامرس این تبدیل را خودکار انجام میدهد.
اگر مشتری هنوز در آمیوا ثبتنام نکرده باشد چه میشود؟
صفحهٔ پرداخت او را به ثبتنام و ورود هدایت میکند و پس از آن به همان نشست پرداخت بازمیگرداند. اگر هنوز اعتبار فعالی نداشته باشد، پرداخت قابل تأیید نیست و میتواند با انصراف به فروشگاه برگردد.
چه زمانی پول به حساب فروشگاه واریز میشود؟
بر اساس چرخهٔ تسویهٔ قرارداد فروشگاه شما و مستقل از سررسید اقساط مشتری. وضعیت تسویهها در پنل فروشگاه قابل پیگیری است.
امکان بازگشت وجه یا لغو خرید پس از تکمیل وجود دارد؟
خرید تکمیلشده از طریق API قابل برگشت نیست؛ برای مرجوعی با پشتیبانی آمیوا هماهنگ کنید تا اعتبار مشتری و تسویهٔ فروشگاه اصلاح شود. تا پیش از تأیید مشتری، میتوانید نشست را با endpoint لغو ببندید.
میتوانم چند مدت اقساط به مشتری پیشنهاد بدهم؟
بله. برای هر گزینه یک نشست جداگانه با tenureMonths متفاوت بسازید. قسط ماهانه و جمع بازپرداخت هر گزینه در صفحهٔ پرداخت به مشتری نمایش داده میشود.
محیط آزمایشی جدا وجود دارد؟
اتصال آزمایشی با همان کلید و مبالغ کم انجام میشود؛ خریدهای آزمایشی را با پشتیبانی هماهنگ کنید تا از سوابق اعتباری حذف شوند.