English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
بعد ios7.0، طريقة الحصول على票据Receipt للدفع في ios بنجاح أصبحت لها طريقة جديدة
طريقة الحصول على票据transactionReceipt في SKPaymentTransaction قد أصبحت قديمة، على الرغم من أن يمكنك استخدامها مازال، ولكن يوصي 苹果 باستخدام الجديدة
طريقة الحصول على Receipt في الإصدار الجديد هي من خلال واجهة جديدة كالتالي
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
بالطبع، الأنظمة التي تقل عن ios7.0 يجب استخدام واجهات الإصدار القديم، وإليك كيفية التكيف مع كلا الإصدارين من الكود:
NSData*receipt= nil; إذا (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){ //ios بعد 7.0 NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; receipt = [NSData dataWithContentsOfURL:receiptURL]; NSString *receiptURLStr = [receiptURL absoluteString]; NSRange rangeSandbox = [receiptURLStr rangeOfString:@"sandbox"]; إذا (rangeSandbox.location != NSNotFound){ record[kIAPEnvironment] = [NSNumber numberWithInt:1]; } } //ios 3.0~7.0 receipt = transaction.transactionReceipt; NSDictionary *dict = [NSDictionary dictionaryWithContentsOfData:receipt]; إذا (dict){ NSString *env = [dict objectForKey:@"environment"]; إذا ([env isEqualToString:@"Sandbox"]) { record[kIAPEnvironment] = [NSNumber numberWithInt:1]; } } }
تحديد ما إذا كان الدفع في Sandbox، في الإصدار الجديد يمكن تحديد ما إذا كان يحتوي receiptURL على "sandbox"
يمكن تحليل receipt القديم NSAData لمعرفة ما إذا كان environment هو Sandbox
+ (NSDictionary *)dictionaryWithContentsOfData: (NSData *)data{ CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)data, kCFPropertyListImmutable, NULL); إذا (plist == nil) return nil; إذا ([(__bridge id)plist isKindOfClass:[NSDictionary class]]){ return (__bridge NSDictionary *)plist; } CFRelease(plist); return nil; } }
طريقة التحقق من الفاتورة للعميل:
NSError *error; NSDictionary *requestContents = @{ @"receipt-data": [receipt base64EncodedString] }; NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error]; إذا (!requestData) { return; } // أنشئ طلب POST يحتوي على بيانات الفاتورة. NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];//حسب ما إذا كان الدفع في الصندوق الإختباري، اختر العنوان الصحيح NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; [storeRequest setHTTPMethod:@"POST"]; [storeRequest setHTTPBody:requestData]; // إقامة اتصال إلى متجر iTunes في طابور الخلفية. NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { إذا (connectionError) { /* ... معالجة الخطأ ... */ } NSError *error; NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (!jsonResponse) { /* ... معالجة الخطأ ...*/ } /* ... إرسال استجابة عائدة إلى الجهاز ... */ } };
نمط العودة القديم:
{ bid = "com.coodezhang.test"; bvrs = "1.0"; "item_id" = 892617314; "original_purchase_date" = "2017-12-14 07:43:14 Etc/GMT"; "original_purchase_date_ms" = 1626147394550; "original_purchase_date_pst" = "2017-12-14 12:43:14 America/Los_Angeles"; "original_transaction_id" = 1000001127239959; "product_id" = "com.coodezhang.test_coins99M_Tier1"; "purchase_date" = "2017-12-14 07:43:14 Etc/GMT"; "purchase_date_ms" = 1626147394550; "purchase_date_pst" = "2017-12-14 12:43:14 America/Los_Angeles"; quantity = 1; "transaction_id" = 1000001127239959; "unique_identifier" = 0000b0124819; "unique_vendor_identifier" = "ASDGF2DB-DSAD-5A21-9611-642A4B9CASDE7"; }; status = 0; }
النسخة الجديدة من نمط العودة الرسمية:الوثائق الرسمية
النسخة الجديدة من النمط العودة:
{ environment = Sandbox; receipt = { "adam_id" = 0; "app_item_id" = 0; "application_version" = 1; "bundle_id" = "com.coodezhang.test"; "download_id" = 0; "in_app" = ( { "is_trial_period" = false; "original_purchase_date" = "2017-12-14 07:18:56 Etc/GMT"; "original_purchase_date_ms" = 1513235936000; "original_purchase_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles"; "original_transaction_id" = 1000000359369424; "product_id" = "com.coodezhang.test_coins99M_Tier1"; "purchase_date" = "2017-12-14 07:18:56 Etc/GMT"; "purchase_date_ms" = 1513235936000; "purchase_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles"; quantity = 1; "transaction_id" = 1000000359369424; } ...... يوجد إمكانية لتعدد سجلات ); "original_application_version" = "1.0"; "original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT"; "original_purchase_date_ms" = 1375340400000; "original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles"; "receipt_creation_date" = "2017-12-14 07:18:56 Etc/GMT"; "receipt_creation_date_ms" = 1513235936000; "receipt_creation_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles"; "receipt_type" = ProductionSandbox; "request_date" = "2017-12-14 07:19:23 Etc/GMT"; "request_date_ms" = 1513235963829; "request_date_pst" = "2017-12-13 23:19:23 America/Los_Angeles"; "version_external_identifier" = 0; }; status = 0; }
يُشار إلى أن في المخطط البياني الجديد، قد يحتوي حقل in_app على receipt لعدة معاملات. عند إكمال المعاملة، إذا لم يتم تنفيذ الدعوة إلى واجهة قراءة receipt بعد ذلك، عند قراءة receipt التالية سيتم قراءة جميعها، مما يؤدي إلى ظهور بيانات متعددة.
يُشار إلى أن تطبيقات المطورين لديها نظام دفع خاص بهم، وقد يتم إنشاء معرف طلب خاص لكل طلب قبل تقديم الطلب، ويجب أن يتم مطابقته مع receipt الذي يعود من الدفع عبر iOS، ويجب الانتباه إلى كيفية التعامل مع هذا السيناريو.
هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أيضًا أن تدعموا وتشجعوا تعليمات النطق.
إعلان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق الطبع والنشر، تم جمع المحتوى من قبل المستخدمين عبر الإنترنت بشكل تلقائي، ولا يمتلك هذا الموقع حقوق الملكية، ولم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا اكتشفت محتوى يشتبه في انتهاك حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # بـ @ عند إرسال البريد الإلكتروني) للإبلاغ، وتقديم الدليل على ذلك، وإذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.