सभी लेख
Deep diveपढ़ने में 7 मिनट

रद्द की गई खरीद की सूचना आपके Google Play सर्वर को उसी क्षण एक्सेस रद्द करने देती है जब रिफंड आता है

Google Play किसी खरीद के रिफंड होने, चार्जबैक होने या रद्द होने के तुरंत बाद आपके सर्वर को रद्द की गई खरीद की सूचना भेज सकता है। इसमें एक purchaseToken, orderId, productType और refundType होता है, और इसका एक ही मतलब है, एक्सेस रद्द करो। यहाँ बताया गया है कि इसे कैसे पढ़ें और कैसे जोड़ें।

शाम के धुंधलके में एक डेवलपर का कार्यस्थल जहाँ एक फोन पर पलटा हुआ भुगतान दिख रहा है, जो सर्वर तक पहुँचती एक Google Play रद्द की गई खरीद की सूचना को दर्शाता है

मुख्य बातें

  • रद्द की गई खरीद की सूचना एक Real-time Developer Notification है जिसे Google Play किसी खरीद के रिफंड होने, चार्जबैक होने या अन्यथा रद्द होने के क्षण आपके Cloud Pub/Sub विषय पर भेजता है। यह एक पुश संकेत है, ऐसा कुछ नहीं जिसके लिए आपको बार-बार पूछताछ करनी पड़े।
  • सूचना में ठीक चार फ़ील्ड होते हैं: `purchaseToken`, `orderId`, `productType` और `refundType`। यह आपके डेटाबेस में ठीक उसी खरीद को खोजने और उससे जुड़े अधिकार को रद्द करने के लिए पर्याप्त है।
  • `productType` रद्द की गई सदस्यता के लिए `1` और रद्द की गई एकबारगी खरीद के लिए `2` होता है। `refundType` पूर्ण रिफंड के लिए `1` और मात्रा-आधारित आंशिक रिफंड के लिए `2` होता है, जो केवल बहु-मात्रा वाली एकबारगी खरीदों पर लागू होता है।
  • रद्द की गई खरीद की सूचना का मतलब है कि ग्राहक को उसका पैसा पहले ही वापस मिल चुका है। Google का अपना मार्गदर्शन है कि संबंधित सामग्री तक एक्सेस रद्द कर दें, क्योंकि खरीदार को अब वह अधिकार नहीं रखना चाहिए।
  • रद्द की गई खरीद की सूचनाएँ तब तक बंद रहती हैं जब तक आप उन्हें चालू नहीं करते। Play Console में Monetization setup के अंतर्गत आप या तो सदस्यताएँ और सभी रद्द की गई खरीदें चुनते हैं, या उसके साथ एकबारगी उत्पाद इवेंट भी। दोनों विकल्पों में रद्द की गई खरीदें शामिल हैं।
  • रद्द की गई खरीद की सूचना उन दो रिफंड प्रवाहों में से एक नहीं है जो आपसे साक्ष्य माँगते हैं। यह एक बाद की सूचना है। केवल वही प्रवाह आपकी राय लेते हैं जो Apple का CONSUMPTION_REQUEST है, जिसकी 12 घंटे की खिड़की है, और Google Play की चार्जबैक समीक्षा जो orders.reviewrefund के माध्यम से होती है, जिसकी 24 घंटे की खिड़की है।
  • August 3, 2026 से, Google किसी चार्जबैक की खरीद कीमत के साथ बैंक शुल्क भी डेवलपर पर डाल देता है। रद्द की गई खरीद की सूचना अक्सर वह तरीका है जिससे आपके सर्वर को पहली बार पता चलता है कि एक चार्जबैक रद्दीकरण आ गया है, इसलिए इसे जोड़ना ही वह चीज़ है जो आपको ऐसे ग्राहक की सेवा बंद करने देती है जिसके लिए अब आपको भुगतान नहीं मिलता।

Google Play पर रिफंड ऐसी चीज़ होने की ज़रूरत नहीं जिसे आप बाद में किसी रिपोर्ट में पता करें। Google Play किसी खरीद के रद्द होते ही आपके सर्वर को एक रद्द की गई खरीद की सूचना भेज सकता है, चाहे खरीदार ने स्वयं-सेवा रिफंड लिया हो, किसी सपोर्ट एजेंट ने दिया हो, किसी बैंक ने चार्जबैक थोपा हो, या आपने रिवोक फ़्लैग चालू करके खुद ही ऑर्डर रिफंड किया हो। संदेश बहुत छोटा है, यह ठीक उसी खरीद का नाम लेता है, और इसमें एक ही निर्देश होता है, अधिकार वापस ले लो, क्योंकि पैसा तो जा चुका है।

