Payments सेटअप — और वह एक step जो चुपचाप पैसे गँवाता है
Payment credentials केवल server-side हैं: वे आपकी machine पर .env में या admin page से encrypted रूप में रहते हैं, कभी सादे रूप में database में नहीं और कभी किसी सहेजी गई value के रूप में दिखाए नहीं जाते। यह जानबूझकर है। आगे बताया है कि हर value कहाँ जाती है — और वह एक step जो छूटना आसान है और छूटना महँगा।
वह step जो छोड़ने पर पैसे गँवाता है
अधिकांश Indonesian payment methods asynchronous हैं। एक खरीदार एक virtual account, एक e-wallet चुनता है, या एक retail outlet पर भुगतान करता है, और फिर tab बंद कर देता है। वे शायद एक घंटे बाद, अपने banking app से, एक अलग device पर भुगतान पूरा करें। उसके बारे में कुछ भी कभी आपकी website पर वापस नहीं आता।
तो purchase provider द्वारा आपके सर्वर को call करने से पूरी होती है — एक webhook — और किसी और चीज़ से नहीं।
अगर वह call कभी नहीं आता:
- खरीदार का पैसा आप तक पहुँचता है,
- उनकी licence कभी जारी नहीं होती,
- order "pending" पर बैठा रहता है,
- और कहीं कुछ भी नहीं बताता क्यों।
यह कोई दुर्लभ edge case नहीं है। Indonesian methods पर यह सामान्य रास्ता है।
हर provider को उसका URL कहाँ मिलता है
| Provider | Webhook URL | कौन सेट करता है |
|---|---|---|
| Xendit | https://yourdomain/webhooks/xendit |
आप, हाथ से, एक बार |
| PayPal | (कोई नहीं) | ज़रूरत नहीं — यह return पर पूरा हो जाता है |
PayPal तब पूरा होता है जब खरीदार वापस आता है, तो इसे किसी webhook की ज़रूरत ही नहीं। Xendit वह है जिसे आपकी ज़रूरत है — नीचे देखें।
Xendit वह है जिसे आपकी ज़रूरत है। इसका "invoice paid" callback account-wide है, per-invoice नहीं, तो इसे Xendit के अपने dashboard में एक बार सेट किया जाता है।
Xendit, चरण दर चरण
- dashboard.xendit.co पर sign in करें।
- Settings → Developers → Webhooks।
- Invoices paid के नीचे, वह URL paste करें जो आपका admin page Xendit के लिए दिखाता है
(
https://yourdomain/webhooks/xendit)। - Save करें, और उसी पेज पर दिखाया webhook verification token copy करें।
- उस token को अपने सर्वर के
.envमेंXENDIT_CALLBACK_TOKENके रूप में रखें,XENDIT_SECRET_KEYके साथ। - साइट को restart करें ताकि नई values पढ़ी जाएँ।
दोनों हिस्से ज़रूरी हैं। token के बिना URL का मतलब है deliveries आती हैं और मना कर दी जाती हैं; URL के बिना token का मतलब है कुछ भी नहीं आता।
यह साबित करना कि यह असल में काम करता है
"मैंने इसे paste कर दिया" पर भरोसा न करें। Admin → Settings → Payment webhooks खोलें। यह बताता है कि क्या सचमुच आपके सर्वर तक पहुँचा है:
| यह क्या कहता है | इसका मतलब | क्या करें |
|---|---|---|
| Never received | इस provider से कभी कुछ नहीं आया | URL provider के dashboard में गायब है या ग़लत है |
| Not matching | Deliveries आती हैं पर आपके किसी order का नाम नहीं लेतीं | URL आप पर एक अलग provider account से point करता है, न कि उससे जो store उपयोग करता है |
| Working | कम-से-कम एक delivery एक असली order से मेल खाई | कुछ नहीं — यह जुड़ा हुआ है |
Counters केवल उन calls के लिए हिलते हैं जो provider के अपने credentials ले जाती हैं, तो इंटरनेट से एक यादृच्छिक probe कभी एक unconfigured gateway को स्वस्थ नहीं दिखा सकती।
असली पैसा लेने से पहले इसे end to end test करें। Xendit के dashboard में उसी पेज पर एक "test webhook" बटन
है; उसका उपयोग करें, फिर admin card reload करें। अगर यह अब भी Never received कहता है, तो URL ग़लत है —
एक typo, एक गायब https://, या एक trailing slash की जाँच करें।
Credentials ख़ुद
इन्हें सेट करने के दो तरीक़े हैं। दोनों secret को नज़रों से दूर रखते हैं — कोई भी कभी कोई सहेजी गई value नहीं दिखाता।
Admin page से (अनुशंसित)
Admin → Settings → Payment gateway credentials। PayPal Client ID + Secret (और sandbox/live स्विच) और
Xendit Secret Key + Callback token दर्ज करें। वे सर्वर पर encrypted संग्रहीत होते हैं; fields write-only हैं,
तो एक बार सहेजने के बाद वे फिर कभी नहीं दिखाए जाते — पेज केवल Configured / Not set दिखाता है। किसी field को
अपरिवर्तित रखने के लिए उसे खाली छोड़ें; किसी एक को साफ़ करने के लिए Remove stored credentials का उपयोग करें।
एक-बार का सेटअप: वह key उत्पन्न करें जो इन्हें encrypt करती है, जिसे app key से अलग रखा जाता है ताकि एक
database dump और एक .env leak अपने-आप में एक-दूसरे से बेकार हों:
php artisan store:secrets-key # writes STORE_SECRETS_KEY to .env — then BACK IT UP off the server
php artisan config:clear
STORE_SECRETS_KEY खो देने से संग्रहीत credentials अपठनीय हो जाते हैं (आप बस उन्हें फिर से दर्ज कर देंगे)।
या .env से (विकल्प)
अगर आप चाहें, तो इन्हें इसके बजाय सर्वर पर .env में सेट करें, फिर restart करें। दोनों मौजूद होने पर admin-page
values को प्राथमिकता मिलती है।
# Xendit
XENDIT_SECRET_KEY=...
XENDIT_CALLBACK_TOKEN=... # from Settings → Developers → Webhooks
# PayPal
PAYPAL_CLIENT_ID=...
PAYPAL_SECRET=...
PAYPAL_ENV=sandbox # or: live
बिना credentials वाला एक gateway बस बंद रहता है — enable करने के लिए और कुछ नहीं है।
अगर आपका सर्वर किसी proxy या firewall के पीछे है
Webhook path एक public, server-to-server URL है। इसमें कोई login नहीं, ज़रूरत के हिसाब से — provider आपके रूप में log in नहीं कर सकता। इसे इसके बजाय provider की अपनी signature या token, provider से सीधे payment status के एक authoritative re-read, और एक rate limit से सुरक्षित किया जाता है।
इसका मतलब है कि POST /webhooks/* सार्वजनिक इंटरनेट से पहुँच योग्य होना चाहिए। अगर आप इसे block करते हैं, या
पूरी साइट को एक IP allow-list के पीछे रखते हैं, तो asynchronous payments पूरे होने बंद हो जाते हैं — ठीक उसी
मौन लक्षण के साथ जैसा URL को कभी configure ही न करने का होता है।