2011-08-15 14 views
13

मैंने एंड्रॉइड के इन-ऐप बिलिंग के साथ एक परीक्षण ऐप लागू किया है। मैंने सुरक्षा.जावा फ़ाइल में अपनी सार्वजनिक कुंजी भर दी है। सब कुछ काम करता है, लेकिन जब मैं भुगतान जमा करता हूं, तो ऐप क्रैश हो जाता है। मैं LogCat में कोई त्रुटि है कि कहते हैं, "हस्ताक्षर सत्यापन विफल" है, जो कोड के इस बिट से मेल खाती है प्राप्त करते हैं:एंड्रॉइड इन-ऐप बिलिंग: सुरक्षा.जावा कहता है "हस्ताक्षर सत्यापन विफल"

if (!sig.verify(Base64.decode(signature))) { 
       Log.e(TAG, "Signature verification failed."); 
       return false; 
} 

तो मुझे लगता है कि थोड़ा बदल वापसी झूठी के बजाय सही वापस जाने के लिए है, तो सब कुछ ठीक से काम करता है - मैं प्रस्तुत कर सकते हैं भुगतान और सुरक्षित रूप से ऐप पर वापस आते हैं - लेकिन मुझे लगता है कि कुछ और गलत है, क्योंकि मुझे शायद इसे सही करने के लिए बदलना चाहिए।

इस बारे में कोई विचार क्या हो सकता है?

उत्तर

23

हस्ताक्षर सत्यापन त्रुटि की वजह से किया जा सकता है कि:

1.- एक गलत सार्वजनिक कुंजी। शायद आप कुछ चरित्र की प्रतिलिपि भूल गए हैं। ऐसा होता है :)

2.- The .apk must be signed। यदि आप अपनी हस्ताक्षर स्ट्रिंग खाली करेंगे तो आप debug.keystore का उपयोग नहीं कर सकते हैं।

और याद रखें, परीक्षण ऐप्लिकेशन के अंतर्गत बिलिंग के लिए:

  • आप उपयोग कर रहे हैं रिलीज़ मोड में Security.java के लिए Android Market सार्वजनिक कुंजी जोड़े (String base64EncodedPublicKey = "your public key here")

  • बिल्ड और इस पर हस्ताक्षर (ग्रहण, आप निर्यात विज़ार्ड का उपयोग कर सकते हैं)।

  • एंड्रॉइड मार्केट में रिलीज़ संस्करण अपलोड करें, इसे प्रकाशित न करें, और उत्पाद सूची बनाएं।

  • एप्लिकेशन को अपने डिवाइस पर इंस्टॉल करें (adb -d myapp.apk इंस्टॉल करें) और अपने डिवाइस पर एक परीक्षण खाता प्राथमिक बनाएं।

+2

आपके द्वारा अपने परीक्षण डिवाइस पर दबाए गए एपीके में आपके द्वारा डेवलपर कंसोल पर अपलोड किए गए एपीके के समान सटीक संस्करण मान भी होना चाहिए। अपने एपीके संस्करण को रीफ्रेश करने में डेवलपर कंसोल के लिए 6 घंटे तक लग सकते हैं। –

+6

आज के रूप में, base64PublicKey IabHelper को पारित पैरामीटर है, इसे सुरक्षा.जावा – 18446744073709551615

+8

में परिभाषित नहीं किया गया है, साइनिंग, अपलोडिंग, प्रतीक्षा आदि के बिना बिलिंग एकीकरण प्रवाह विकसित करने का कोई आसान तरीका नहीं है? मैं मानता हूं कि परीक्षण को यथासंभव उत्पादन के रूप में किया जाना चाहिए लेकिन विकास चक्र बहुत लंबा है। अगर मैंने गलती से बुरा या एनपीई किया है, तो मुझे पूरे प्रकाशन चरण को फिर से करने की ज़रूरत है! –

20

मेरे मामले में एक अच्छी तरह से छिपी हुई समस्या थी।

जब मैंने पहली बार इन-ऐप बिलिंग सेट अप की, तो मैंने स्थिर प्रतिक्रियाओं की कोशिश की और android.test.purchased आइटम खरीदा। जब मैंने उत्पादन वस्तुओं पर स्विच किया और सूची से पूछने की कोशिश की, तो नकली उत्पाद ने मेरी सारी परेशानी का कारण बना दिया।

तो, इस मामले में, समाधान मेरे स्वामित्व वाले आइटम से नकली उत्पाद को हटाना था। विधि इस हस्ताक्षर होने के कुछ और बयान में

   Purchase p = new Purchase(itemType, purchaseData, signature); 
       try { 
        consume(p); 
       } catch (IabException e) { 
        e.printStackTrace(); 
       } 

:

बस IABHelper.java में दायर इस स्निपेट जोड़ने

int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException 

एक बार अपने स्वयं के आइटम साफ, पर वापस लौटने मूल सहायक सहायक फ़ाइल। बेशक, यह केवल विकास चरण के लिए है।

+1

वाह मैं इस तरह कुछ ढूंढने के लिए पूरे दिन खो गया, धन्यवाद – fersarr

+1

एक चमत्कार की तरह काम करता है। इन-ऐप बिलिंग में अभी तक एक और बग। –

+0

मुझे यह हर बार करना है जब मैं परीक्षण खरीद करता हूं ... – AxeEffect

0

मेरे मामले में, मैंने एक गलत सार्वजनिक कुंजी चिपका दी जिसमें एक ही उपसर्ग और प्रत्यय है। बस 100% सुनिश्चित करें कि यह सही है।

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