रद्द की गई खरीद की सूचना असल में क्या है

रद्द की गई खरीद की सूचना Google Play की Real-time Developer Notifications, यानी RTDN, का एक प्रकार है। RTDN एक पुश चैनल है। Google आपके स्वामित्व वाले एक Cloud Pub/Sub विषय पर एक संदेश प्रकाशित करता है, और आपका बैकएंड उसे इवेंट के कुछ ही क्षणों में प्राप्त कर लेता है, बजाय इसके कि आपके अगले निर्धारित पोल पर पता चले। पुरानी पुल पद्धति की तुलना में रद्द की गई खरीद की सूचना का यही पूरा मकसद है: आपको रिफंड की जानकारी उसके होते ही मिलती है, घंटों बाद नहीं।

पुल पद्धति अब भी मौजूद है और अब भी मायने रखती है। Voided Purchases API आपके सर्वर को यह पूछने देती है, आपकी अपनी समयसारणी पर, कि किसी समय-सीमा में कौन-कौन सी खरीदें रद्द हुईं। दोनों एक-दूसरे के पूरक हैं। सूचना आपको उसी क्षण बताती है जब कोई एक खरीद पलटती है; API आपको थोक में मिलान करने देती है और किसी छूटे हुए संदेश से पीछे छूटी किसी भी चीज़ को भरने देती है।

यह एक Real-time Developer Notification के भीतर सवार होकर आती है

रद्द की गई खरीद की सूचना कभी अकेले नहीं आती। यह एक DeveloperNotification रैपर के भीतर बैठती है, और वह रैपर Pub/Sub संदेश के data फ़ील्ड में एक अकेली base64-एन्कोडेड स्ट्रिंग के रूप में पहुँचाया जाता है। कुछ भी पढ़ने से पहले आपका हैंडलर उस स्ट्रिंग को JSON में डिकोड करता है। रैपर हमेशा ऐप और इवेंट के समय का नाम लेता है, और इसमें Google द्वारा परिभाषित पाँच में से ठीक एक सूचना ऑब्जेक्ट होता है। वे परस्पर अनन्य हैं, इसलिए voidedPurchaseNotification वाला संदेश साथ में कोई सदस्यता या एकबारगी इवेंट नहीं ले जाएगा।

रैपर फ़ील्डयह क्या रखता है
versionसूचना स्कीमा का संस्करण, उदाहरण के लिए 1.0
packageNameवह ऐप जिससे इवेंट संबंधित है, उदाहरण के लिए com.acme.app
eventTimeMillisइवेंट कब हुआ, epoch से मिलीसेकंड में
पाँच सूचना ऑब्जेक्ट में से एकoneTimeProductNotification, subscriptionNotification, voidedPurchaseNotification, pendingRefundReviewNotification, या testNotification। प्रति संदेश केवल एक मौजूद होता है

यह जो चार फ़ील्ड लाती है

रैपर हटा दें तो रद्द की गई खरीद की सूचना अपने आप में चार फ़ील्ड है। यह जानबूझकर संक्षिप्त है। Google का रुख यह है कि यदि आपको केवल सही खरीद खोजनी है और अधिकार समायोजित करना है, तो ये चार पर्याप्त हैं, और कार्रवाई करने के लिए आपको किसी भी API को दोबारा कॉल करने की ज़रूरत नहीं।

फ़ील्डयह क्या हैआप इसका उपयोग कैसे करते हैं
purchaseTokenजब वस्तु खरीदी गई तब डिवाइस को सौंपा गया टोकनआपकी प्राथमिक कुंजी। इसे उस खरीद रिकॉर्ड से मिलाएँ जो आपने अधिकार देते समय संग्रहीत किया था
orderIdखरीदार को दिखाया गया ऑर्डर id, उदाहरण के लिए GS.0000-0000-0000सपोर्ट और मिलान के लिए एक मानव-पठनीय दूसरी कुंजी
productTypeरद्द की गई वस्तु सदस्यता थी या एकबारगी खरीदसही रद्दीकरण पथ की ओर मार्गित करें
refundTypeरद्दीकरण पूर्ण रिफंड था या मात्रा-आधारित आंशिक रिफंडतय करें कि सब कुछ रद्द करना है या केवल रिफंड की गई मात्रा

productType आपको बताता है कि क्या रद्द हुआ

