iOS应用内支付(IAP)的开发经验交流
最近几个星期,应产品需求开发了应用内支付流程,即IAP。提笔写下大致过程,分享与大家交流。我这里是从development开发者中心创建证书和配置文件,在iTunes后天创建应用,创建虚拟商品,接入OC代码这样一套逻辑来写的,如果新手不太明白具体内容,建议先看看苹果官方文档的中文翻译版本,了解一二!!!
1,配置Developer.apple.com
(1)登录到Developer.apple.com,创建证书,即开发者开发证书
(2)为应用建立建立一个不带通配符的App ID
(3)用该App ID生成和安装相应的Provisioning Profile文件
(4)添加真机测试的手机
2,配置iTunes Connect
(1)登录到iTunes Connet,用该App ID创建一个新的应用,大致信息填写
(2)在功能模块,创建虚拟物品
创建物品 第二步这里的产品ID,最好写的有意义,在后面代码接入购买的时候用到
(3)设置税务和银行卡信息
我这边是经理事先填好的,需要的话,请看这里http://openfibers.github.io/blog/2015/02/28/in-app-purchase-walk-through/
(4)创建应用的沙盒测试账号
点击用户与职能
点击+号,根据具体信息填写
3,接入代码
(1)设置bundleID,填加证书和配置文件,保证能在手机上跑起来
(2)普及一个,我这边学到的知识
IAP的支付流程分为两种,一种是有服务器参与的,一种是没有服务器参与的。有服务器参与就是说,在购买之前,需要把产品的相关信息发送到服务器,服务器验证购买凭证,如果成功,我们能拿到订单字符串,发起支付购买,完成之后,苹果服务器返回结果,我们拿到结果在跟服务器验证,验证成功后,可以由服务器发放具体的商品;没有服务器参与的话,就是跳过了验证过程,是由客户端自己处理逻辑。具体在看代码吧。
官方的两张图,有服务器和无服务器
无 有(3)需要在工程中引入 Storekit.framework框架
支付控制器中 #import <StoreKit/StoreKit.h>
遵守两个代理协议 SKProductsRequestDelegate 和 SKPaymentTransactionObserver, 前者是获取产品信息的回调,后者是购买的观察者。
(4)创建一个获取产品信息的请求
NSSet * set = [NSSet setWithArray:@[prodectId]]; // 这个就是产品ID,在iTunes后台创建
SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers: set];
request.delegate = self; // 遵守SKProductsRequestDelegate代理
[request start];
查询产品信息的回调函数
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSArray *myProduct = response.products; // 获取到的商品数组
if (myProduct.count == 0) {
// 没有获取到
{
// 代码到此,就是有商品了。这时就有两种操作,一种是向服务器验证购买凭证,获取订单字符串,发起购买;一种是直接拿商品ID发起购买。
SKMutablePayment *mPayment = [[SKMutablePayment alloc] init];
mPayment.productIdentifier = productID; // 产品ID
[[SKPaymentQueue defaultQueue] addPayment:mPayment]; // 调起支付界面,发起购买
}
(5)把控制器设置为监听购买操作的观察者,这一步,在ViewDidLoad中设置
[[SKPaymentQueue defaultQueue] addTransactionObserver: self];
购买结果的回调
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray*)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
{
NSLog(@"商品加入列表,正在购买中...");
}
break;
case SKPaymentTransactionStatePurchased: // 购买完成
{
NSLog(@"购买完成");
[self finishedTransaction:transaction];
}
break;
case SKPaymentTransactionStateFailed: // 交易失败
{
[self failedTransaction:transaction];
}
break;
case SKPaymentTransactionStateRestored: //已经购买过该商品
{
NSLog(@"已经购买过该商品");
[self alreadyBuyWithTransaction:transaction];
}
break;
default:
break;
}
}
}
注: 完成购买的操作中,如果有服务器,需要向服务器验证购买结果,如果没有,就直接完成。
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
调起支付后,输入注册的沙盒账号即可点击购买。
注:这里有几个注意事项
一,测试支付的ipa必须使用[App-Store]证书
二,越狱机器无法测试IAP
三,用SandBox账号测试支付的时候,必须把在系统[设置]里面把[Itunes Store 与 App Store]登录的非 SandBox账号注销掉,否则向苹果服务器请求不到订单信息
四,Sandbox账号不要在正式支付环境登陆支付,登陆过的正式支付环境的SandBox账号会失效
五,所有在itunes上配置的商品都必须可购买,不能有某些商品根据商户自己的服务器的数据在某个时期出现免费的情况
六,商品列表不能按照某些特定条件进行排序(比如说下载量)
七,非消耗型商品必须的有恢复商品功能
八,非消耗类型的商品不要和商户自己的服务器关联