مستندات رسمی وب‌سرویس نسخه ۱.۰ (RESTful API v1)
سرویس فعال و پایدار

راهنمای جامع اتصال به درگاه پرداخت کارت‌گذر

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

مدیریت و صدور کلیدهای API
چرخه حیات یک تراکنش در کارت‌گذر (Payment Lifecycle)
۱

ثبت سفارش

فروشگاه شما متد create را صدا زده و آدرس درگاه پرداخت اختصاصی (payment_url) را با کد ۴ رقمی افزوده دریافت می‌کند.

۲

هدایت خریدار

خریدار به صفحه پرداخت ساب‌دامنه payments.cardgozar.ir منتقل شده و شماره کارت و مبلغ دقیق را کارت‌به‌کارت می‌کند.

۳

تطبیق بلادرنگ پیامک

به محض واریز، اپلیکیشن فورواردر اندروید پیامک واریز را به سرور منتقل کرده و تراکنش در کمتر از ۱ ثانیه تایید می‌شود.

۴

وب‌هوک و استعلام

خریدار به callback_url بازمی‌گردد و همزمان وب‌هوک به سرور شما ارسال می‌شود. شما با فراخوانی verify سفارش را نهایی می‌کنید.

آدرس پایه سرور و احراز هویت (Base URL & Authentication)

دامنه اصلی فراخوانی API:
https://cardgozar.ir
دامنه پرداخت خریدار (Gateway Subdomain):
https://payments.cardgozar.ir

تمامی درخواست‌های وب‌سرویس باید حاوی هدر احراز هویت باشند. شما می‌توانید از هر یک از الگوهای استاندارد زیر استفاده فرمایید:

# روش ۱: هدر استاندارد Bearer Token (توصیه‌شده)
Authorization: Bearer YOUR_API_KEY

# روش ۲: هدر فرمت Token
Authorization: Token YOUR_API_KEY

# روش ۳: هدر اختصاصی x-api-key
x-api-key: YOUR_API_KEY
POST /api/v1/payments/create/
نیاز به کلید API

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

پارامترهای بدنه درخواست (JSON Request Body):
نام فیلد نوع داده وضعیت توضیحات و مقادیر مجاز
amount integer الزامی مبلغ پایه فاکتور به ریال (مثال: ۱۲,۰۰۰,۰۰۰ ریال معادل ۱,۲۰۰,۰۰۰ تومان). حداکثر ۵۰۰ میلیون ریال.
callback_url string (URL) الزامی آدرس بازگشت خریدار پس از اتمام پرداخت و مقصدی که اعلان وب‌هوک به آن ارسال می‌شود.
order_id string اختیاری شناسه اختصاصی فاکتور در سیستم یا دیتابیس شما (مثلاً INV-84920)
description string اختیاری شرح خرید جهت نمایش در بالای صفحه درگاه به مشتری (حداکثر ۵۰۰ کاراکتر)
نمونه پاسخ موفق سرور (201 Created):
{
  "status": "success",
  "order_token": "ord_a94f1082cba3e47b",
  "tracking_code": "CG-94820",
  "payment_url": "https://payments.cardgozar.ir/pay/ord_a94f1082cba3e47b",
  "base_amount": 12000000,
  "final_amount": 12034500,
  "final_amount_tomans": 1203450,
  "unique_code": 3450,
  "expires_in_seconds": 900
}
GET / POST /api/v1/payments/verify/{order_token}/
نیاز به کلید API

پس از بازگشت مشتری به آدرس بازگشت (یا پس از دریافت اعلان وب‌هوک)، حتماً این متد را از سمت سرور خود فراخوانی فرمایید. این متد تضمین می‌کند که واریز وجه با کد یکتا به حساب شما نشسته و کد پیگیری بانکی صادر شده است.
نکته: می‌توانید پارامتر order_token را در انتهای URL ارسال کنید یا در متد POST با فرمت JSON ارسال نمایید: {"order_token": "..."}.