productType एक छोटा पूर्णांक है, और यह तय करता है कि आपके किस रद्दीकरण पथ को अपनाना है। किसी सदस्यता के रद्दीकरण को चल रहे एक्सेस को खोलना पड़ता है; एकबारगी खरीद का रद्दीकरण केवल एक अकेला अधिकार हटाता है।

`productType` मानस्थिरांकअर्थ
1PRODUCT_TYPE_SUBSCRIPTIONएक सदस्यता खरीद रद्द की गई
2PRODUCT_TYPE_ONE_TIMEएक एकबारगी खरीद रद्द की गई

refundType आपको बताता है कि कितना वापस आया

refundType एक साफ़-सुथरे पूर्ण उलटाव को आंशिक उलटाव से अलग करता है। आंशिक मामला सीमित है। यह केवल तब प्रकट होता है जब किसी बहु-मात्रा वाली एकबारगी खरीद की कुछ, पर पूरी नहीं, मात्रा रिफंड की गई हो।

`refundType` मानस्थिरांकअर्थ
1REFUND_TYPE_FULL_REFUNDखरीद पूरी तरह रद्द की गई
2REFUND_TYPE_QUANTITY_BASED_PARTIAL_REFUNDएक बहु-मात्रा खरीद का एक भाग रद्द किया गया

पहले इसे चालू करें, वरना यह कभी नहीं आएगी

रद्द की गई खरीद की सूचनाएँ डिफ़ॉल्ट रूप से नहीं बहतीं। आप Play Console में एक बार RTDN सक्षम करते हैं, और उसे अपने नियंत्रण वाले एक Pub/Sub विषय की ओर इंगित करते हैं। यह स्विच Monetize, फिर Monetization setup के अंतर्गत, पृष्ठ के शीर्ष पर Real-time developer notifications खंड में होता है। Enable real-time notifications पर निशान लगाएँ, फिर अपने पूरे विषय का नाम projects/{project_id}/topics/{topic_name} प्रारूप में चिपकाएँ, और उस पर भरोसा करने से पहले यह पुष्टि करने के लिए Send Test Message का उपयोग करें कि पाइप काम करता है।

सामग्री टॉगल वही जगह है जहाँ लोग रद्द की गई खरीदें चूक जाते हैं। दोनों विकल्पों में वे शामिल हैं, इसलिए आप सदस्यताएँ रखते हुए गलती से रिफंड को बाहर नहीं कर सकते।

  • सदस्यताओं और सभी रद्द की गई खरीदों के लिए सूचनाएँ पाएँ। आपको सदस्यता इवेंट और हर रद्द की गई खरीद मिलती है, पर एकबारगी उत्पाद खरीद के इवेंट नहीं।
  • सदस्यताओं और एकबारगी उत्पादों के लिए सभी सूचनाएँ पाएँ। आपको उपरोक्त के साथ-साथ एकबारगी उत्पाद इवेंट भी मिलते हैं जैसे ONE_TIME_PRODUCT_PURCHASED और ONE_TIME_PRODUCT_CANCELED
एक कागज़ की रसीद के बगल में औंधे मुँह रखा एक क्रेडिट कार्ड, जो एक रद्द की गई Google Play खरीद का प्रतिनिधित्व करता है

यह आपको पैसे में क्या कीमत चुकाता है

रद्दीकरण एक ऐसी हानि है जो सूचना के आप तक पहुँचने तक पहले ही दर्ज हो चुकी होती है। बिक्री मूल्य चला गया, और उस ग्राहक की सेवा में आपने जो खर्च किया वह भी। अगर उन्होंने छवियाँ बनाईं, आपके मॉडलों के विरुद्ध कॉल चलाईं, स्टोरेज खींचा, या किसी तीसरे पक्ष को भुगतान करवाया, तो वे लागतें असली पैसे में चुकाई गईं और रिफंड के साथ वापस नहीं आतीं। सूचना उनमें से कुछ भी वापस नहीं ला सकती। यह जो कर सकती है वह है यहाँ से आगे का रक्तस्राव रोकना, और तेज़ी से इस पर कार्रवाई करने का यही पूरा कारण है।

रक्तस्राव सदस्यताओं पर सबसे बुरा है और चार्जबैक पर सबसे बुरा है। जिस सदस्यता को आप रद्द करने में चूक जाते हैं, वह आपको महीने-दर-महीने सेवा देने की लागत में डालती रहती है, एक ऐसे ग्राहक के लिए जो अब भुगतान नहीं कर रहा। और चार्जबैक रद्दीकरण का सबसे महँगा प्रकार है। August 3, 2026 से, Google का दस्तावेज़ बताता है कि एक चार्जबैक खरीद मूल्य के साथ बैंक का शुल्क भी डेवलपर पर डाल देता है। रद्द की गई खरीद की सूचना अक्सर पहला स्थान होती है जहाँ आपके अपने सिस्टम सुनते हैं कि एक चार्जबैक पूरा हो गया है, इसलिए एक हैंडलर जो मौके पर ही रद्द कर देता है, वही एक खोई हुई बिक्री को एक खोई हुई बिक्री और हफ़्तों की मुफ़्त सेवा में बदलने से रोकता है।

