نسخهٔ API: v1

درگاه پرداخت اعتباری آمیوا

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

نشانی پایهٔ سرویس شما: https://87.107.12.84

درگاه اعتباری چیست

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

پرداخت از اعتبار، نه از کارت

مبلغ خرید از سقف اعتبار تأییدشدهٔ مشتری برداشت می‌شود و همان لحظه اقساط ماهانهٔ او ساخته می‌شود. مشتری نیازی به کارت اعتباری یا ضامن ندارد.

ریسک اعتباری با آمیوا است

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

یکپارچگی استاندارد

REST روی HTTPS، احراز هویت Bearer، بازگشت امضاشده با HMAC-SHA256 و وب‌هوک با بازتلاش. هر پلتفرم فروشگاهی که بتواند یک درخواست HTTP بزند قابل اتصال است.

این درگاه پول نقد جابه‌جا نمی‌کند

در لحظهٔ خرید هیچ تراکنش بانکی و هیچ انتقال وجهی انجام نمی‌شود؛ آنچه تغییر می‌کند «اعتبار مصرف‌شدهٔ مشتری» است. بنابراین سفارش را فقط پس از پاسخ موفق مرحلهٔ verify یا وب‌هوک معتبر، پرداخت‌شده تلقی کنید.

جریان پرداخت

پنج گام از لحظهٔ کلیک مشتری روی «پرداخت قسطی» تا ثبت نهایی سفارش.

  1. 1

    ساخت نشست پرداخت روی سرور شما

    سرور فروشگاه با کلید API خود درخواست POST /api/v1/checkout-sessions می‌فرستد و مبلغ، مدت اقساط و نشانی بازگشت را می‌دهد. پاسخ شامل checkoutUrl است.
  2. 2

    انتقال مشتری به صفحهٔ پرداخت آمیوا

    مرورگر مشتری را به checkoutUrl هدایت کنید. این صفحه میزبان آمیوا است؛ ورود، احراز هویت و نمایش اقساط آنجا انجام می‌شود و هیچ داده حساسی وارد سایت شما نمی‌شود.
  3. 3

    تأیید مشتری و برداشت از اعتبار

    مشتری قسط ماهانه و جمع بازپرداخت را می‌بیند و تأیید می‌کند. برداشت از اعتبار و ساخت اقساط در یک تراکنش اتمیک انجام می‌شود؛ نشست پرداخت یک‌بارمصرف است.
  4. 4

    بازگشت امضاشده به فروشگاه

    مشتری به returnUrl شما برمی‌گردد، همراه با پارامترهای session_id، status، transaction_id و sign.
  5. 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. 1

    فروشگاه فعال

    قرارداد فروشگاه باید تأیید و وضعیت آن ACTIVE باشد. درخواست‌های فروشگاه غیرفعال با خطای ۴۰۱ رد می‌شوند.
  2. 2

    کلید API

    از مسیر پنل فروشگاه ← درگاه پرداخت آنلاین کلید بسازید. مقدار کامل کلید (sk_live_…) فقط همان یک‌بار نمایش داده می‌شود؛ بعد از آن تنها پیشوند آن دیده می‌شود. ساخت کلید فقط برای نقش «مالک فروشگاه» مجاز است. اگر به این صفحه دسترسی ندارید، پشتیبانی آمیوا می‌تواند همین کلیدها را از پنل مدیریت برای فروشگاه شما بسازد.
  3. 3

    کلید امضا (Signing Secret)

    مقدار whsec_… که با ساخت اولین کلید API به‌صورت خودکار ساخته می‌شود و در همان صفحهٔ «درگاه پرداخت آنلاین» قابل مشاهده و چرخش است. هم امضای وب‌هوک و هم پارامتر sign در بازگشت مشتری با همین کلید بررسی می‌شوند؛ با چرخش کلید، امضاهای قبلی بی‌اعتبار می‌شوند.

کلیدها را هرگز در سمت مرورگر قرار ندهید

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

احراز هویت

تمام درخواست‌های API با هدر Authorization و کلید مخفی فروشگاه انجام می‌شوند.

هدرهای مشترک همهٔ درخواست‌ها
Authorization: Bearer sk_live_XXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/json

هر کلید مجموعه‌ای از scopeها دارد. کلیدهای ساخته‌شده از پنل به‌صورت پیش‌فرض هر دو scope زیر را دارند:

scopeهای کلید API

پارامترنوعالزامتوضیح
checkout:createscopeاختیاریساخت نشست پرداخت و لغو نشست باز
checkout:readscopeاختیاریخواندن وضعیت نشست و فراخوانی verify
هر بار استفاده از کلید، زمان «آخرین استفاده» آن در پنل به‌روز می‌شود. اگر کلیدی را ساخته‌اید ولی این زمان خالی مانده، یعنی درخواست شما اصلاً به سرویس نرسیده است — معمولاً مشکل از فایروال خروجی سرور فروشگاه است.

