2009-08-19 20 views
8

मैं अपने पहले इन-ऐप क्रय आईफोन एप्लिकेशन का परीक्षण करने का प्रयास कर रहा हूं। दुर्भाग्य से लेनदेन की पुष्टि करने के लिए iTunes सर्वर से बात करने का तरीका नहीं मिल रहा है।लेनदेन के साथ JSON ऑब्जेक्ट जेनरेट करें

क्योंकि यह इस तकनीक के साथ मेरी पहली कोशिश है, मैंने सर्वर समर्थन का उपयोग करके सीधे आईफोन से रसीद को सत्यापित करना चुना है। लेकिन Google कोड से JSON एपीआई का उपयोग करके बनाए गए JSON onbject के साथ POST अनुरोध भेजने का प्रयास करने के बाद, इट्यून्स हमेशा एक अजीब प्रतिक्रिया देता है (इसके बजाय "स्थिति = 0" स्ट्रिंग जिसके लिए मैं प्रतीक्षा करता हूं)।

यहाँ कोड है कि मैं प्राप्ति की पुष्टि करने के लिए उपयोग:

- (void)recordTransaction:(SKPaymentTransaction *)transaction { 
    NSString *receiptStr = [[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding]; 
    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"algo mas",@"receipt-data",nil]; 

    NSString *jsonString = [jsonDictionary JSONRepresentation]; 
    NSLog(@"string to send: %@",jsonString); 

    NSLog(@"JSON Created"); 
    urlData = [[NSMutableData data] retain]; 

    //NSURL *sandboxStoreURL = [[NSURL alloc] initWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSLog(@"will create connection"); 
    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

शायद मैं अनुरोध के हेडर में कुछ भूल रहा लेकिन मुझे लगता है कि इस समस्या विधि मैं JSON ऑब्जेक्ट बनाने के लिए उपयोग में है।

यहाँ कैसे JSON ऑब्जेक्ट की तरह इससे पहले कि मैं यह HTTPBody में जोड़ने के लिए दिखाई देता है:

string to send: {"receipt-data":"{\n\t\"signature\" = \"AUYMbhY 

     ........... 

D0gIjEuMCI7Cn0=\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"} 

प्रतिक्रियाएं मुझे मिल गया है:

पूरा प्रतिक्रिया { अपवाद = "java.lang। IllegalArgumentException: अनचाहे स्ट्रिंग को पढ़ने का प्रयास करते समय संपत्ति सूची पार्सिंग विफल रही। कोई स्वीकार्य वर्ण नहीं मिला। लाइन संख्या: 1, कॉलम: 0. "; स्थिति = 21002; }

आपके मार्गदर्शन के लिए बहुत बहुत धन्यवाद।

+0

कहीं भी प्रलेखन में यह नहीं कहता है कि 'लेनदेन रसीद' को यूटीएफ -8-एन्कोडेड स्ट्रिंग के रूप में व्याख्या किया जा सकता है – user102008

उत्तर

20

मैंने अभी तय किया है कि संघर्ष के 2 दिनों के बाद। जेसन ऑब्जेक्ट में डालने से पहले आपको बेस 64 का उपयोग करके रसीद एन्कोड करना होगा। कि (रूबी) की तरह:

dataForVerification = {"receipt-data" => Base64.encode64(receipt)}.to_json 

Base64 केवल ब्लॉग के एक जोड़े पर सरकारी डॉक्स में कहीं भी उल्लेख नहीं है (कम से कम एसडीके 3.0 के लिए),।

उदाहरण के लिए, here लड़का PHP सर्वर पर पास करने से पहले बेस 64 में रसीद को एन्कोड करता है, लेकिन इसे PHP में वापस डीकोड नहीं करता है, इस प्रकार आईट्यून्स को बेस 64-एन्कोडेड स्ट्रिंग भेजता है।

+0

धन्यवाद आपके उत्तर के लिए बहुत कुछ है !! – Carlos

+0

इसे इंगित करने के लिए बहुत बहुत धन्यवाद! –

+0

वर्तमान में ऐप खरीद प्रोग्रामिंग गाइड चरण 1 में बेस 64 एन्कोडिंग का उल्लेख करता है। Http://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/ यूआईडी/TP40008267-CH104-SW1 –

2

पुन: "21,002: java.lang.IllegalArgumentException: propertyListFromString एक वस्तु पार्स, लेकिन अभी भी स्ट्रिंग .: में अधिक पाठ है"

मैं में रसीद डेटा लपेटकर द्वारा अपने कोड में एक ऐसी ही समस्या का समाधान हो { } एन्कोडिंग से पहले।

जिसके परिणामस्वरूप प्राप्त होने लगता है:

receipt = "{%s}" % receipt // This step was not specified - trial and error 
encoded = base64.b64encode(receipt) 
fullpost = '{ "receipt-data" : "%s" }' % encoded 
req = urllib2.Request(url, fullpost) 
response = urllib2.urlopen(req) 

एप्पल के उत्तर::

{"receipt":{"item_id":"371235", "original_transaction_id":"1", "bvrs":"1.0", "product_id":"com.foo.cup", "purchase_date":"2010-05-25 21:05:36 Etc/GMT", "quantity":"1", "bid":"com.foo.messenger", "original_purchase_date":"2010-05-25 21:05:36 Etc/GMT", "transaction_id":"11237"}, "status":0} 

गुड लक

{ 
    "signature" = "A[...]OSzQ=="; 
    "purchase-info" = "ew[...]fQ=="; 
    "pod" = "100"; 
    "signing-status" = "0"; 
} 

यहाँ कोड का उपयोग मैं है!

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