रद्द की गई खरीद की सूचना को चरण-दर-चरण कैसे संभालें

संदेश की पुष्टि करें और डुप्लिकेट हटाएँ

  • पुष्टि करें कि Pub/Sub संदेश Google से आया है और उस विषय को लक्षित करता है जिसे आपने कॉन्फ़िगर किया था, फिर DeveloperNotification JSON पाने के लिए base64 data फ़ील्ड को डिकोड करें।
  • डुप्लिकेट हटाने के लिए Pub/Sub messageId का उपयोग करें। Google चेताता है कि वही सूचना एक से अधिक बार पहुँचाई जा सकती है, इसलिए पुनः-प्रसारण को सामान्य मानें और अपने हैंडलर को idempotent बनाएँ।
  • संदेश को केवल तभी स्वीकृत करें जब आपने उसे सुरक्षित रूप से रिकॉर्ड कर लिया हो, ताकि हैंडलर के बीच में क्रैश होने से इवेंट न खोए।

खरीद को ढूँढें

  • purchaseToken को उस खरीद से मिलाएँ जो आपने अधिकार पहली बार देते समय संग्रहीत की थी। सपोर्ट खोज और मैन्युअल मिलान के लिए orderId पर लौटें।
  • सदस्यता या एकबारगी रद्दीकरण पथ चुनने के लिए productType पढ़ें, और पूर्ण रद्दीकरण तथा आंशिक के बीच निर्णय के लिए refundType पढ़ें।

रद्द करें और रिकॉर्ड करें

  • अधिकार हटाएँ। पूर्ण रिफंड के लिए, वस्तु तक एक्सेस काट दें। मात्रा-आधारित आंशिक रिफंड के लिए, दी गई मात्रा को रिफंड की गई मात्रा जितना घटाएँ और बाकी को यथावत रहने दें।
  • लिख लें कि आपने क्या किया और कब, purchaseToken और orderId के आधार पर। वही रिकॉर्ड आपको बाद में किसी सपोर्ट टिकट का जवाब देने देता है, और वही Voided Purchases API को आपके अपने स्टेट के विरुद्ध साफ़-सुथरे ढंग से मिलान करने देता है।

यह अन्य रिफंड संकेतों के बीच कहाँ बैठती है

रद्द की गई खरीद की सूचना एक सूचना है, बातचीत नहीं। यह आपको एक ऐसा परिणाम बताती है जो पहले ही तय हो चुका है। इसे उन संकेतों के साथ देखना सार्थक है जिनके साथ इसे भ्रमित करना आसान है, क्योंकि उनमें से केवल कुछ ही कभी आपकी ओर की कहानी माँगते हैं।

संकेतदिशाक्या यह आपकी राय लेता है
रद्द की गई खरीद की सूचना (RTDN)Google आपके सर्वर पर भेजता हैनहीं। यह पहले ही हो चुके एक रद्दीकरण की सूचना देता है
Voided Purchases APIआपका सर्वर Google से खींचता हैनहीं। यह पिछले रद्दीकरणों की केवल-पठन सूची है
pendingRefundReviewNotification (RTDN)Google आपके सर्वर पर भेजता हैहाँ, अप्रत्यक्ष रूप से। यह एक चार्जबैक को चिह्नित करता है जिसका आप फिर 24 घंटे के भीतर orders.reviewrefund के माध्यम से विरोध करते हैं
Apple CONSUMPTION_REQUESTApple आपके सर्वर से पूछता हैहाँ। आप 12 घंटे के भीतर Send Consumption Information से जवाब देते हैं

जो बात याद रखनी है वह सरल है। दोनों स्टोरों में ठीक दो रिफंड प्रवाह हैं जहाँ डेवलपर की राय चलती है, Apple का CONSUMPTION_REQUEST और Google Play की चार्जबैक समीक्षा। रद्द की गई खरीद की सूचना इनमें से कोई नहीं है। जब तक यह आप तक पहुँचती है, निर्णय पीछे छूट चुका होता है और आपके हाथ में बची एकमात्र चीज़ यह है कि आप कितनी तेज़ी से रद्द करते हैं।