شناسنامهٔ فروشگاه

برای تست کلید و خواندن شرایط قرارداد، بدون ساخت هیچ نشست پرداختی.

GET/api/v1/merchantاعتبارسنجی کلید و دریافت شرایط فروشگاه

این تنها فراخوانی‌ای است که هیچ اثر جانبی ندارد؛ برای دکمهٔ «تست اتصال» در پنل فروشگاه‌ساز خود از همین مسیر استفاده کنید، نه از ساخت و لغو نشست آزمایشی.

پاسخ — 200 OK
{
  "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 رد می‌شود. پاسخ ۴۰۱ یعنی کلید نامعتبر، لغوشده یا متعلق به فروشگاه غیرفعال است.

ساخت نشست پرداخت

اولین و تنها فراخوانی لازم پیش از انتقال مشتری.

POST/api/v1/checkout-sessionsساخت نشست و دریافت لینک پرداخت

بدنهٔ درخواست

پارامترنوعالزامتوضیح
amountnumberالزامیمبلغ کل خرید به تومان (عدد صحیح و مثبت). اگر واحد فروشگاه شما ریال است، پیش از ارسال بر ۱۰ تقسیم کنید.
tenureMonthsnumberالزامیتعداد اقساط ماهانه. باید یکی از مدت‌های مجاز قرارداد فروشگاه شما باشد.
returnUrlstringاختیارینشانی مطلق http/https که مشتری پس از تأیید یا انصراف به آن بازگردانده می‌شود.
metadataobjectاختیاریهر داده‌ای که می‌خواهید بعداً در verify و وب‌هوک دریافت کنید؛ معمولاً شمارهٔ سفارش فروشگاه.
درخواست — curl
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" }
  }'
پاسخ — 201 Created
{
  "id": "cksess_9f2c1ab4e7",
  "token": "0b5f3a…",
  "checkoutUrl": "https://87.107.12.84/pay/0b5f3a…",
  "expiresAt": "2026-09-19T12:34:56.000Z"
}

مهلت ۳۰ دقیقه‌ای

هر نشست پرداخت ۳۰ دقیقه اعتبار دارد. لینک را از قبل نسازید و ذخیره نکنید؛ درست در لحظه‌ای بسازید که مشتری روی دکمهٔ پرداخت کلیک می‌کند.

وضعیت نشست

برای پیگیری یا نمایش وضعیت سفارش، بدون اثر جانبی.

GET/api/v1/checkout-sessions/:idخواندن وضعیت فعلی نشست — نیازمند scope checkout:read
پاسخ — 200 OK
{
  "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

پارامترنوعالزامتوضیح
OPENstringاختیارینشست ساخته شده و منتظر تأیید مشتری است.
COMPLETEDstringاختیاریمشتری پرداخت را تأیید کرده و اقساط ساخته شده است.
CANCELLEDstringاختیاریمشتری انصراف داده یا فروشگاه نشست را لغو کرده است.
EXPIREDstringاختیاریمهلت ۳۰ دقیقه‌ای بدون تأیید تمام شده است.
amount به‌صورت رشته برگردانده می‌شود، چون مبالغ در سمت سرویس عدد ۶۴ بیتی‌اند. در زبان‌هایی با عدد اعشاری پیش‌فرض، پیش از مقایسه آن را به عدد صحیح تبدیل کنید.

تأیید نهایی (verify)

تنها منبع حقیقت برای «پرداخت‌شده بودن» سفارش. این مرحله را هرگز حذف نکنید.

POST/api/v1/checkout-sessions/:id/verifyتأیید پرداخت و مقابلهٔ مبلغ

بدنهٔ درخواست

پارامترنوعالزامتوضیح
amountnumberاختیاریمبلغ سفارش در سیستم شما به تومان. در صورت ارسال، با مبلغ نشست مقابله می‌شود و در صورت اختلاف خطای ۴۲۲ برمی‌گردد. ارسال آن به‌شدت توصیه می‌شود.
درخواست — curl
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 }'
پاسخ موفق — 200 OK
{
  "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"
}
پاسخ پرداخت‌نشده — 200 OK با verified=false
{
  "id": "cksess_9f2c1ab4e7",
  "verified": false,
  "status": "EXPIRED",
  "amount": "12500000",
  "tenureMonths": 6,
  "transactionId": null,
  "metadata": null,
  "completedAt": null
}

idempotent است

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

به پارامترهای مرورگر اکتفا نکنید

پارامترهای status و transaction_id در نشانی بازگشت، از طریق مرورگر مشتری می‌آیند. حتی با امضای معتبر، مبلغ را باید با verify مقابله کنید تا سفارشی با مبلغ کمتر از مبلغ واقعی تکمیل نشود.

لغو نشست

