iOS支付的一些配置

iOS支付

iOS支付分為兩類蚊荣,第三方支付應(yīng)用內(nèi)支付(內(nèi)購)

第三方支付包括:支付寶支付秫筏、微信支付诱鞠、銀聯(lián)支付、百度錢包这敬、京東支付等等航夺。

應(yīng)用內(nèi)支付(In-App Purchase):在應(yīng)用程序內(nèi)購買虛擬商品。如果你在App Store上銷售的應(yīng)用程序崔涂,將收到支付金額的70%阳掐。

第三方支付

彈出方式

網(wǎng)頁

有些第三方支付沒有安裝客戶端,可以直接彈出網(wǎng)頁進行支付冷蚂。(比如支付寶)

調(diào)用APP

手機中安裝了客戶端可以跳轉(zhuǎn)到APP中進行支付缭保。微信支付只能調(diào)用App進行支付。

支付寶支付

相關(guān)資料

支付寶開放平臺(SDK&開發(fā)文檔):https://open.alipay.com/platform/home.htm

移動支付集成:https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1

商戶服務(wù)平臺(與支付寶簽約需要填寫的公司資料):https://b.alipay.com/newIndex.htm

支付流程

在商戶服務(wù)平臺先與支付寶簽約蝙茶,獲得商戶ID(partner)和賬號ID(seller)艺骂,需要提供公司資質(zhì)或者營業(yè)執(zhí)照,個人無法申請隆夯。

文檔地址:https://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103542&docType=1

生成并下載相應(yīng)的公鑰私鑰文件(加密簽名用)

文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.POMYKl&treeId=58&articleId=103543&docType=1

下載支付寶SDK:https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

生成訂單信息

調(diào)用支付寶客戶端钳恕,由支付寶客戶端跟支付寶安全服務(wù)器打交道

支付完畢后返回支付結(jié)果給商戶客戶端和服務(wù)器

SDK里有集成支付寶功能的一個Demo别伏,集成支付功能的具體操作方式,可以參考Demo忧额。

代碼集成流程

參考文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.efmKDS&treeId=59&articleId=103676&docType=1

下載官方SDK

下載地址:https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

本Demo使用的SDK是從官方Demo整理出來的厘肮,整理的SDK版本:201501022。

下載地址:http://7xooko.com1.z0.glb.clouddn.com/AlipaySDK.zip

目錄結(jié)構(gòu)如下:

├──AlipaySDK.bundle├──AlipaySDK.framework├──Order.h├──Order.m├──Util├──libcrypto.a├──libssl.a└──openssl

其中:

AlipaySDK.bundle和AlipaySDK.framework是支付寶SDK

Order類:定義訂單信息

Util睦番、libcrypto.a类茂、libssl.a、openssl:數(shù)據(jù)簽名托嚣,對訂單信息進行加密

添加依賴庫

其中大咱,需要注意的是:

如果是Xcode 7.0之后的版本,需要添加libc++.tbd注益、libz.tbd;

如果是Xcode 7.0之前的版本溯捆,需要添加libc++.dylib丑搔、libz.dylib。

創(chuàng)建prefix header filePCH文件提揍,添加#import

在Build Settings中的prefix header設(shè)置pch文件路徑

在Build Settings中Header Search Paths添加頭文件引用路徑啤月,[文件路徑]/AlipaySDK/

在需要調(diào)用AlipaySDK的文件中,增加頭文件引用劳跃。

#import#import"Order.h"#import"DataSigner.h"

生成訂單信息及簽名

//將商品信息賦予AlixPayOrder的成員變量Order *order = [[Order alloc] init];order.partner= PartnerID;// 商戶IDorder.seller= SellerID;// 賬號IDorder.tradeNO=@"20150923";//訂單ID(由商家自行制定)order.productName=@"iPhone6s";//商品標(biāo)題order.productDescription=@"新年打折";//商品描述order.amount=@"0.01";//商品價格(單位:元)order.notifyURL=@"http://www.chaosky.me";//回調(diào)URL谎仲,支付成功或者失敗回調(diào)通知自己的服務(wù)器進行訂單狀態(tài)變更order.service=@"mobile.securitypay.pay";order.paymentType=@"1";order.inputCharset=@"utf-8";order.itBPay=@"30m";order.showUrl=@"m.alipay.com";// 應(yīng)用注冊scheme,在AlixPayDemo-Info.plist定義URL typesNSString*appScheme =@"AliPayDemo";//將商品信息拼接成字符串NSString*orderSpec = [order description];NSLog(@"orderSpec = %@",orderSpec);//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncodeid signer = CreateRSADataSigner(PartnerPrivKey);NSString*signedString = [signer signString:orderSpec];//將簽名成功字符串格式化為訂單字符串,請嚴(yán)格按照該格式NSString*orderString =nil;if(signedString !=nil) {? ? orderString = [NSStringstringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",? ? ? ? ? ? ? ? ? orderSpec, signedString,@"RSA"];? ? [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary*resultDic) {NSLog(@"reslut = %@",resultDic);? ? }];}