अक्सर पूछे जाने वाले सवाल

Google Play पर रद्द की गई खरीद की सूचना का क्या मतलब है?
इसका मतलब है कि एक खरीद रिफंड, चार्जबैक या अन्यथा रद्द की गई, और ग्राहक को उसका पैसा वापस मिल गया है। Google का मार्गदर्शन है कि संबंधित सामग्री तक एक्सेस रद्द कर दें, क्योंकि खरीदार को अब वह अधिकार नहीं रखना चाहिए। सूचना अपने `purchaseToken` और `orderId` के माध्यम से ठीक उसी खरीद का नाम लेती है।
एक Google Play रद्द की गई खरीद की सूचना में कौन-कौन से फ़ील्ड होते हैं?
चार: `purchaseToken`, `orderId`, `productType` और `refundType`। `productType` सदस्यता के लिए `1` और एकबारगी खरीद के लिए `2` होता है। `refundType` पूर्ण रिफंड के लिए `1` और एक बहु-मात्रा खरीद पर मात्रा-आधारित आंशिक रिफंड के लिए `2` होता है।
मैं रद्द की गई खरीद की सूचनाएँ कैसे सक्षम करूँ?
Play Console में, Monetize फिर Monetization setup खोलें, और Real-time developer notifications खंड में Enable real-time notifications पर निशान लगाएँ, फिर अपना Cloud Pub/Sub विषय नाम दर्ज करें। दोनों सामग्री विकल्प, सदस्यताएँ और सभी रद्द की गई खरीदें, तथा उसके साथ एकबारगी उत्पाद इवेंट, रद्द की गई खरीदें शामिल करते हैं।
रद्द की गई खरीद की सूचना और Voided Purchases API में क्या अंतर है?
सूचना एक पुश संकेत है जो किसी खरीद के रद्द होते ही Cloud Pub/Sub के माध्यम से वास्तविक समय में पहुँचाया जाता है। Voided Purchases API एक पुल पथ है जिसे आपका सर्वर अपनी समयसारणी पर किसी समय-सीमा में रद्दीकरणों की सूची बनाने के लिए क्वेरी करता है। तुरंत प्रतिक्रिया के लिए सूचना का उपयोग करें और मिलान तथा बैकफ़िल के लिए API का।
क्या रद्द की गई खरीद की सूचना मुझे रिफंड का विरोध करने देती है?
नहीं। यह पहले से लिए जा चुके किसी निर्णय की बाद की सूचना है। एकमात्र Google Play प्रवाह जो आपकी राय लेता है वह `orders.reviewrefund` के माध्यम से चार्जबैक समीक्षा है, जिसका जवाब देने के लिए आपके पास 24 घंटे हैं, और Apple पर यह 12 घंटे की खिड़की वाला CONSUMPTION_REQUEST है।

स्रोत और आगे की जानकारी

RefundHalt

App Store और Google Play के लिए refund ऑटोपायलट

आगे पढ़ें

Playbookपढ़ने में 7 मिनट

आप किसी Google Play ऑर्डर का रिफ़ंड खुद कर सकते हैं, और चार्जबैक से पहले ऐसा करने पर बैंक शुल्क बच जाता है

आप तीन साल से कम पुराने किसी भी Google Play ऑर्डर का रिफ़ंड एक API कॉल से कर सकते हैं, चाहे एक्सेस रद्द करें या न करें। किसी विवाद के चार्जबैक बनने से पहले खुद रिफ़ंड कर देने पर वह बैंक शुल्क बच जाता है जो 3 अगस्त 2026 से डेवलपर्स पर पड़ता है। orders.refund इस तरह काम करता है।

Deep diveपढ़ने में 7 मिनट

Apple का Send Consumption Information अब 12 नहीं, 5 फ़ील्ड माँगता है, और यहाँ हर एक फ़ील्ड दी गई है

जब कोई ग्राहक Apple से रिफ़ंड माँगता है, तो Send Consumption Information payload आपका जवाब होता है। Apple ने इसे 12 फ़ील्ड से घटाकर 5 कर दिया है, 3 अनिवार्य और 2 वैकल्पिक। यहाँ हर फ़ील्ड है, हर एक जो मान स्वीकार करती है, और वह 12-घंटे की समय-सीमा जिसमें आप इसे भेजते हैं।

अगला refund अनुरोध पहले ही रास्ते में है.

RefundHalt को उतने समय में सेटअप करें, जितने में आप उस refund के बारे में एक और सपोर्ट ईमेल पढ़ते हैं जिस पर आपत्ति नहीं कर पाए.