VardhanPay API Documentation

Welcome to the official VardhanPay API integration guide. Use our REST APIs to accept UPI payments, generate dynamic QR codes, track payments, and verify callbacks.

1. Environment & Base URL

Environment Base URL
Production API https://api.vardhanpay.com
Merchant Portal https://mch.vardhanpay.com

2. Signature Algorithm (MD5)

Every API request must include a cryptographic signature generated using your Merchant Secret Key:

  1. Filter out parameters with empty/null values and exclude sign and deepLinks.
  2. Sort parameter keys in alphabetical order (case-insensitive ASCII).
  3. Concatenate keys and values: k1=v1&k2=v2&...&key=YOUR_SECRET_KEY
  4. Calculate the MD5 hash of the string and convert to lowercase.
sign = md5("amount=100.00&currency=INR&mchNo=100333084&mchOrderNo=ORD123&version=V3&key=YOUR_SECRET_KEY")

3. Create Payin Order (V3)

POST /api/v1/payin/create (or /findRealChannel)

Request Parameters

FieldTypeRequiredDescription
mchNoStringYesMerchant No (e.g. 100333084)
mchOrderNoStringYesUnique Merchant Order ID
amountStringYesAmount in INR (e.g. 100.00)
currencyStringYesINR
versionStringYesV3
notifyUrlStringYesWebhook callback URL
signStringYesMD5 signature

Success Response

{
  "code": 0,
  "msg": "Success",
  "data": {
    "amount": 100.00,
    "transferUpi": "paylinker@upi",
    "remark": "P2026082201",
    "imgCode": "data:image/png;base64,iVBORw0KGgo...",
    "upi": "upi://pay?pa=paylinker@upi&am=100.00...",
    "paytmmp": "paytmmp://cash_wallet?pa=paylinker@upi..."
  }
}

4. Query Order Status

POST /api/v1/payin/query (or /findOrderStatus)

{
  "code": 0,
  "msg": "Success",
  "data": {
    "status": 2, // 1: PENDING, 2: SUCCESS, 3: FAILED
    "payinState": 2
  }
}

5. Submit 12-Digit Banking UTR

POST /api/v1/payin/utr/submit (or /uploadUtr)

{
  "mchNo": "100333084",
  "mchOrderNo": "ORD123",
  "utr": "423512345678",
  "version": "V1",
  "sign": "..."
}

6. Callback Notification (Webhook)

When an order is completed, our server sends a POST request to your notifyUrl. Your server must respond with HTTP 200 and plain text success.

POST /your-webhook-handler.php
Content-Type: application/json

{
  "mchNo": "100333084",
  "mchOrderNo": "ORD123",
  "amount": "100.00",
  "payinState": 2,
  "sign": "..."
}

7. PHP Integration Example

<?php
function createVardhanPayOrder($mchNo, $secretKey, $orderNo, $amount, $notifyUrl) {
    $params = [
        'mchNo'      => $mchNo,
        'mchOrderNo' => $orderNo,
        'amount'     => number_format((float)$amount, 2, '.', ''),
        'currency'   => 'INR',
        'version'    => 'V3',
        'notifyUrl'  => $notifyUrl
    ];

    uksort($params, 'strcasecmp');
    $signStr = urldecode(http_build_query($params)) . '&key=' . $secretKey;
    $params['sign'] = strtolower(md5($signStr));

    $ch = curl_init('https://api.vardhanpay.com/findRealChannel');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    return json_decode(curl_exec($ch), true);
}