راهنمای جامع اتصال به درگاه پرداخت کارتگذر
درگاه پرداخت کارتگذر یک زیرساخت مدرن کارتبهکارت خودکار بر پایه تخصیص کد یکتای ۴ رقمی و پردازش بلادرنگ پیامکهای بانکی است. با استفاده از این مستندات میتوانید هر نوع فروشگاه، ربات، اپلیکیشن یا افزونه را به سرعت به درگاه متصل کنید.
ثبت سفارش
فروشگاه شما متد create را صدا زده و آدرس درگاه پرداخت اختصاصی (payment_url) را با کد ۴ رقمی افزوده دریافت میکند.
هدایت خریدار
خریدار به صفحه پرداخت سابدامنه payments.cardgozar.ir منتقل شده و شماره کارت و مبلغ دقیق را کارتبهکارت میکند.
تطبیق بلادرنگ پیامک
به محض واریز، اپلیکیشن فورواردر اندروید پیامک واریز را به سرور منتقل کرده و تراکنش در کمتر از ۱ ثانیه تایید میشود.
وبهوک و استعلام
خریدار به callback_url بازمیگردد و همزمان وبهوک به سرور شما ارسال میشود. شما با فراخوانی verify سفارش را نهایی میکنید.
آدرس پایه سرور و احراز هویت (Base URL & Authentication)
تمامی درخواستهای وبسرویس باید حاوی هدر احراز هویت باشند. شما میتوانید از هر یک از الگوهای استاندارد زیر استفاده فرمایید:
# روش ۱: هدر استاندارد Bearer Token (توصیهشده) Authorization: Bearer YOUR_API_KEY # روش ۲: هدر فرمت Token Authorization: Token YOUR_API_KEY # روش ۳: هدر اختصاصی x-api-key x-api-key: YOUR_API_KEY
با ارسال مبلغ و آدرس بازگشت خریدار، کارتگذر یک شناسه یکتای ۴ رقمی روی مبلغ اضافه کرده و سفارش پرداخت را صادر میکند. مشتری را با ریدایرکت مرورگر به مقدار payment_url هدایت فرمایید.
| نام فیلد | نوع داده | وضعیت | توضیحات و مقادیر مجاز |
|---|---|---|---|
| amount | integer | الزامی | مبلغ پایه فاکتور به ریال (مثال: ۱۲,۰۰۰,۰۰۰ ریال معادل ۱,۲۰۰,۰۰۰ تومان). حداکثر ۵۰۰ میلیون ریال. |
| callback_url | string (URL) | الزامی | آدرس بازگشت خریدار پس از اتمام پرداخت و مقصدی که اعلان وبهوک به آن ارسال میشود. |
| order_id | string | اختیاری | شناسه اختصاصی فاکتور در سیستم یا دیتابیس شما (مثلاً INV-84920) |
| description | string | اختیاری | شرح خرید جهت نمایش در بالای صفحه درگاه به مشتری (حداکثر ۵۰۰ کاراکتر) |
{
"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
}
پس از بازگشت مشتری به آدرس بازگشت (یا پس از دریافت اعلان وبهوک)، حتماً این متد را از سمت سرور خود فراخوانی فرمایید. این متد تضمین میکند که واریز وجه با کد یکتا به حساب شما نشسته و کد پیگیری بانکی صادر شده است.
نکته: میتوانید پارامتر order_token را در انتهای URL ارسال کنید یا در متد POST با فرمت JSON ارسال نمایید: {"order_token": "..."}.
{
"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"
}
این متد برای چک کردن دورهای (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
{
"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
$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 آنی ساخته شود:
کتابخانه نمونهکدهای آماده اتصال (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 شما از سقف ۱۵ درخواست در ثانیه عبور کرده است. چند لحظه صبر کنید. |