سؤال

لقد كنت الأيام الماضية في محاولة لاختبار أول تطبيق iPhone في التطبيقات الأولية. لسوء الحظ، لا يمكنني العثور على طريقة التحدث إلى خادم iTunes للتحقق من المعالجة.

لأنه جربني الأول مع هذه التكنولوجيا اخترت التحقق من الاستلام مباشرة من iPhone بدلا من ذلك باستخدام دعم الخادم. ولكن بعد محاولة إرسال طلب المشاركة باستخدام JSON Onbject تم إنشاؤه باستخدام JSON API من رمز Google، يقوم iTunes دائما بإرجاع استجابة غريبة (بدلا من "الحالة = 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، العمود:"؛ الحالة = 21002؛ }

شكرا جزيلا لتوجيهاتك.

هل كانت مفيدة؟

المحلول

لقد قمت بإصلاح ذلك بعد يومين من تكافح. يجب عليك ترميز إيصال باستخدام Base64 قبل إدراج كائن JSON. مثل هذا (روبي):

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

لم يتم ذكر Base64 في أي مكان في المستندات الرسمية (على الأقل بالنسبة ل SDK 3.0)، فقط على بضع مدونات.

على سبيل المثال، هنا يرميز الرجل الاستلام في Base64 قبل اجتيازه إلى خادم PHP، ولكنه لا يفصص عنه في PHP، وبالتالي إرسال سلسلة مشفرة Base64 إلى iTunes.

نصائح أخرى

إعادة: "21002: java.lang.illeg.illegalargumentException: propertylistfromstring parsed كائن، ولكن لا يزال هناك المزيد من النص في السلسلة:"

لقد قمت بإصلاح مشكلة مماثلة في التعليمات البرمجية عن طريق التفاف بيانات الإيصال في {} قبل الترميز.

يبدو الاستلام الناتج:

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

إليك الرمز الذي أستخدمه:

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)

استجابة Apple:

{"receipt":{"item_id":"371235", "original_transaction_id":"1012307", "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}

حظ سعيد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top