وقتی سفارش در سمت شما منتفی شد، نشست باز را ببندید تا مشتری نتواند بعداً آن را بپردازد.

POST/api/v1/checkout-sessions/:id/cancelبستن نشست باز
پاسخ — 200 OK
{ "id": "cksess_9f2c1ab4e7", "status": "CANCELLED" }

اگر نشست از قبل تکمیل، منقضی یا لغو شده باشد پاسخ ۴۰۹ با کد NOT_CANCELLABLE برمی‌گردد. این حالت خطا نیست؛ یعنی وضعیت نهایی پیش‌تر تعیین شده است.

بازگشت مشتری و بررسی امضا

آمیوا پارامترهای بازگشت را با HMAC-SHA256 امضا می‌کند تا دستکاری در مرورگر قابل تشخیص باشد.

پارامترهای اضافه‌شده به returnUrl

پارامترنوعالزامتوضیح
session_idstringاختیاریشناسهٔ نشست پرداخت
statuscompleted | cancelledاختیارینتیجهٔ اقدام مشتری در صفحهٔ پرداخت
transaction_idstringاختیاریشناسهٔ خرید ثبت‌شده؛ در حالت انصراف رشتهٔ خالی است.
signstring (hex)اختیاریامضای HMAC-SHA256 سه مقدار بالا با کلید امضای فروشگاه

فرمول امضا

رشتهٔ امضاشده
payload = session_id + "." + status + "." + transaction_id
sign    = HMAC_SHA256(signing_secret, payload)  →  hex

نمونهٔ بررسی — PHP

verify-return.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

verify-return.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 ارسال می‌کند.

بدنهٔ رویداد checkout_session.completed
{
  "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 کنید، امضا نامعتبر می‌شود.

webhook.php
<?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 ایدمپوتنت کنید.

اگر وب‌هوک تنظیم نشده باشد

رویداد بلافاصله ناموفق علامت می‌خورد و بازتلاش نمی‌شود. در این حالت تنها مسیر تکمیل سفارش، بازگشت مرورگر و verify است.

نمونهٔ کامل یکپارچه‌سازی

کمترین کدی که یک فروشگاه سفارشی برای اتصال کامل لازم دارد.

checkout.js — Node/Express
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. 1

    بارگذاری افزونه

    در پیشخوان وردپرس به «افزونه‌ها ← افزودن ← بارگذاری افزونه» بروید، فایل zip دانلودشده را انتخاب و پس از نصب، فعال کنید.
  2. 2

    ورود به منوی درگاه

    پس از فعال‌سازی، منوی «درگاه پرداخت اعتباری» در پیشخوان وردپرس اضافه می‌شود؛ چهار صفحهٔ «تنظیمات درگاه»، «خریدهای قسطی»، «وضعیت و تست اتصال» و «راهنمای راه‌اندازی» دارد. همان تنظیمات از «ووکامرس ← پیکربندی ← پرداخت‌ها» هم در دسترس است.
  3. 3

    ثبت کلیدها

    نشانی سرویس، کلید API و کلید امضا را از پنل فروشگاه ← درگاه پرداخت آنلاین کپی و در «تنظیمات درگاه» وارد کنید.
  4. 4

    ثبت نشانی وب‌هوک

    افزونه نشانی وب‌هوک اختصاصی این سایت را در بالای صفحهٔ تنظیمات نمایش می‌دهد. آن را در پنل فروشگاه آمیوا ثبت کنید تا سفارش‌ها در صورت بسته‌شدن مرورگر هم تکمیل شوند.
  5. 5

    تست اتصال

    در «وضعیت و تست اتصال» دکمهٔ تست را بزنید. این تست هیچ سفارش یا نشست پرداختی نمی‌سازد و باید نام و کد فروشگاه، مدت‌های مجاز قرارداد و وضعیت وب‌هوک را برگرداند.
  6. 6

    آزمون یک سفارش

    یک سفارش کم‌مبلغ ثبت کنید و مسیر کامل پرداخت، بازگشت و تغییر وضعیت سفارش را ببینید. لاگ افزونه در «ووکامرس ← وضعیت ← گزارش‌ها» با نام noqte-credit ثبت می‌شود.

تنظیمات افزونه

فیلدهای صفحهٔ تنظیمات

پارامترنوعالزامتوضیح
نشانی سرویسURLالزامینشانی پایهٔ آمیوا، بدون اسلش پایانی. برای شما: https://87.107.12.84
کلید APIsk_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 متفاوت بسازید. قسط ماهانه و جمع بازپرداخت هر گزینه در صفحهٔ پرداخت به مشتری نمایش داده می‌شود.

محیط آزمایشی جدا وجود دارد؟

اتصال آزمایشی با همان کلید و مبالغ کم انجام می‌شود؛ خریدهای آزمایشی را با پشتیبانی هماهنگ کنید تا از سوابق اعتباری حذف شوند.