21

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

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { 
    if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) || 
      TextUtils.isEmpty(signature)) { 
     if(TextUtils.isEmpty(signedData)) Log.d(TAG, "SIGNED DATA EMPTY"); 
     if(TextUtils.isEmpty(base64PublicKey)) Log.d(TAG, "KEY IS EMPTY"); 
     if(TextUtils.isEmpty(signature)) Log.d(TAG, "SIGNATURE IS EMPTY"); 
     Log.e(TAG, "Purchase verification failed: missing data."); 
     return false; 
    } 

    PublicKey key = Security.generatePublicKey(base64PublicKey); 
    return Security.verify(key, signedData, signature); 
} 

और मुझे "हस्ताक्षर खाली है" मिल रहा है। के बाद भी मैं नीचे दिए गए चरणों का पालन करें: -Sign मेरी रिहाई कुंजी साथ apk एक डिवाइस पर एक मसौदा के रूप में यह -upload यह -install साथ

मैं परीक्षण "एडीबी app.apk स्थापित -d" वास्तविक खरीद के साथ। धन्यवाद।

संपादित खरीदी प्रवाह ठीक है, मैं त्रुटि मिलती है जब मैं फोन queryInventoryAsync

+1

मेरे नीचे इस सवाल का जवाब की जांच पूर्ववत आशा है कि यह आपकी समस्या का समाधान होगा। – Maulik

उत्तर

35

नीचे दिए गए verifyPurchase() विधि को बदलें। नीचे दिए गए पुराने कोड का उपयोग करें, Google डेवलपर निकट भविष्य में इस त्रुटि को हल करने का प्रयास कर रहा है लेकिन इससे पहले कि वे अपने कोड को अपडेट कर लें, आपको कोड नीचे पसंद करना चाहिए।

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { 
       if (signedData == null) { 
       Log.e(TAG, "data is null"); 
       return false; 
      } 

      boolean verified = false; 
      if (!TextUtils.isEmpty(signature)) { 
       PublicKey key = Security.generatePublicKey(base64PublicKey); 
       verified = Security.verify(key, signedData, signature); 
       if (!verified) { 
        Log.w(TAG, "signature does not match data."); 
        return false; 
       } 
      } 
      return true; 
     } 

जांच में अधिक जानकारी के लिए इस लिंक:

In App billing not working after update - Google Store

उपयोग अपनी परियोजना में पुराने कोड विधि verifyPurchase() विधि को बदलने के लिए प्रयास करें। लेकिन यह तब होता है जब आप परीक्षण उत्पादों को खरीदने की कोशिश कर रहे हों। मुझे इस कोड का उपयोग करने के बाद वास्तविक उत्पादों की खरीद के लिए भी बताएं।

संपादित करें:

यह क्यों होता है क्योंकि हम किसी भी हस्ताक्षर जब तक हम जैसे "android.test.purchased" डमी उत्पाद का उपयोग कर रहे हैं नहीं मिल जाएगा। तो पुराने कोड में यह अच्छा काम कर रहा है क्योंकि हस्ताक्षर नहीं दिए जाने पर भी हम वापस आ गए थे और नए कोड के लिए हम झूठी वापसी कर रहे हैं। link1 से हस्ताक्षर डाटा शून्य या खाली और link2

के बारे में

अधिक जानकारी तो मैं सुझाव है कि आप सिर्फ पुराने कोड विधि verifyPurchase() के बजाय नए कोड विधि बदलें।

मुझे लगता है कि नया कोड असली उत्पाद के लिए ठीक काम करेगा लेकिन डमी उत्पाद में नहीं। लेकिन फिर भी मैंने असली उत्पाद के लिए परीक्षण नहीं किया है।

या

उपयोग GvS के परीक्षण खरीद यह भी नए कोड के लिए अच्छा समाधान के लिए इस सवाल का जवाब।

आशा है कि यह आपकी समस्या का समाधान करेगा।

+0