نمونه پاسخ استعلام تایید شده (200 OK):
{
  "status": "PAID",
  "is_paid": true,
  "is_expired": false,
  "order_token": "ord_a94f1082cba3e47b",
  "tracking_code": "CG-94820",
  "merchant_order_id": "INV-84920",
  "base_amount_tomans": 1200000,
  "unique_code": 3450,
  "final_amount_rials": 12034500,
  "final_amount_tomans": 1203450,
  "ref_id": "94821038",
  "payer_card": "****-2841",
  "paid_at": "2026-10-18T05:10:45Z"
}
GET /api/v1/payments/status/{order_token}/
عمومی (بدون نیاز به کلید)

این متد برای چک کردن دوره‌ای (Polling هر ۲ یا ۳ ثانیه یکبار) توسط جاوااسکریپت فرانت‌اند در صفحه تسویه‌حساب طراحی شده است. اطلاعات محرمانه برنمی‌گرداند و نیازی به ارسال کلید API ندارد.

{
  "status": "PAID",
  "is_paid": true,
  "is_expired": false,
  "remaining_seconds": 780,
  "tracking_code": "CG-94820",
  "ref_id": "94821038",
  "merchant_order_id": "INV-84920",
  "final_amount_tomans": 1203450,
  "paid_at": "2026-10-18T05:10:45Z"
}

وب‌هوک تایید آنی پرداخت و امضای دیجیتال (Webhook Notification)

در صورتی که خریدار پس از کارت‌به‌کارت مرورگر خود را ببندد و به سایت شما برنگردد، هیچ مشکلی ایجاد نخواهد شد! سرور کارت‌گذر به محض تطبیق پیامک بانکی، یک درخواست POST همراه با امضای هش HMAC-SHA256 به آدرس callback_url سایت شما می‌فرستد.

هدرهای ارسالی وب‌هوک به سایت شما:
Content-Type: application/json
X-CardGozar-Signature: 8f4a1c6e7b89d42e...
X-CardGozar-Timestamp: 1792298400
User-Agent: CardGozar-Webhook/1.0
بدنه جیسون وب‌هوک (JSON Payload):
{
  "event": "payment.success",
  "order_token": "ord_a94f1082cba3e47b",
  "merchant_order_id": "INV-84920",
  "amount_rials": 12034500,
  "amount_tomans": 1203450,
  "status": "PAID",
  "ref_id": "94821038",
  "payer_card": "****-2841",
  "paid_at": "2026-10-18T05:10:45Z"
}
نمونه کد PHP جهت صحت‌سنجی امضای وب‌هوک با کلید محرمانه (API Secret):
<?php
$apiSecret = "YOUR_API_SECRET"; // از منوی مدیریت کلیدهای کارت‌گذر
$rawPayload = file_get_contents('php://input');
$signatureHeader = $_SERVER['HTTP_X_CARDGOZAR_SIGNATURE'] ?? '';

// محاسبه هش بر اساس بدنه خام جیسون
$expectedSignature = hash_hmac('sha256', $rawPayload, $apiSecret);

if (hash_equals($expectedSignature, $signatureHeader)) {
    $data = json_decode($rawPayload, true);
    // پرداخت واقعی و معتبر است! سفارش خریدار را در دیتابیس فعال کنید
    http_response_code(200);
    echo json_encode(['status' => 'received']);
} else {
    // امضا نامعتبر است! جعل درخواست
    http_response_code(403);
    exit('Invalid signature');
}
?>

شبیه‌ساز و تست‌کننده آنلاین API (Live Simulator)

مبلغ را به تومان وارد کنید تا محاسبه کد ۴ رقمی و نمونه درخواست cURL آنی ساخته شود:

Sandbox Playground
تومان
مبلغ پایه فاکتور:
کد یکتای اختصاصی:
مبلغ نهایی واریزی خریدار:
فرمان تولیدشده cURL (آماده تست در ترمینال):

        

کتابخانه نمونه‌کدهای آماده اتصال (Code Examples)

زبان مورد نظر خود را انتخاب کرده و کد را در پروژه قرار دهید:

اسکریپت کامل ایجاد سفارش و صفحه تایید پرداخت با cURL در PHP:

<?php
define('CARDGOZAR_API_KEY', 'YOUR_API_KEY');
define('CARDGOZAR_BASE_URL', 'https://cardgozar.ir');

