Sign in
परिचय/प्रमाणीकरण

Authentication और Request Signing

अपने project UUID और API key का उपयोग करके HMAC-SHA256 के साथ API request को sign करें।

प्रत्येक API request (incoming webhook को छोड़कर) में आपका project UUID और एक request signature होना ज़रूरी है। Signature यह सिद्ध करता है कि request आपकी ओर से आया है और रास्ते में किसी ने उसे बदला नहीं है।

API keys

2328.io दो keys का उपयोग करता है जो एक ही signing algorithm share करती हैं लेकिन अलग-अलग endpoint को cover करती हैं:

Keyकिस लिए उपयोग होती है
API keyभुगतान, स्टैटिक वॉलेट, बैलेंस, विनिमय दर, और payment / static-wallet webhook का verification
Payout API keyसभी /v1/payout/* endpoint और payout webhook का verification

दोनों keys आपके 2328.io project settings में रहती हैं। नीचे के examples में "API key" सामान्य रूप से लिखा है — आप जिस endpoint को call कर रहे हैं, उसके लिए सही key का उपयोग करें।

दोनों keys को कभी न मिलाएँ: सामान्य API key से payout request को sign करना (या payout key से payment request को sign करना) signature error लौटाता है।

आवश्यक headers

HeaderTypeआवश्यकDescription
Content-Typestringहाँहमेशा application/json
projectstringहाँआपका project UUID
signstringहाँआपकी API key से compute किया गया request का HMAC-SHA256 सिग्नेचर
User-Agentstringहाँआपके एप्लिकेशन की पहचान करता है (जैसे MyShop/1.4 (+https://myshop.example)). User-Agent के बिना अनुरोध ब्लॉक किए जा सकते हैं।

Signature कैसे काम करता है

Signature को request body का fingerprint समझें। इसे इस तरह बनाया जाता है:

  1. Body को JSON में serialize करें (compact — कोई अतिरिक्त whitespace नहीं)।
  2. उस JSON को Base64 में encode करें। यह कदम input को सभी languages में normalise करता है — एक बार जब यह plain ASCII हो जाता है, हर language HMAC के लिए समान bytes produce करती है।
  3. अपनी API key का उपयोग करके Base64 string का HMAC-SHA256 compute करें, फिर परिणाम को lowercase hex में बदलें।

GET और बिना body वाले अन्य request types के लिए, JSON के बजाय एक empty string को sign करें।

किसी दिए गए API key के लिए empty-string सिग्नेचर constant होता है। यदि आप कई GET calls करते हैं तो इसे cache कर सकते हैं।

Implementations

PHP
<?php
function apiSign(array $data, string $apiKey): string {
    $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    $base64 = base64_encode($json);
    return hash_hmac('sha256', $base64, $apiKey);
}

बिना body वाले request (GET)

खाली body वाले request के लिए (जैसे GET /v1/payout/status/{uuid}), एक empty string को sign करें:

Shell
SIGN=$(printf '' | openssl dgst -sha256 -hmac "$API_KEY" -hex | awk '{print $NF}')

पूरा request example

Shell
curl -X POST https://api.2328.io/api/v1/payment \
  -H "Content-Type: application/json" \
  -H "User-Agent: MyShop/1.0 (+https://myshop.example)" \
  -H "project: YOUR_PROJECT_UUID" \
  -H "sign: YOUR_HMAC_SIGNATURE" \
  -d '{"amount":"100.00","currency":"USD","order_id":"ORDER-123"}'

अपनी API key को client-side code में कभी expose न करें। Request को अपने backend पर sign करें। एक leak हुई API key किसी को भी आपके merchant account तक पूरी पहुँच दे देती है।

Webhook signatures को verify करना

जब 2328.io आपको webhook भेजता है, तो वही algorithm उल्टा चलता है:

  1. Payload से sign field निकालें।
  2. बाकी fields को JSON-encode करें (compact, बिना whitespace)।
  3. उस string को Base64-encode करें।
  4. उपयुक्त key के साथ HMAC-SHA256 compute करें।
  5. इसकी तुलना प्राप्त sign से constant-time comparison के साथ करें (hash_equals, crypto.timingSafeEqual, hmac.compare_digest, subtle.ConstantTimeCompare, OpenSSL.fixed_length_secure_compare)।

Signing key webhook source पर निर्भर करती है:

WebhookVerify करने की key
Payment / static-wallet webhooks (/v1/payment, /v1/static-wallet)API key
Payout webhooks (/v1/payout)Payout API key

सत्यापन के सामान्य pitfalls. आपका JSON encoder बिल्कुल वही bytes उत्पन्न करना चाहिए जो भेजने वाले ने उत्पन्न किए — अन्यथा Base64 अलग होगा और signature मेल नहीं खाएगी।

  • Go: json.NewEncoder का उपयोग SetEscapeHTML(false) के साथ करें। डिफ़ॉल्ट json.Marshal, <, >, & को < के रूप में escape करता है और signature तोड़ देता है।
  • Python: json.dumps को ensure_ascii=False पास करें। इसके बिना, गैर-ASCII (Cyrillic, Chinese, …) अक्षर \uXXXX के रूप में escape हो जाते हैं।
  • Compact JSON: फ़ील्ड्स के बीच कोई whitespace नहीं (Python में separators=(",", ":"))।
  • फ़ील्ड क्रम (Go): एक सादा map[string]any re-encode पर keys को randomise कर देता है। json.RawMessage, एक ordered struct का उपयोग करें, या raw bytes से sign को हटा दें।

यदि सत्यापन बार-बार विफल हो रहा है, तो स्वयं payload पर apiSign चलाएं — यह प्राप्त sign के समान ही hex string उत्पन्न करना चाहिए।

एक वैध signature replays को नहीं रोकती। यह केवल यह साबित करती है कि webhook 2328.io से आया है — यह किसी हमलावर को बाद में कैप्चर किए गए webhook को फिर से पोस्ट करने से नहीं रोकती। फंड क्रेडिट करने से पहले हमेशा uuid (या static wallets के लिए txid) से idempotency जांचें। यदि signature गायब है या गलत है तो HTTP 401 से reject करें।

पूर्ण code examples Webhook Notifications पर हैं। Retry handling और idempotency नियम Best practices में हैं।