के लिए FAILED धन्यवाद! मैंने आपकी समस्या हल की है –

+0

@ मौलिक धन्यवाद यह परीक्षण आइटम के लिए मेरा उद्देश्य प्रदान करता है, लेकिन मेरे पास एक सवाल है कि यह परिदृश्य में एप्लिकेशन है जैसे ऐपबिलिंग एप्लिकेशन का उपयोग करके किताबें खरीदना? कृपया मुझे सुझाव दें –

+0

मुझे वह विधि नहीं मिल रही है 'Security.generatePublicKey (base64PublicKey);' java.s का सुरक्षा वर्ग भाग है ecurity? धन्यवाद। – Chan

40

आप परीक्षण का उपयोग कर सकते SKU के, परीक्षण करना as explained here। ये हैं:

  • android.test.purchased
  • android.test.canceled
  • android.test.refunded
  • android.test.item_unavailable

ये खरीद सफल हो जाएगा (कम से कम android.test.purchased) परीक्षण और डिबग परिदृश्य के दशक में भी, खरीद रद्द करने की आवश्यकता के बिना।

verifyPurchase में मैं करने के लिए return false बदल दिया है:

Log.e(TAG, "Purchase verification failed: missing data."); 
    if (BuildConfig.DEBUG) { 
      return true; 
    } 
    return false;   

लेकिन आप केवल परीक्षण परिदृश्य के दशक में इस का उपयोग करने के बारे में पता होना चाहिए।

यदि आपके पास डीबग बिल्ड है, और हस्ताक्षर डेटा गुम है, तो यह सच हो जाएगा। चूंकि BuildConfig.DEBUG उत्पादन निर्माण में गलत होगा क्योंकि यह ठीक होना चाहिए। लेकिन सबकुछ डीबग होने के बाद इस कोड को हटाना बेहतर है।

+2

मुझे एक ही परिणाम मिलता है, मैं आइटम खरीद सकता हूं लेकिन फिर क्वेरी इन्वेंटरीएस्क (श्रोता) मुझे त्रुटि देता है – TheRedFox

+0

मेरे लिए, यह डिबगिंग करते समय काम करता है। आप यह सत्यापित करने के लिए सत्यापित खरीदारी या IabHelper.handleActivityResult में ब्रेकपॉइंट भी डाल सकते हैं कि यह कहां गलत हो जाता है। – GvS

+0

@GvS, सत्यापन खरीद() के लिए पुराना कोड सभी के लिए ठीक काम कर रहा है, लेकिन जब Google डेवलपर्स को सत्यापित खरीद() विधि में अधिक सुरक्षित लेनदेन करने के लिए कोड अपडेट किया गया है, तो उन्होंने हस्ताक्षर को सत्यापित करने के लिए कुछ अतिरिक्त कोड भी लगाया है, लेकिन अब वे बग को सुधारने की कोशिश कर रहे हैं। जो मैंने अभी तक सुना है उसके मुताबिक। – Maulik

1

सुनिश्चित करें कि आप अपने फोन पर सही उपयोगकर्ता के साथ लॉग इन हैं या उदा। डेवलपर कंसोल में एक परीक्षण उपयोगकर्ता के रूप में अपने फोन का Google खाता जोड़ें।

http://developer.android.com/google/play/billing/billing_testing.html#billing-testing-static:

कुछ मामलों में, आरक्षित आइटम स्थिर प्रतिक्रियाओं पर हस्ताक्षर किए वापस आ सकते हैं, जो आप अपने आवेदन में हस्ताक्षर सत्यापन का परीक्षण करने देता है। आरक्षित आइटम केवल हस्ताक्षरित प्रतिक्रियाएं लौटाते हैं यदि आवेदन करने वाले उपयोगकर्ता में डेवलपर या परीक्षण खाता होता है। सच करने के लिए

0

सेट वापसी मान

public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) { 
    return true; 
} 

tesing के बाद में, परिवर्तन

संबंधित मुद्दे