Xcode設(shè)置URL scheme

iPhone SDK可以把你的App和一個自定義的URL Scheme綁定。該URL Scheme可用來從瀏覽器或別的App啟動你的App刨仑。

配置方法:打開info.plist文件郑诺,找到或者添加如圖所示的鍵值對:

URL Scheme值為代碼中對應(yīng)的值,必須一致杉武。

配置支付寶客戶端返回url處理方法

AppDelegate.m文件中辙诞,增加引用代碼:

#import

在@implementation AppDelegate中增加如下代碼:

- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{//如果極簡開發(fā)包不可用,會跳轉(zhuǎn)支付寶錢包進行支付轻抱,需要將支付寶錢包的支付結(jié)果回傳給開發(fā)包if([url.hostisEqualToString:@"safepay"]) {? ? ? ? [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary*resultDic) {//【由于在跳轉(zhuǎn)支付寶客戶端支付的過程中飞涂,商戶app在后臺很可能被系統(tǒng)kill了,所以pay接口的callback就會失效祈搜,請商戶對standbyCallback返回的回調(diào)結(jié)果進行處理,就是在這個方法里面處理跟callback一樣的邏輯】NSLog(@"result = %@",resultDic);? ? ? ? }];? ? }if([url.hostisEqualToString:@"platformapi"]){//支付寶錢包快登授權(quán)返回authCode[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary*resultDic) {//【由于在跳轉(zhuǎn)支付寶客戶端支付的過程中较店,商戶app在后臺很可能被系統(tǒng)kill了,所以pay接口的callback就會失效容燕,請商戶對standbyCallback返回的回調(diào)結(jié)果進行處理,就是在這個方法里面處理跟callback一樣的邏輯】NSLog(@"result = %@",resultDic);? ? ? ? }];? ? }returnYES;}

微信支付

需要提供公司資質(zhì)或者營業(yè)執(zhí)照梁呈,個人無法申請。

相關(guān)文檔

微信開放平臺:https://open.weixin.qq.com

微信支付商戶平臺:https://pay.weixin.qq.com/index.php

微信公眾平臺:https://mp.weixin.qq.com

支付流程

向微信注冊你的應(yīng)用程序id

開發(fā)者應(yīng)用登記頁面進行登記缰趋,登記并選擇移動應(yīng)用進行設(shè)置后捧杉,將獲得AppID陕见,可立即用于開發(fā)。但應(yīng)用登記完成后還需要提交審核味抖,只有審核通過的應(yīng)用才能正式發(fā)布使用评甜。

微信APP支付接入商戶服務(wù)中心

參考文檔鏈接:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=&lang=zh_CN

下載微信SDK文件,如果在項目中應(yīng)使用SDK的最新版仔涩。

官方資源下載地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&token=&lang=zh_CN

本Demo使用的SDK是從官方Demo整理出來的忍坷,整理的SDK版本:1.6.1。

下載地址:http://7xooko.com1.z0.glb.clouddn.com/AlipaySDK.zip

目錄結(jié)構(gòu)如下:

├──SDKExport│? ├──WXApi.h│? ├──WXApiObject.h│? ├──libWeChatSDK.a│? └──read_me.txt└──lib├──ApiXml.h├──ApiXml.mm├──WXUtil.h├──WXUtil.mm├──payRequsestHandler.h└──payRequsestHandler.mm

其中:

SDKExport文件夾:SDK文件

lib文件夾:工具類

添加依賴庫

SystemConfiguration.frameworklibz.dyliblibsqlite3.dyliblibc++.dylibCoreTelephony.frameworkCoreGraphics.framework

Xcode設(shè)置URL scheme

在Xcode中熔脂,選擇你的工程設(shè)置項佩研,選中“TARGETS”一欄,在“info”標(biāo)簽欄的“URL type“添加“URL scheme”為你所注冊的應(yīng)用程序id(如下圖所示)。

在你需要使用微信終端API的文件中import WXApi.h 頭文件椒振,并增加 WXApiDelegate 協(xié)議慕蔚。

// 微信所有的API接口#import"WXApi.h"http:// APP端簽名相關(guān)頭文件#import"payRequsestHandler.h"@interfaceAppDelegate()@end

要使你的程序啟動后微信終端能響應(yīng)你的程序,必須在代碼中向微信終端注冊你的id绊序。(如下圖所示,在 AppDelegate 的 didFinishLaunchingWithOptions 函數(shù)中向微信注冊id)秽荞。

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {// Override point for customization after application launch.//向微信注冊[WXApi registerApp:APP_ID withDescription:@"demo 2.0"];returnYES;}

重寫AppDelegate的handleOpenURL和openURL方法:

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url{return[WXApi handleOpenURL:url delegate:self];}- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{return[WXApi handleOpenURL:url delegate:self];}

現(xiàn)在骤公,你的程序要實現(xiàn)和微信終端交互的具體請求與回應(yīng),因此需要實現(xiàn)WXApiDelegate協(xié)議的兩個方法:

-(void) onReq:(BaseReq*)req{if([req isKindOfClass:[GetMessageFromWXReq class]])? ? {// 微信請求App提供內(nèi)容扬跋, 需要app提供內(nèi)容后使用sendRsp返回NSString*strTitle = [NSStringstringWithFormat:@"微信請求App提供內(nèi)容"];NSString*strMsg =@"微信請求App提供內(nèi)容阶捆,App要調(diào)用sendResp:GetMessageFromWXResp返回給微信";UIAlertView*alert = [[UIAlertViewalloc] initWithTitle:strTitle message:strMsg delegate:selfcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];? ? ? ? alert.tag=1000;? ? ? ? [alert show];? ? }elseif([req isKindOfClass:[ShowMessageFromWXReq class]])? ? {? ? ? ? ShowMessageFromWXReq* temp = (ShowMessageFromWXReq*)req;? ? ? ? WXMediaMessage *msg = temp.message;//顯示微信傳過來的內(nèi)容WXAppExtendObject *obj = msg.mediaObject;NSString*strTitle = [NSStringstringWithFormat:@"微信請求App顯示內(nèi)容"];NSString*strMsg = [NSStringstringWithFormat:@"標(biāo)題:%@ \n內(nèi)容:%@ \n附帶信息:%@ \n縮略圖:%lu bytes\n\n", msg.title, msg.description, obj.extInfo, msg.thumbData.length];UIAlertView*alert = [[UIAlertViewalloc] initWithTitle:strTitle message:strMsg delegate:selfcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];? ? ? ? [alert show];? ? }elseif([req isKindOfClass:[LaunchFromWXReq class]])? ? {//從微信啟動AppNSString*strTitle = [NSStringstringWithFormat:@"從微信啟動"];NSString*strMsg =@"這是從微信啟動的消息";UIAlertView*alert = [[UIAlertViewalloc] initWithTitle:strTitle message:strMsg delegate:selfcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];? ? ? ? [alert show];? ? }}

onReq是微信終端向第三方程序發(fā)起請求,要求第三方程序響應(yīng)钦听。第三方程序響應(yīng)完后必須調(diào)用sendRsp返回洒试。在調(diào)用sendRsp返回時,會切回到微信終端程序界面朴上。

-(void) onResp:(BaseResp*)resp {NSString*strMsg = [NSStringstringWithFormat:@"errcode:%d", resp.errCode];NSString*strTitle;if([resp isKindOfClass:[SendMessageToWXResp class]])? ? {? ? ? ? strTitle = [NSStringstringWithFormat:@"發(fā)送媒體消息結(jié)果"];? ? }if([resp isKindOfClass:[PayResp class]]){//支付返回結(jié)果儡司,實際支付結(jié)果需要去微信服務(wù)器端查詢strTitle = [NSStringstringWithFormat:@"支付結(jié)果"];switch(resp.errCode) {caseWXSuccess:? ? ? ? ? ? ? ? strMsg =@"支付結(jié)果:成功!";NSLog(@"支付成功-PaySuccess余指,retcode = %d", resp.errCode);break;default:? ? ? ? ? ? ? ? strMsg = [NSStringstringWithFormat:@"支付結(jié)果:失敳度!retcode = %d, retstr = %@", resp.errCode,resp.errStr];NSLog(@"錯誤酵镜,retcode = %d, retstr = %@", resp.errCode,resp.errStr);break;? ? ? ? }? ? }UIAlertView*alert = [[UIAlertViewalloc] initWithTitle:strTitle message:strMsg delegate:selfcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];? ? [alert show]; }

如果第三方程序向微信發(fā)送了sendReq的請求碉碉,那么onResp會被回調(diào)。sendReq請求調(diào)用后淮韭,會切到微信終端程序界面

應(yīng)用內(nèi)支付(In-App Purchase)

在應(yīng)用程序內(nèi)購買虛擬商品垢粮。如果你在App Store上銷售的應(yīng)用程序,將收到支付金額的70%靠粪。

相關(guān)資料

沙盒測試賬號:352135598@qq.com 密碼:Test1234phone

支付流程

配置App ID

為應(yīng)用建立建立一個不帶通配符的App ID

用該App ID生成和安裝相應(yīng)的Provisioning Profile文件蜡吧。

配置iTunes Connect

填寫相關(guān)的稅務(wù)毫蚓,銀行,聯(lián)系人信息

參考鏈接:iOS App提交指南(二)-協(xié)議昔善、稅務(wù)和銀行業(yè)務(wù)

添加一個用于在sandbox付費的測試用戶

用該App ID創(chuàng)建一個新的應(yīng)用元潘。

創(chuàng)建應(yīng)用內(nèi)付費項目,選擇付費類型君仆。

App 內(nèi)購買項目摘要填寫

主要代碼實現(xiàn)

在工程中引入StoreKit.framework和#import

獲得所有的付費Product ID列表翩概。這個可以用常量存儲在本地,也可以由自己的服務(wù)器返回返咱。

//在內(nèi)購項目中創(chuàng)建的商品單號#defineProductID_IAP_FTHJ @"com.1000phone.IAPDemo.fthj_purple"http:// 方天畫戟 488元#defineProductID_IAP_XYJ @"com.1000phone.IAPDemo.xyj"http:// 軒轅劍 6,498元#defineProductID_IAP_JB @"com.1000phone.IAPDemo.jb"http:// 金幣 6元=6金幣

?

制作界面钥庇,展示所有的應(yīng)用內(nèi)付費項目。這些應(yīng)用內(nèi)付費項目的價格和介紹信息可以從App Store服務(wù)器請求咖摹,也可以是自己的服務(wù)器返回评姨。向App Store查詢速度非常慢,通常需要2-3秒鐘萤晴,最好從服務(wù)器請求参咙。

- (void)createViews{NSArray* buttonNames = @[@"軒轅劍 6498元",@"方天畫戟 488元",@"金幣6元=6金幣"];? ? __weaktypeof(self) weakSelf =self;? ? [buttonNames enumerateObjectsUsingBlock:^(NSString* buttonName,NSUIntegeridx,BOOL* stop) {UIButton* button = [UIButtonbuttonWithType:UIButtonTypeSystem];? ? ? ? [weakSelf.viewaddSubview:button];? ? ? ? button.frame=CGRectMake(100,100+ idx? *60,150,50);? ? ? ? button.titleLabel.font= [UIFontsystemFontOfSize:18];? ? ? ? [button setTitle:buttonName forState:UIControlStateNormal];// 設(shè)置tag值button.tag= PAY_BUTTON_BEGIN_TAG + idx;? ? ? ? [button addTarget:selfaction:@selector(buyProduct:) forControlEvents:UIControlEventTouchUpInside];? ? }];}- (void)buyProduct:(UIButton*) sender{}

?

當(dāng)用戶點擊了一個IAP項目,我們先查詢用戶是否允許應(yīng)用內(nèi)付費硫眯。

- (void)buyProduct:(UIButton*) sender{self.buyType= sender.tag- PAY_BUTTON_BEGIN_TAG;if([SKPaymentQueue canMakePayments]) {// 執(zhí)行下面提到的第5步:[selfrequestProductData];NSLog(@"允許程序內(nèi)付費購買");? ? }else{NSLog(@"不允許程序內(nèi)付費購買");UIAlertView*alerView =? [[UIAlertViewalloc] initWithTitle:@"提示"message:@"您的手機沒有打開程序內(nèi)付費購買"delegate:nilcancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil];? ? ? ? [alerView show];? ? }}

我們先通過該IAP的ProductID向AppStore查詢,獲得SKPayment實例择同,然后通過SKPaymentQueue的 addPayment方法發(fā)起一個購買的操作两入。

// 下面的ProductId應(yīng)該是事先在itunesConnect中添加好的,已存在的付費項目敲才。否則查詢會失敗裹纳。- (void)requestProductData {NSLog(@"---------請求對應(yīng)的產(chǎn)品信息------------");NSArray*product =nil;switch(self.buyType) {case0:? ? ? ? ? product = [NSArrayarrayWithObject:ProductID_IAP_XYJ];break;case1:? ? ? ? ? product = [NSArrayarrayWithObject:ProductID_IAP_FTHJ];break;case2:? ? ? ? ? product = [NSArrayarrayWithObject:ProductID_IAP_JB];break;? }NSSet*nsset = [NSSetsetWithArray:product];? SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];? request.delegate=self;? [request start];}#pragma mark - SKProductsRequestDelegate// 收到的產(chǎn)品信息回調(diào)- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{NSLog(@"-----------收到產(chǎn)品反饋信息--------------");NSArray*myProduct = response.products;if(myProduct.count==0) {NSLog(@"無法獲取產(chǎn)品信息,購買失敗紧武。");return;? }NSLog(@"產(chǎn)品Product ID:%@",response.invalidProductIdentifiers);NSLog(@"產(chǎn)品付費數(shù)量: %d", (int)[myProduct count]);// populate UIfor(SKProduct *productinmyProduct){NSLog(@"product info");NSLog(@"SKProduct 描述信息%@", [product description]);NSLog(@"產(chǎn)品標(biāo)題 %@", product.localizedTitle);NSLog(@"產(chǎn)品描述信息: %@", product.localizedDescription);NSLog(@"價格: %@", product.price);NSLog(@"Product id: %@", product.productIdentifier);? }? SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];NSLog(@"---------發(fā)送購買請求------------");? [[SKPaymentQueue defaultQueue] addPayment:payment];}//彈出錯誤信息- (void)request:(SKRequest *)request didFailWithError:(NSError*)error{NSLog(@"-------彈出錯誤信息----------");UIAlertView*alerView =? [[UIAlertViewalloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delegate:nilcancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];? [alerView show];}-(void) requestDidFinish:(SKRequest *)request{NSLog(@"----------反饋信息結(jié)束--------------");}

在viewDidLoad方法中剃氧,將購買頁面設(shè)置成購買的Observer。

- (void)viewDidLoad {? ? [superviewDidLoad];? ? [selfcreateViews];// 監(jiān)聽購買結(jié)果[[SKPaymentQueue defaultQueue] addTransactionObserver:self];}- (void)dealloc{? ? [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];}

當(dāng)用戶購買的操作有結(jié)果時阻星,就會觸發(fā)下面的回調(diào)函數(shù)朋鞍,相應(yīng)進行處理即可。

#pragma mark - SKPaymentTransactionObserver// 處理交易結(jié)果- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray*)transactions {for(SKPaymentTransaction *transactionintransactions)? ? {switch(transaction.transactionState)? ? ? ? {caseSKPaymentTransactionStatePurchased://交易完成NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);? ? ? ? ? ? ? ? [selfcompleteTransaction:transaction];break;caseSKPaymentTransactionStateFailed://交易失敗[selffailedTransaction:transaction];break;caseSKPaymentTransactionStateRestored://已經(jīng)購買過該商品[selfrestoreTransaction:transaction];break;caseSKPaymentTransactionStatePurchasing://商品添加進列表NSLog(@"商品添加進列表");break;default:break;? ? ? ? }? ? }}// 交易完成- (void)completeTransaction:(SKPaymentTransaction *)transaction {NSString* productIdentifier = transaction.payment.productIdentifier;//? ? NSString * receipt = [transaction.transactionReceipt base64EncodedString];if([productIdentifier length] >0) {// 向自己的服務(wù)器驗證購買憑證}// Remove the transaction from the payment queue.[[SKPaymentQueue defaultQueue] finishTransaction: transaction];}// 交易失敗- (void)failedTransaction:(SKPaymentTransaction *)transaction {if(transaction.error.code!= SKErrorPaymentCancelled) {NSLog(@"購買失敗");? ? }else{NSLog(@"用戶取消交易");? ? }? ? [[SKPaymentQueue defaultQueue] finishTransaction: transaction];}// 已購商品- (void)restoreTransaction:(SKPaymentTransaction *)transaction {// 對于已購商品妥箕,處理恢復(fù)購買的邏輯[[SKPaymentQueue defaultQueue] finishTransaction: transaction];}

服務(wù)器驗證憑證(Optional)滥酥。如果購買成功,我們需要將憑證發(fā)送到服務(wù)器上進行驗證畦幢】参牵考慮到網(wǎng)絡(luò)異常情況,iOS端的發(fā)送憑證操作應(yīng)該進行持久化宇葱,如果程序退出瘦真,崩潰或網(wǎng)絡(luò)異常刊头,可以恢復(fù)重試。

參考鏈接

iOS開發(fā)內(nèi)購全套圖文教程

iOS應(yīng)用內(nèi)付費(IAP)開發(fā)步驟列表

iOS內(nèi)購實現(xiàn)及測試Check List支付

文/AZLIn(簡書作者)

原文鏈接:http://www.reibang.com/p/84bcd7cfc399

著作權(quán)歸作者所有诸尽,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)原杂,并標(biāo)注“簡書作者”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弦讽,一起剝皮案震驚了整個濱河市污尉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌往产,老刑警劉巖被碗,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仿村,居然都是意外死亡锐朴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門蔼囊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焚志,“玉大人,你說我怎么就攤上這事畏鼓〗闯辏” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵云矫,是天一觀的道長膳沽。 經(jīng)常有香客問我,道長让禀,這世上最難降的妖魔是什么挑社? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮巡揍,結(jié)果婚禮上痛阻,老公的妹妹穿的比我還像新娘。我一直安慰自己腮敌,他們只是感情好阱当,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著糜工,像睡著了一般斗这。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啤斗,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天表箭,我揣著相機與錄音,去河邊找鬼。 笑死免钻,一個胖子當(dāng)著我的面吹牛彼水,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播极舔,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼凤覆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拆魏?” 一聲冷哼從身側(cè)響起盯桦,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渤刃,沒想到半個月后拥峦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡卖子,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年略号,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洋闽。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡玄柠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诫舅,到底是詐尸還是另有隱情羽利,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布刊懈,位于F島的核電站这弧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俏讹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一畜吊、第九天 我趴在偏房一處隱蔽的房頂上張望泽疆。 院中可真熱鬧,春花似錦玲献、人聲如沸殉疼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓢娜。三九已至,卻和暖如春礼预,著一層夾襖步出監(jiān)牢的瞬間眠砾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工托酸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褒颈,地道東北人柒巫。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像谷丸,于是被迫代替她去往敵國和親堡掏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • iOS支付 iOS支付分為兩類刨疼,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購)泉唁。 第三方支付包括:支付寶支付、微信支付揩慕、銀聯(lián)支付亭畜、...
    sillen閱讀 1,352評論 0 1
  • iOS支付 iOS支付分為兩類,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購)漩绵。 第三方支付包括:支付寶支付贱案、微信支付、銀聯(lián)支付止吐、...
    請輸入賬號名閱讀 6,176評論 3 22
  • 在我們應(yīng)用開發(fā)中我們經(jīng)常在自己的項目中使用到支付宝踪,下面我們來談?wù)刬OS這塊的支付;iOS支付主要分為兩類碍扔,第三方支...
    Hither閱讀 8,257評論 9 42
  • iOS支付 iOS支付分為兩類瘩燥,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購)。 第三方支付包括:支付寶支付不同、微信支付厉膀、銀聯(lián)支付、...
    羊駝先生丶閱讀 898評論 0 0
  • 我不知道最近怎么了二拐,自從你走之后服鹅,我表現(xiàn)的越來越不盡人意。 昨天走路的時候前面有一對老人百新,老婆婆左手吃力的拉著推車...
    雨憶半陽閱讀 232評論 0 0