/**
 * گام ۱: ساخت سفارش و انتقال خریدار به صفحه پرداخت کارت‌گذر
 */
function requestCardGozarPayment($amountRials, $orderId, $callbackUrl, $description = '') {
    $payload = json_encode([
        'amount'       => (int)$amountRials,
        'order_id'     => (string)$orderId,
        'callback_url' => $callbackUrl,
        'description'  => $description ?: "خرید فاکتور $orderId"
    ]);

    $ch = curl_init(CARDGOZAR_BASE_URL . '/api/v1/payments/create/');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $payload,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . CARDGOZAR_API_KEY
        ],
        CURLOPT_TIMEOUT        => 10
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    $res = json_decode($response, true);
    if ($httpCode === 201 && !empty($res['payment_url'])) {
        // هدایت مستقیم خریدار به صفحه درگاه
        header("Location: " . $res['payment_url']);
        exit;
    }

    throw new Exception($res['error'] ?? 'خطا در اتصال به درگاه کارت‌گذر');
}

/**
 * گام ۲: استعلام و تایید قطعی پرداخت در صفحه callback_url
 */
function verifyCardGozarPayment($orderToken) {
    $ch = curl_init(CARDGOZAR_BASE_URL . '/api/v1/payments/verify/' . urlencode($orderToken) . '/');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . CARDGOZAR_API_KEY
        ],
        CURLOPT_TIMEOUT        => 10
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    $res = json_decode($response, true);
    if ($httpCode === 200 && !empty($res['is_paid'])) {
        return [
            'success'   => true,
            'ref_id'    => $res['ref_id'],
            'amount'    => $res['final_amount_tomans'],
            'card'      => $res['payer_card'],
            'order_id'  => $res['merchant_order_id']
        ];
    }

    return ['success' => false, 'error' => $res['error'] ?? 'پرداخت تایید نشد'];
}
?>

راهنمای استفاده در وردپرس و قطعه‌کد استاندارد جهت فراخوانی با wp_remote_post:

<?php
/**
 * قطعه‌کد اتصال اختصاصی کارت‌گذر در وردپرس (functions.php یا افزونه)
 */
function cardgozar_create_order_wp($order_id, $amount_tomans, $return_url) {
    $api_key = 'YOUR_API_KEY';
    
    $body = wp_json_encode([
        'amount'       => $amount_tomans * 10, // تبدیل تومان به ریال
        'order_id'     => (string)$order_id,
        'callback_url' => $return_url,
        'description'  => "پرداخت سفارش ووکامرس شماره #$order_id"
    ]);

    $response = wp_remote_post('https://cardgozar.ir/api/v1/payments/create/', [
        'headers'     => [
            'Content-Type'  => 'application/json',
            'Authorization' => 'Bearer ' . $api_key,
        ],
        'body'        => $body,
        'timeout'     => 15,
        'data_format' => 'body'
    ]);

    if (is_wp_error($response)) {
        return false;
    }

    $data = json_decode(wp_remote_retrieve_body($response), true);
    if (wp_remote_retrieve_response_code($response) === 201 && !empty($data['payment_url'])) {
        return $data['payment_url'];
    }

    return false;
}
?>

نمونه کد پایتون با کتابخانه requests:

import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://cardgozar.ir"

def create_payment(amount_rials: int, order_id: str, callback_url: str):
    """ایجاد سفارش پرداخت جدید و دریافت لینک درگاه خریدار"""
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    payload = {
        "amount": amount_rials,
        "order_id": order_id,
        "callback_url": callback_url,
        "description": f"Invoice {order_id}"
    }
    resp = requests.post(f"{BASE_URL}/api/v1/payments/create/", json=payload, headers=headers, timeout=10)
    if resp.status_code == 201:
        data = resp.json()
        print("Payment Link:", data["payment_url"])
        print("Final Amount:", data["final_amount_tomans"], "Tomans")
        return data["payment_url"]
    raise Exception(resp.json().get("error", "Error creating payment"))

def verify_payment(order_token: str):
    """استعلام و تایید قطعی تراکنش"""
    headers = {"Authorization": f"Bearer {API_KEY}"}
    resp = requests.get(f"{BASE_URL}/api/v1/payments/verify/{order_token}/", headers=headers, timeout=10)
    data = resp.json()
    if resp.status_code == 200 and data.get("is_paid"):
        print("Success! Ref ID:", data["ref_id"], "Payer Card:", data["payer_card"])
        return True, data
    return False, data

