IOS應(yīng)用內(nèi)支付返回新舊Receipt適配的方法
ios7.0后ios支付成功返回的票據(jù)Receipt的獲取方式有了新的方式,
原來(lái)的SKPaymentTransaction中的transactionReceipt屬性獲取票據(jù)的方式已經(jīng)過(guò)期,雖然還能使用,但是蘋果官方建議使用新的
新版的獲取Receipt的方式是通過(guò)新接口如下
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
當(dāng)然,低于ios7.0的還是需要使用老版本接口,對(duì)兩種版本進(jìn)行適配的代碼如下:
NSData*receipt= nil; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){ //ios after 7.0 NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; receipt = [NSData dataWithContentsOfURL:receiptURL]; NSString *receiptURLStr = [receiptURL absoluteString]; NSRange rangeSandbox = [receiptURLStr rangeOfString:@"sandbox"]; if (rangeSandbox.location != NSNotFound){ record[kIAPEnvironment] = [NSNumber numberWithInt:1]; } }else{ //ios 3.0~7.0 receipt = transaction.transactionReceipt; NSDictionary *dict = [NSDictionary dictionaryWithContentsOfData:receipt]; if (dict){ NSString *env = [dict objectForKey:@"environment"]; if ([env isEqualToString:@"Sandbox"]) { record[kIAPEnvironment] = [NSNumber numberWithInt:1]; } } }
判斷是否是沙盒支付,新版本可以直接判斷receiptURL中是否存在“sandbox“
老版本receipt可以解析NSData 查看environment是否為Sandbox來(lái)判斷
+ (NSDictionary *)dictionaryWithContentsOfData: (NSData *)data{ CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)data, kCFPropertyListImmutable, NULL); if(plist == nil) return nil; if ([(__bridge id)plist isKindOfClass:[NSDictionary class]]){ return (__bridge NSDictionary *)plist; }else{ CFRelease(plist); return nil; } }
客戶端receipt驗(yàn)證方式:
NSError *error; NSDictionary *requestContents = @{ @"receipt-data": [receipt base64EncodedString] }; NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error]; if (!requestData) { return; } // Create a POST request with the receipt data. NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];//根據(jù)是否是沙盒支付驗(yàn)證取正確的地址 NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; [storeRequest setHTTPMethod:@"POST"]; [storeRequest setHTTPBody:requestData]; // Make a connection to the iTunes Store on a background queue. NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (connectionError) { /* ... Handle error ... */ } else { NSError *error; NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (!jsonResponse) { /* ... Handle error ...*/ } /* ... Send a response back to the device ... */ } }];
老版本返回格式:
{ 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; }
值得注意的是,新版中數(shù)據(jù)結(jié)構(gòu)中的in_app字段,可能包含多個(gè)transaction的receipt。當(dāng)完成transaction后,還沒(méi)有成功調(diào)用讀取過(guò)receipt的接口,那下一次讀取recept時(shí)會(huì)把所有的都讀取出來(lái),從而出現(xiàn)多條數(shù)據(jù)。
一般開(kāi)發(fā)商app支付都有自己的支付系統(tǒng),可能每次下單之前都會(huì)創(chuàng)建自己的訂單號(hào),需要與ios支付后返回的receipt一一對(duì)應(yīng),這種情況下如何處理還需要注意。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue單應(yīng)用在ios系統(tǒng)中實(shí)現(xiàn)微信分享功能操作
- iOS如何開(kāi)發(fā)簡(jiǎn)單的手繪應(yīng)用實(shí)例詳解
- iOS指紋識(shí)別的簡(jiǎn)單應(yīng)用
- iOS應(yīng)用腳本重簽名的實(shí)現(xiàn)方法
- 詳解IOS微信上Vue單頁(yè)面應(yīng)用JSSDK簽名失敗解決方案
- 利用Angular2 + Ionic3開(kāi)發(fā)IOS應(yīng)用實(shí)例教程
- iOS實(shí)現(xiàn)應(yīng)用內(nèi)切換語(yǔ)言及字體大小(模仿微信)
- iOS應(yīng)用內(nèi)實(shí)現(xiàn)跳轉(zhuǎn)到手機(jī)淘寶天貓的方法
- iOS如何優(yōu)雅地消除應(yīng)用角標(biāo)詳解
- 如何在 iOS 應(yīng)用中添加位置信息
相關(guān)文章
iOS中UILabel text兩邊對(duì)齊的實(shí)現(xiàn)代碼
本文通過(guò)一段實(shí)例代碼給大家介紹了ios中uilabel text兩邊對(duì)齊的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01iOS 將系統(tǒng)自帶的button改裝成上圖片下文字的樣子
這篇文章主要介紹了 iOS 將系統(tǒng)自帶的button改裝成上圖片下文字的樣子,代碼是通過(guò)繼承UIButton,然后再重寫layoutSubviews方法,對(duì)自帶的圖片和titleLabel進(jìn)行重新的layout。下面通過(guò)本文給大家分享下實(shí)現(xiàn)代碼2016-12-12iOS開(kāi)發(fā)之路--仿網(wǎng)易抽屜效果
本文是IOS開(kāi)發(fā)之路系列的第一篇,主要講訴了如何仿網(wǎng)易新聞客戶端實(shí)現(xiàn)抽屜效果,全部源代碼都分享給大家,希望對(duì)大家有所幫助2014-08-08iOS仿微信搖一搖動(dòng)畫效果加震動(dòng)音效實(shí)例
這篇文章主要介紹了iOS仿微信搖一搖動(dòng)畫效果加震動(dòng)音效實(shí)例,詳細(xì)介紹了微信搖一搖功能的實(shí)現(xiàn)原理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03iOS中Swift UISearchController仿微信搜索框
這篇文章主要介紹了iOS中Swift UISearchController仿微信搜索框效果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05iOS應(yīng)用開(kāi)發(fā)中AFNetworking庫(kù)的常用HTTP操作方法小結(jié)
AFNetworking庫(kù)是Objective-C語(yǔ)言寫成的用于處理HTTP的第三方庫(kù),在GitHub上開(kāi)源并且一直在被更新和維護(hù),下面就一起來(lái)看一下iOS應(yīng)用開(kāi)發(fā)中AFNetworking庫(kù)的常用HTTP操作方法小結(jié)2016-05-05iOS中UIScrollView嵌套UITableView的實(shí)踐教程
在UIScrollView嵌套UITableView的問(wèn)題相信大家都遇到過(guò),小編最近在工作中就遇到了這個(gè)問(wèn)題,所以這篇文章主要介紹了iOS中UIScrollView嵌套UITableView的相關(guān)資料,文中介紹的方法是通過(guò)自己的實(shí)踐所得來(lái)的,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05