PHP SDK
एक फ़ाइल, कोई निर्भरता नहीं। createInvoice(), getInvoice() और verifyWebhook() — इसे किसी भी प्रोजेक्ट में डालें।
एकल निर्भरता-मुक्त PHP SDK: चालान बनाएं, होस्टेड चेकआउट पर रीडायरेक्ट करें, और साइन किए गए वेबहुक्स की पुष्टि करें। किसी भी भाषा के लिए REST उपलब्ध है।
api.payora.moneyएक API कॉल जिसमें एक ऑर्डर आईडी और एक फिएट या क्रिप्टो राशि होती है, एक होस्टेड पे URL लौटाता है।
वे एक सिक्का चुनते हैं, QR को स्कैन करते हैं या एक वॉलेट खोलते हैं, और चेकआउट अंतिमता पर लाइव पुष्टि करता है।
HMAC हस्ताक्षर की पुष्टि करें, एक बार आदेश को क्रेडिट करें, और देखें कि भुगतान आपके बैलेंस पर कैसे आता है।
एक फ़ाइल, कोई निर्भरता नहीं। createInvoice(), getInvoice() और verifyWebhook() — इसे किसी भी प्रोजेक्ट में डालें।
अनुरोध और वेबहुक्स HMAC-SHA256 के साथ टाइमस्टैम्प स्क्यू और आइडेम्पोटेंसी कुंजी के साथ साइन किए गए हैं।
HTTPS पर साधारण JSON — किसी भी स्टैक से एकीकृत करें, केवल PHP नहीं।
<?php
require 'Payora.php';
$payora = new Payora('https://api.payora.money', getenv('PAYORA_KEY'), getenv('PAYORA_SECRET'));
// 1 — create an invoice (fiat-priced; the payer picks a coin)
$inv = $payora->createInvoice([
'order_id' => 'ORDER-42',
'mode' => 'fiat',
'amount' => '9.99',
'return_url' => 'https://shop.example/thanks',
'lang' => 'en',
], 'ORDER-42'); // Idempotency-Key: a retry never creates a second invoice
header('Location: ' . $inv['pay_url']);
// 2 — webhook endpoint: ALWAYS verify the signature first
$event = $payora->verifyWebhook(file_get_contents('php://input'), getallheaders());
if ($event === null) { http_response_code(400); exit; }
if ($event['status'] === 'paid') {
creditOrderOnce($event['id'], $event['order_id'], $event['amount'], $event['currency']);
}
http_response_code(200); // 2xx stops retriesconst Payora = require('./payora');
const payora = new Payora('https://api.payora.money', process.env.PAYORA_KEY, process.env.PAYORA_SECRET);
// 1 — create an invoice and redirect
app.post('/checkout', async (req, res) => {
const inv = await payora.createInvoice({ order_id: 'ORDER-42', mode: 'fiat', amount: '9.99' }, 'ORDER-42');
res.redirect(inv.pay_url);
});
// 2 — webhook: verify over the RAW body
app.post('/payora/webhook', express.raw({ type: '*/*' }), (req, res) => {
const event = payora.verifyWebhook(req.body, req.headers);
if (event === null) return res.status(400).end();
if (event.status === 'paid') creditOrderOnce(event.id, event.order_id);
res.status(200).end();
});import os
from payora import Payora
payora = Payora('https://api.payora.money', os.environ['PAYORA_KEY'], os.environ['PAYORA_SECRET'])
# 1 — create an invoice and redirect
inv = payora.create_invoice({'order_id': 'ORDER-42', 'mode': 'fiat', 'amount': '9.99'}, 'ORDER-42')
return redirect(inv['pay_url'])
# 2 — webhook: verify over the RAW body
event = payora.verify_webhook(request.get_data(), dict(request.headers))
if event is None:
return ('', 400)
if event['status'] == 'paid':
credit_order_once(event['id'], event['order_id'])
return ('', 200)# signature = lowercase hex HMAC-SHA256(api_secret, timestamp + "." + raw_body)
BODY='{"order_id":"ORDER-42","mode":"fiat","amount":"9.99"}'
TS=$(date +%s)
SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$PAYORA_SECRET" | cut -d' ' -f2)
curl -X POST https://api.payora.money/v1/invoice \
-H "X-Payora-Key: $PAYORA_KEY" -H "X-Payora-Timestamp: $TS" \
-H "X-Payora-Signature: $SIG" -H 'Idempotency-Key: ORDER-42' \
-H 'Content-Type: application/json' -d "$BODY"
# → 201 { "invoice_id": …, "status": "pending", "pay_url": "https://pay.payora.money/i/…", "expires": … }Get your API key and secret by creating an account. The full SDK is in your dashboard.
हर कॉल /v1/health को छोड़कर तीन हस्ताक्षरित हेडर ले जाती है। हस्ताक्षर यह साबित करता है कि अनुरोध आपके api_secret के धारक से आया है और रास्ते में इसे नहीं बदला गया।
| हेडर | मान | विवरण |
|---|---|---|
X-Payora-Key | pk_… | आपकी सार्वजनिक api_key। स्टोर की पहचान करता है। |
X-Payora-Timestamp | unix seconds | जिस क्षण आपने अनुरोध पर हस्ताक्षर किया, यूनिक्स सेकंड में। |
X-Payora-Signature | hex · 64 | timestamp + "." + कच्चे शरीर का लोअरकेस हेक्स HMAC-SHA256, आपके api_secret के साथ कुंजीबद्ध। |
X-Payora-Test | 1 | एक चालान को आपके एकीकरण के परीक्षण के रूप में चिह्नित करता है: यह वास्तविक है और सिक्के प्राप्त कर सकता है, लेकिन मांग और रूपांतरण रिपोर्ट से बाहर रहता है। |
Idempotency-Key | string | POST /v1/invoice और POST /v1/payout पर वैकल्पिक। एक ही कुंजी के साथ पुनः प्रयास करने से पहले परिणाम लौटता है बजाय कि डुप्लिकेट बनाने के; एक अलग शरीर के साथ वही कुंजी 409 का उत्तर देती है। |
Content-Type | application/json | उन अनुरोधों पर आवश्यक है जो एक शरीर ले जाते हैं। |
hex( HMAC-SHA256( api_secret, timestamp + "." + raw_body ) )आप जो सटीक बाइट्स भेजते हैं, उस पर हस्ताक्षर करें। हस्ताक्षर करने के बाद JSON को फिर से एन्कोड करना — यहां तक कि कुंजियों को पुनर्व्यवस्थित करना या एक स्थान जोड़ना — सिग्नेचर को तोड़ देता है।
GET अनुरोध के लिए शरीर खाली है, इसलिए हस्ताक्षरित स्ट्रिंग timestamp है जिसके बाद एक बिंदु है।
API 120 सेकंड से अधिक समय दूर के timestamp को अस्वीकार करता है। अपने सर्वर को NTP के साथ समन्वय में रखें।
अपने सर्वर पर api_secret रखें। यह अनुरोधों और वेबहुक्स दोनों पर हस्ताक्षर करता है: जो भी इसे रखता है वह आपके नाम पर चालान बना सकता है और कॉलबैक को जाली बना सकता है।
<?php
$body = json_encode(['order_id' => 'ORDER-42', 'mode' => 'fiat', 'amount' => '9.99'], JSON_UNESCAPED_SLASHES);
$ts = (string) time();
$sig = hash_hmac('sha256', $ts . '.' . $body, $apiSecret); // lowercase hex
$ch = curl_init('https://api.payora.money/v1/invoice');
curl_setopt_array($ch, [
CURLOPT_POST => true, CURLOPT_POSTFIELDS => $body, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-Payora-Key: ' . $apiKey,
'X-Payora-Timestamp: ' . $ts,
'X-Payora-Signature: ' . $sig,
'Idempotency-Key: ORDER-42',
'Content-Type: application/json',
],
]);
$invoice = json_decode(curl_exec($ch), true);const crypto = require('crypto');
const body = JSON.stringify({ order_id: 'ORDER-42', mode: 'fiat', amount: '9.99' });
const ts = String(Math.floor(Date.now() / 1000));
const sig = crypto.createHmac('sha256', API_SECRET).update(ts + '.' + body).digest('hex');
const res = await fetch('https://api.payora.money/v1/invoice', {
method: 'POST',
headers: {
'X-Payora-Key': API_KEY,
'X-Payora-Timestamp': ts,
'X-Payora-Signature': sig,
'Idempotency-Key': 'ORDER-42',
'Content-Type': 'application/json',
},
body, // send exactly the bytes you signed
});import hashlib, hmac, json, time, urllib.request
body = json.dumps({'order_id': 'ORDER-42', 'mode': 'fiat', 'amount': '9.99'}, separators=(',', ':'))
ts = str(int(time.time()))
sig = hmac.new(API_SECRET.encode(), (ts + '.' + body).encode(), hashlib.sha256).hexdigest()
req = urllib.request.Request('https://api.payora.money/v1/invoice', data=body.encode(), method='POST', headers={
'X-Payora-Key': API_KEY,
'X-Payora-Timestamp': ts,
'X-Payora-Signature': sig,
'Idempotency-Key': 'ORDER-42',
'Content-Type': 'application/json',
})
invoice = json.load(urllib.request.urlopen(req))# GET has an empty body: the signed string is just the timestamp and a dot
TS=$(date +%s)
SIG=$(printf '%s.' "$TS" | openssl dgst -sha256 -hmac "$PAYORA_SECRET" | cut -d' ' -f2)
curl https://api.payora.money/v1/invoice/1042 \
-H "X-Payora-Key: $PAYORA_KEY" \
-H "X-Payora-Timestamp: $TS" \
-H "X-Payora-Signature: $SIG"सभी वैकल्पिक हैं सिवाय order_id और amount। फिएट मोड भुगतान करने वाले को आपके खाते पर सक्षम किसी भी सिक्के को चुनने की अनुमति देता है; क्रिप्टो मोड को भी currency की आवश्यकता होती है।
| पैरामीटर | प्रकार | विवरण |
|---|---|---|
order_id | string · required | आपका अद्वितीय ऑर्डर संदर्भ (≤190 वर्ण)। एक पुनरावृत्ति 409 के साथ अस्वीकृत होती है - डबल-सबमिशन के खिलाफ सुरक्षित। |
amount | string · required | Fiat amount (mode=fiat) or exact crypto amount (mode=crypto). |
mode | fiat | crypto | डिफ़ॉल्ट फिएट: चेकआउट पर प्रति कॉइन दर लॉक की गई। क्रिप्टो कॉइन + राशि को पहले से तय करता है। |
fiat_currency | string | ISO fiat code for fiat mode (default USD). |
currency | string | क्रिप्टो मोड के लिए कॉइन (जैसे TON, TRX, USDT_TRON)। |
return_url | https URL | जहां चेकआउट का “स्टोर पर लौटें” बटन ग्राहक को वापस भेजता है - आपकी साइट। केवल पूर्ण http(s)। |
lang | en·ru·uk·es·de | चेकआउट भाषा, ताकि आपके रूसी स्टोर से एक ग्राहक रूसी चेकआउट देख सके - अंग्रेजी नहीं। इसे भुगतान URL पर ?lang=ru के रूप में भी सेट किया जा सकता है। |
ttl | seconds | चालान कितनी देर तक भुगतान योग्य रहता है (120–86400 सेकंड, डिफ़ॉल्ट 1800)। |
customer_email | Optional — receipt + emailed to the payer. | |
notes | string | चालान पर संग्रहीत फ्री-फॉर्म नोट। |
return_url और lang भी उस pay_url के लिए क्वेरी पैरामीटर के रूप में काम करते हैं जो API आपको देता है — <pay_url>&lang=ru&return_url=https://shop.example/thanks। हमेशा खरीदार को API द्वारा लौटाए गए pay_url पर भेजें: इसमें एक-प्रति-चालान एक्सेस टोकन होता है, इसलिए चालान नंबरों का अनुमान लगाकर चेकआउट पृष्ठ तक नहीं पहुंचा जा सकता। चालान आईडी से लिंक को फिर से न बनाएं।
फील्ड भरें और एक तैयार cURL कमांड कॉपी करें। यह अपने आप को आपके शेल में $PAYORA_KEY और $PAYORA_SECRET के साथ हस्ताक्षरित करता है — यह पृष्ठ कभी भी आपकी कुंजियों को नहीं देखता और कुछ भी नहीं भेजता।
BODY='{"order_id":"ORDER-42","mode":"fiat","amount":"9.99","fiat_currency":"USD","return_url":"https://shop.example/thanks","lang":"hi","ttl":1800}'
TS=$(date +%s)
SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$PAYORA_SECRET" | cut -d' ' -f2)
curl -X POST https://api.payora.money/v1/invoice \
-H "X-Payora-Key: $PAYORA_KEY" \
-H "X-Payora-Timestamp: $TS" \
-H "X-Payora-Signature: $SIG" \
-H 'Idempotency-Key: ORDER-42' \
-H 'Content-Type: application/json' \
-d "$BODY"इस पृष्ठ से कुछ भी नहीं भेजा जाता है।
जब एक चालान या भुगतान की स्थिति बदलती है, तो Payora आपके कॉलबैक URL पर एक साइन किया हुआ JSON इवेंट POST करता है। पहले सिग्नेचर की पुष्टि करें, एक बार ऑर्डर को क्रेडिट करें, उत्तर 2xx।
| इवेंट | status | जब यह सक्रिय होता है |
|---|---|---|
invoice.paid | paid | भुगतान ऑन-चेन पुष्टि किया गया है। इसमें राशि, सिक्का और tx_hash शामिल है। |
invoice.underpaid | underpaid | चालान उस राशि के आने के बाद समाप्त हो गया जो अपेक्षित थी। |
invoice.expired | expired | चालान समाप्त हो गया जब कुछ भी प्राप्त नहीं हुआ। |
invoice.cancelled | cancelled | चालान रद्द कर दिया गया। पहले से आई हुई राशि, यदि कोई हो, इवेंट में वर्णित है। |
invoice.cancel_settled | — | रद्द किए गए चालान पर आई राशि का निपटान किया गया है: क्रेडिट किया गया या वापस भेजा गया। |
invoice.late_payment | — | वह पैसा जो एक चालान पर आया जब उसे रद्द किया गया। प्रत्येक ऐसे जमा के लिए एक बार भेजा गया; परिणाम बताता है कि इसे क्रेडिट किया गया था या इसे वापस किया जा रहा है। |
payout.sent | sent | एक भुगतान बैच पर हस्ताक्षर किए गए और प्रसारित किए गए। इसमें प्रत्येक आइटम इसके tx_hash के साथ शामिल है। |
| हेडर | मान | विवरण |
|---|---|---|
X-Payora-Id | uuid | विशिष्ट इवेंट आईडी, जो शरीर में आईडी के समान है। इसे दोहराव को अनदेखा करने के लिए स्टोर करें। |
X-Payora-Event | invoice.paid | इवेंट नाम। |
X-Payora-Timestamp | unix seconds | जब यह प्रयास हस्ताक्षरित किया गया था। |
X-Payora-Signature | hex · 64 | अनुरोधों के समान योजना: timestamp का HMAC-SHA256 + "." + आपके api_secret के साथ कच्चा शरीर। |
| क्षेत्र | प्रकार | विवरण |
|---|---|---|
id | uuid | डुप्लिकेशन से बचने के लिए इवेंट आईडी। |
event | string | इवेंट नाम। |
invoice_id | int | Payora चालान संख्या। |
order_id | string | आपका ऑर्डर संदर्भ, जैसा कि चालान बनाते समय भेजा गया था। |
status | string | paid के लिए invoice.paid। |
currency | string | भुगतानकर्ता द्वारा उपयोग की गई मुद्रा, जैसे कि USDT_TRON। |
amount | decimal string | प्राप्त राशि। |
amount_units | integer string | सिक्के की सबसे छोटी इकाइयों में वही राशि — इसका उपयोग सटीक तुलना के लिए करें। |
expected | decimal string | चालान के लिए मांगी गई राशि। |
fiat_amount | decimal string | null | जैसा आपने चालान बनाया, उसका फिएट मूल्य; क्रिप्टो-मोड चालानों के लिए शून्य। |
fiat_currency | string | null | fiat_amount का ISO कोड; क्रिप्टो-मोड चालानों के लिए शून्य। |
tx_hash | string | ऑन-चेन लेनदेन हैश। |
paid_at | unix seconds | जब इवेंट बनाया गया था। |
test | bool | true के लिए सैंडबॉक्स चालान। |
{
"id": "6f1c2a4e-8b0d-4c1e-9a57-2f3d9e1b7c40",
"event": "invoice.paid",
"invoice_id": 1042,
"order_id": "ORDER-42",
"status": "paid",
"currency": "USDT_TRON",
"amount": "9.99",
"amount_units": "9990000",
"expected": "9.99",
"fiat_amount": "9.99",
"fiat_currency": "USD",
"tx_hash": "3f9a…c21e",
"paid_at": 1758038400,
"test": false
}जब प्राप्त राशि चालान से भिन्न होती है, तो amount_received और amount_expected जोड़ी जाती हैं।
2xx के अलावा कुछ भी, या 15 सेकंड के भीतर कोई उत्तर नहीं, को पुनः प्रयास किया जाता है जिसमें प्रयासों के बीच एक घंटे की सीमा के साथ गुणात्मक बैकऑफ होता है — 12 प्रयासों तक। प्रत्येक प्रयास को एक नए टाइमस्टैम्प के साथ फिर से हस्ताक्षरित किया जाता है; शरीर और इवेंट आईडी वही रहते हैं, इसलिए आईडी पर डुप्लिकेट से बचें।
अंतिम प्रयास के बाद इवेंट को विफल के रूप में चिह्नित किया जाता है और स्टोर के मालिक को एक ईमेल मिलता है। रीडायरेक्ट का कभी पालन नहीं किया जाता है, और कॉलबैक URL इंटरनेट से पहुंच योग्य होना चाहिए — कोई लोकलहोस्ट या निजी पते नहीं।
hash_equals, crypto.timingSafeEqual, hmac.compare_digest।<?php
require 'Payora.php';
$payora = new Payora('https://api.payora.money', getenv('PAYORA_KEY'), getenv('PAYORA_SECRET'));
$raw = file_get_contents('php://input'); // raw, before any parsing
$event = $payora->verifyWebhook($raw, getallheaders()); // HMAC + ±300 s window, constant-time
if ($event === null) { http_response_code(400); exit; } // bad / forged / stale
if ($event['event'] === 'invoice.paid' && !alreadyProcessed($event['id'])) {
creditOrder($event['order_id'], $event['amount'], $event['currency'], $event['tx_hash']);
rememberProcessed($event['id']);
}
http_response_code(200); // 2xx stops retries// Express: capture the RAW body for this route
app.post('/payora/webhook', express.raw({ type: '*/*' }), (req, res) => {
const event = payora.verifyWebhook(req.body, req.headers); // HMAC + ±300 s, timingSafeEqual
if (event === null) return res.status(400).end();
if (event.event === 'invoice.paid' && !alreadyProcessed(event.id)) {
creditOrder(event.order_id, event.amount, event.currency, event.tx_hash);
rememberProcessed(event.id);
}
res.status(200).end(); // 2xx stops retries
});# Flask: request.get_data() is the exact raw body
@app.post('/payora/webhook')
def payora_webhook():
event = payora.verify_webhook(request.get_data(), dict(request.headers))
if event is None:
return ('', 400) # bad / forged / stale
if event['event'] == 'invoice.paid' and not already_processed(event['id']):
credit_order(event['order_id'], event['amount'], event['currency'], event['tx_hash'])
remember_processed(event['id'])
return ('', 200) # 2xx stops retries# Recompute the signature of a delivery you saved byte-for-byte to body.json
TS='1758038400' # X-Payora-Timestamp
SIG='…' # X-Payora-Signature
EXPECTED=$(printf '%s.' "$TS" | cat - body.json | openssl dgst -sha256 -hmac "$PAYORA_SECRET" | cut -d' ' -f2)
[ "$EXPECTED" = "$SIG" ] && echo valid || echo forgedएक गुप्त, एक टाइमस्टैम्प और कच्चा बॉडी दर्ज करें ताकि आप देख सकें कि Payora कौन सा सटीक सिग्नेचर भेजेगा — या एक की जांच करें जो आपने प्राप्त की।
यह आपके ब्राउज़र में WebCrypto के साथ चलता है। आप जो कुछ भी टाइप करते हैं वह इस पृष्ठ को नहीं छोड़ता। साझा कंप्यूटर पर एक परीक्षण गुप्त का उपयोग करें, न कि एक लाइव।
1758038400.{…}X-Payora-Timestamp: 1758038400
X-Payora-Signature: …तुलना करने के लिए एक सिग्नेचर पेस्ट करें
क्रिप्टो को एक साइन किए गए, आइडेम्पोटेंट अनुरोध में 500 वॉलेट्स तक भेजें — payroll, सहयोगी भुगतान या निकासी के लिए। बैच कुल और प्रति-आइटम शुल्क आपके internal balance पर तुरंत रखा जाता है; ऑपरेटर हस्ताक्षर करता है और प्रसारित करता है, फिर एक साइन किया हुआ payout.sent वेबहुक सक्रिय होता है। बाकी सब की तरह वही HMAC प्रमाणीकरण।
# create a payout batch — funds held instantly, sent by the operator
curl -X POST https://api.payora.money/v1/payout \
-H 'X-Payora-Key: pk_…' -H 'X-Payora-Timestamp: 1700000000' \
-H 'X-Payora-Signature: <hmac-sha256>' -H 'Idempotency-Key: payroll-2026-01' \
-d '{"currency":"USDT_TRON","items":[
{"address":"TR7…","amount":"250.00"},
{"address":"TX9…","amount":"99.50","tag":"batch-A"}]}'
# → 201 Created
{ "batch_id": 812, "status": "pending", "currency": "USDT_TRON",
"item_count": 2, "total": "349.50", "fee": "…", "items": [ … ] }
# poll status, or receive a signed payout.sent webhook when it is sent
curl https://api.payora.money/v1/payout/812 -H 'X-Payora-Key: …' …<?php
// The one-file PHP SDK covers invoices and webhooks; payouts are one signed POST.
$body = json_encode(['currency' => 'USDT_TRON', 'items' => [
['address' => 'TR7…', 'amount' => '250.00'],
['address' => 'TX9…', 'amount' => '99.50', 'tag' => 'batch-A'],
]], JSON_UNESCAPED_SLASHES);
$ts = (string) time();
$sig = hash_hmac('sha256', $ts . '.' . $body, $apiSecret);
$ch = curl_init('https://api.payora.money/v1/payout');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => $body, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-Payora-Key: ' . $apiKey, 'X-Payora-Timestamp: ' . $ts, 'X-Payora-Signature: ' . $sig,
'Idempotency-Key: payroll-2026-01', 'Content-Type: application/json']]);
$batch = json_decode(curl_exec($ch), true); // 201: batch_id, status, totals, fee, itemsconst batch = await payora.createPayout({
currency: 'USDT_TRON',
items: [
{ address: 'TR7…', amount: '250.00' },
{ address: 'TX9…', amount: '99.50', tag: 'batch-A' },
],
}, 'payroll-2026-01'); // Idempotency-Key: a retried run never doubles
const status = await payora.getPayout(batch.batch_id);
// still pending? await payora.cancelPayout(batch.batch_id) releases the holdbatch = payora.create_payout({
'currency': 'USDT_TRON',
'items': [
{'address': 'TR7…', 'amount': '250.00'},
{'address': 'TX9…', 'amount': '99.50', 'tag': 'batch-A'},
],
}, 'payroll-2026-01') # Idempotency-Key: a retried run never doubles
status = payora.get_payout(batch['batch_id'])
# still pending? payora.cancel_payout(batch['batch_id']) releases the holdValidation is strict: any bad address or over-precise amount rejects the whole batch (HTTP 422) with the offending item indexes — a payroll run never silently drops a recipient. Cancel a still-pending batch with POST /v1/payout/{id}/cancel to release the hold. See the architecture write-up.
हर एंडपॉइंट HTTPS पर साधारण JSON बोलता है api.payora.money पर। सभी को छोड़कर /v1/health वही HMAC-SHA256 अनुरोध प्रमाणीकरण का उपयोग करते हैं। मशीन-पठनीय विनिर्देश openapi.json पर है।
| एंडपॉइंट | एक्सेस | विवरण |
|---|---|---|
GET/v1/health | no auth | Service status plus the list of enabled currencies. |
POST/v1/invoice | auth | एक चालान बनाएं (फिएट या क्रिप्टो मोड)। समर्थन करता है Idempotency-Key। 201 लौटाता है जिसमें invoice_id, status, pay_url और expires; क्रिप्टो मोड पता, राशि और डीपलिंक जोड़ता है। |
GET/v1/invoice/{id} | auth | Invoice status (own invoices only): status, remaining, and the charge — currency, address, expected/received amounts and tx_hash. |
POST/v1/payout | auth · Pro+ | एक सामूहिक भुगतान बैच बनाएं (कठोर सत्यापन, धन तुरंत रोका गया)। समर्थन करता है Idempotency-Key। बैच दृश्य के साथ 201 लौटाता है: batch_id, status, कुल, शुल्क, आइटम। |
GET/v1/payout | auth | List your recent payout batches (?limit=, default 50). |
GET/v1/payout/{id} | auth | Payout batch status and items (own batches only). |
POST/v1/payout/{id}/cancel | auth | एक अभी भी लंबित बैच को रद्द करें और रखी गई राशि को जारी करें। यदि बैच अब रद्द नहीं किया जा सकता है तो 409 लौटाता है। |
कोई एंडपॉइंट मेल नहीं खाता।
कोई निर्भरता न होने वाली एकल फ़ाइलें। प्रत्येक SDK अनुरोधों पर हस्ताक्षर करता है और वेबहुक को उसी तरह सत्यापित करता है।
PHP 7.4+ cURL के साथ, एक फ़ाइल। createInvoice, getInvoice और verifyWebhook।
Node.js केवल अंतर्निहित https और क्रिप्टो के साथ। चालान, बैलेंस, भुगतान और verifyWebhook।
केवल Python मानक पुस्तकालय। चालान, बैलेंस, भुगतान और verify_webhook।
एक Postman संग्रह जो आपके लिए हर कॉल पर हस्ताक्षर करता है।
प्रत्येक एंडपॉइंट का मशीन-पठनीय स्पेक, कोड जनरेटर और API क्लाइंट के लिए।
एक तैयार मॉड्यूल आपके लिए उपरोक्त सभी करता है: चालान, रीडायरेक्ट और एक सत्यापित वेबहुक।
साफ जवाब, जिसमें असहज सवाल शामिल हैं: हिरासत, शुल्क और जब कुछ गलत होता है तो क्या होता है।
सहायता केंद्रएकल-फाइल PHP SDK (कोई निर्भरता नहीं) स्थापित करें या सीधे REST API को कॉल करें। createInvoice() के साथ एक चालान बनाएं, ग्राहक को उसके pay_url पर रीडायरेक्ट करें, और एक वेबहुक इवेंट को संभालें: status=paid। एक सक्षम डेवलपर 30-60 मिनट में लाइव है।
हाँ। सब कुछ HTTPS पर साधारण JSON है, इसलिए आप किसी भी भाषा से एकीकृत कर सकते हैं। PHP SDK समान एंडपॉइंट्स के चारों ओर एक सुविधाwrapper है - चालान बनाना, चालान प्राप्त करना, और वेबहुक हस्ताक्षरों को सत्यापित करना।
हाँ। जब आप इनवॉइस बनाते हैं तो return_url पास करें (या भुगतान लिंक पर ?return_url=) और चेकआउट सफलता स्क्रीन पर आपकी साइट पर वापस जाने के लिए “स्टोर पर लौटें” बटन दिखाता है — और भुगतान करते समय। lang (en, ru, uk, es, de) पास करें, या लिंक पर ?lang=, ताकि आपके रूसी स्टोर से ग्राहक अंग्रेजी के बजाय रूसी चेकआउट पर पहुंचे। दोनों वैकल्पिक हैं; return_url एक पूर्ण http(s) URL होना चाहिए।
अनुरोध और वेबहुक को आपके api_secret का उपयोग करके टाइमस्टैम्प और कच्चे शरीर पर HMAC-SHA256 के साथ प्रमाणित किया जाता है, ±120-सेकंड स्क्यू विंडो और आइडेम्पोटेंसी कुंजी के साथ। समय हमलों को रोकने के लिए हस्ताक्षरों की तुलना स्थिर समय में की जाती है।
एक मुफ्त खाता बनाएं। आपका सार्वजनिक api_key और गुप्त api_secret डैशबोर्ड में दिखाई देते हैं, साथ ही डाउनलोड करने योग्य SDK और पूर्ण वेबहुक संदर्भ। सेटिंग्स से किसी भी समय कुंजी घुमाएं।
एक साइन किया हुआ JSON इवेंट जिसमें इनवॉइस आईडी, आपका ऑर्डर_आईडी, स्थिति (उदाहरण के लिए भुगतान किया गया), राशि और मुद्रा, और आइडेम्पोटेंसी के लिए एक अद्वितीय इवेंट आईडी शामिल है। हमेशा ऑर्डर को क्रेडिट करने से पहले सिग्नेचर की पुष्टि करें, फिर डबल-प्रोसेसिंग से बचने के लिए इवेंट आईडी को रिकॉर्ड करें।
हाँ। POST /v1/payout एक अनुरोध में 500 वॉलेट्स तक क्रिप्टो भेजता है - प्रति आइटम एक {पता, राशि, वैकल्पिक टैग}, आपके खाते पर सक्षम किसी भी सिक्के में। यह चालान API के समान HMAC-SHA256 प्रमाणीकरण और Idempotency-Key का उपयोग करता है, इसलिए एक पुनः प्रयास किया गया अनुरोध कभी भी एक डुप्लिकेट बैच नहीं बनाता। बैच कुल और प्रति-आइटम शुल्क तुरंत आपके बैलेंस पर सुरक्षित किया जाता है; ऑपरेटर हस्ताक्षर करता है और प्रसारित करता है, फिर एक हस्ताक्षरित payout.sent वेबहुक सक्रिय होता है। मान्यता सख्त है - कोई भी अमान्य पता या अत्यधिक सटीक राशि पूरे बैच को अस्वीकृत कर देती है (422) इसलिए एक पेरोल रन कभी भी चुपचाप एक प्राप्तकर्ता को नहीं छोड़ता।
अपने सिस्टम में प्राप्तकर्ता सूची बनाएं, फिर प्रति रन एक स्थिर Idempotency-Key (उदाहरण के लिए payroll-2026-01) के साथ POST /v1/payout कॉल करें। GET /v1/payout/{id} को पोल करें या डिलीवरी की पुष्टि करने और प्रत्येक tx हैश को रिकॉर्ड करने के लिए payout.sent वेबहुक का इंतजार करें। बैच जमा करने से फंड सुरक्षित होते हैं लेकिन यह अपने आप उन्हें स्थानांतरित नहीं करता — ऑपरेटर हस्ताक्षर करता है और प्रसारित करता है, इसलिए केवल API कॉल पर कुछ भी नहीं निकलता।
एकल निर्भरता-मुक्त PHP SDK: चालान बनाएं, होस्टेड चेकआउट पर रीडायरेक्ट करें, और साइन किए गए वेबहुक्स की पुष्टि करें। किसी भी भाषा के लिए REST उपलब्ध है।