نمونه کد جاوااسکریپت و Node.js با کتابخانه axios:

const axios = require('axios');

const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://cardgozar.ir';

const client = axios.create({
    baseURL: BASE_URL,
    headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Content-Type': 'application/json'
    },
    timeout: 10000
});

// ۱. ایجاد تراکنش
async function createOrder(amountRials, orderId, callbackUrl) {
    const res = await client.post('/api/v1/payments/create/', {
        amount: amountRials,
        order_id: orderId,
        callback_url: callbackUrl,
        description: `Order #${orderId}`
    });
    return res.data.payment_url;
}

// ۲. تایید و استعلام
async function verifyOrder(orderToken) {
    const res = await client.get(`/api/v1/payments/verify/${orderToken}/`);
    return res.data; // { is_paid: true, ref_id: '...', ... }
}

نمونه کد استاندارد Go با پکیج net/http:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

const apiKey = "YOUR_API_KEY"
const baseURL = "https://cardgozar.ir"

type CreateOrderResponse struct {
    Status     string `json:"status"`
    PaymentURL string `json:"payment_url"`
    OrderToken string `json:"order_token"`
}

func CreateOrder(amountRials int, orderID, callbackURL string) (string, error) {
    payload, _ := json.Marshal(map[string]interface{}{
        "amount":       amountRials,
        "order_id":     orderID,
        "callback_url": callbackURL,
    })

    req, _ := http.NewRequest("POST", baseURL+"/api/v1/payments/create/", bytes.NewBuffer(payload))
    req.Header.Set("Authorization", "Bearer "+apiKey)
    req.Header.Set("Content-Type", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    var res CreateOrderResponse
    json.NewDecoder(resp.Body).Decode(&res)
    return res.PaymentURL, nil
}

دستورات خط فرمان cURL جهت تست سریع در ترمینال یا Postman:

# ۱. ایجاد سفارش پرداخت (Create Order)
curl -X POST https://cardgozar.ir/api/v1/payments/create/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 1000000,
    "order_id": "TEST-101",
    "callback_url": "https://myshop.ir/payment/verify/",
    "description": "خرید تستی درگاه"
  }'

# ۲. استعلام و تایید سفارش (Verify Order)
curl -X GET https://cardgozar.ir/api/v1/payments/verify/ord_a94f1082cba3e47b/ \
  -H "Authorization: Bearer YOUR_API_KEY"

# ۳. استعلام وضعیت زنده برای فرانت‌اند (Live Status)
curl -X GET https://cardgozar.ir/api/v1/payments/status/ord_a94f1082cba3e47b/

جدول کدهای وضعیت و خطاهای استاندارد (Error Handling & HTTP Codes)

کد HTTP عنوان وضعیت توضیحات و راهنمای رفع
201 Created سفارش با موفقیت ایجاد شد مشتری را به آدرس برگشتی payment_url هدایت فرمایید.
200 OK استعلام موفق پاسخ استعلام با فیلد is_paid: true دریافت شد. سفارش قطعی است.
400 Bad Request خطای داده‌های ورودی پارامترهای الزامی ارسال نشده یا آدرس callback_url از IPهای لوکال و غیرمجاز استفاده کرده است.
401 Unauthorized احراز هویت نامعتبر هدر Authorization ارسال نشده، فرمت آن اشتباه است یا کلید API غیرفعال شده است.
403 Forbidden درگاه معلق به دلیل سقف بدهی بدهی کارمزد درگاه شما به سقف ۵۰۰,۰۰۰ تومان رسیده است. جهت فعال‌سازی مجدد، کیف‌پول را شارژ نمایید.
404 Not Found سفارش یافت نشد شناسه سفارش (order_token) در سیستم وجود ندارد یا منقضی شده است.
429 Too Many Requests محدودیت نرخ درخواست (Rate Limit) تعداد درخواست‌های IP شما از سقف ۱۵ درخواست در ثانیه عبور کرده است. چند لحظه صبر کنید.