写在前面
做完应用内购买(In-App Purchase)有一段时间了。想想还是需要记录下来,虽然网上的资料也很多。记得当时自己在做的时候也搜集了不少资料,但是也走了不少弯路,因为每个人写的着重点都不一样。很多时候只有自己去做了那件事情,才能体会到即使是再多的资料也会避免不了弯路,每个人做的过程都不一样,收获或多或少也是不一样的。所以我也写出来供大家参考参考,希望对做这个的你有帮助。
什么时候用IAP?
开始我都不知道有个东西叫应用内购买。当时的需求是在应用内充值虚拟货币, 客户当初提说要用苹果支付,当初想当然的就以为是Apple pay,然后在纳闷Apple pay 都还没在中国发布,怎么来用这个支付?然后搜集Apple pay 的资料,在收集的过程中发现了应用内购买这个名词。其实对于应用内购买虚拟货币,使用支付宝、微信等之类的三方支付,在App审核的时候是不能通过的,除非灰度上线,但是Apple允许购买实物商品使用这些三方的支付平台,因此对于虚拟货币的话就只能使用Apple的支付,对于这个最方便的还是IAP,像游戏的充值虚拟货币、微信购买表情包都是使用这种方式。想想当时真的好惭愧呀,居然不知道这个,真是后知后觉。
IAP是怎么一回事?
我是一个俗人,专业性的东西,还是喜欢以一个常人的角度来说。
比如我在微信上购买表情包、或者购买游戏虚拟货币,因为在我手机里面已经绑定了Apple ID,购买的时候Apple是根据这个Apple ID来进行购买的。
用户充值的钱哪里去了?在开发者账号里面。但是用户充值的钱,你是不能全部得到的,Apple会从中收取一定比例的钱,俗称中介费。以前是30%,现在调低了。
之前我是一个不太善于写的人,最近发现把自己积累的写下来是多么的重要,不管好与坏,那都是一份成长的记录。
下面就说说怎么做IAP:
一、创建应用
1. 一个开发者账号,登录 iTunes
2. 填写信息,新建App
二、签订协议、税务和银行业务
这三个都要填写,不然后面就用不了。
三、创建购买项目
根据自己需要的类型选择创建,虚拟货币充值选择的是第一个消费型项目。
对于产品ID,由自己创建,是唯一的,类似于我们创建的bundle ID,一般上线产品都是动态获取,就由后台服务器接口提供,接口请求到产品ID,再去Apple服务器请求获取商品信息。而且,在调试的时候务必使用对应的bundle ID,否则请求不到你创建的项目信息。
需要多少个项目一一添加就可以了。
四、创建测试账号
在调试阶段,App没有上线通过审核之前是不能用自己的Apple ID进行测试使用的。必须使用测试账号才行。因此需要创建测试账号,其实这应该在第三步创建项目之前,在审核备注那里就可以填写测试账号用户名和密码了。
添加这个账号还不能是之前已经创建过的Apple ID账号,必须是一个全新的,没有注册过的账号。
五、与代码对接
原本是自己写的,后面在GitHub上发现个不错的demo,用起来非常简单。点击链接
1.定义一个全局变量:
@property(strong, nonatomic)ASBanker *banker;
2. 从Apple服务器请求商品信息
[self.banker fetchProducts:_productIDArr];
这里的_productIDArr是上面填写的产品ID的数组。
2. 支付以及支付之后
#pragma mark - ASBankerDelegate
// Required
- (void)bankerFailedToConnect{
NSLog(@"从APPStore请求充值数据失败");
}
- (void)bankerNoProductsFound{
NSLog(@"暂无可充值的选项");
}
//TODO:从苹果请求到数据
- (void)bankerFoundProducts:(NSArray*)products {
//在此方法刷新UI
}
- (void)bankerFoundInvalidProducts:(NSArray*)products {
NSLog(@"无效的商品");
}
//完成购买
- (void)bankerProvideContent:(SKPaymentTransaction*)paymentTransaction {
// Unlock feature or content here for the user.
for(SKProduct*productinself.data) {
if([product.productIdentifierisEqualToString:paymentTransaction.payment.productIdentifier]) {
//存入本地购买
NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];
[defaultssetBool:YESforKey:product.productIdentifier];
[defaultssynchronize];
}
}
}
//TODO:购买成功
- (void)bankerPurchaseComplete:(SKPaymentTransaction*)paymentTransaction {
//此处务必记得恢复购买,否则第二次购买的时候,是购买失败的
[self.bankerrestorePurchases];//恢复购买
[selfSaveRecharge:paymentTransaction];
}
- (void)bankerPurchaseFailed:(NSString*)productIdentifier withError:(NSString*)errorDescription {
SHOWFailSVProgress(@"支付失败");
}
- (void)bankerPurchaseCancelledByUser:(NSString*)productIdentifier {
NSLog(@"用户取消支付");
}
- (void)bankerFailedRestorePurchases{
NSLog(@"恢复购买失败");
}
// Optional
- (void)bankerDidRestorePurchases{
NSLog(@"已经恢复购买");
}
- (void)bankerCanNotMakePurchases{
// In-App Purchase are probally disabled in the Settings
// Tell the user
UIAlertView*av = [[UIAlertViewalloc]initWithTitle:@"您的设备不支持支付"message:nildelegate:nilcancelButtonTitle:@"确定"
otherButtonTitles:nil];
[avshow];
}
- (void)bankerContentDownloadComplete:(SKDownload*)download {
// Download is complete. Content file URL is at
// path referenced by download.contentURL. Move
// it somewhere safe, unpack it and give the user
// access to it
// The hosted content package is downloaded in the form of a Zip file.
}
- (void)bankerContentDownloading:(SKDownload*)download {
NSLog(@"Download progress = %f", download.progress);
NSLog(@"Download time = %f", download.timeRemaining);
}
五、调试
1.调试的时候需要用真机调试
2.也许你的真机原本就已经登录过了Apple ID,但请在支付的时候,可能默认的就是登录过的Apple ID,所以在支付的时候注意下用申请的测试Apple ID,不要用其他的Apple ID,否则是支付不了的。
PS:在测试充值之前,可以到手机设置—> iTunes Store与App Store —> AppleID注销之前登录的AppID,然后在购买的时候会弹出登录界面,选择现有AppID,输入测试账号即可进行购买。
其实做过了一遍后,会发现其实很简单,没有想的那么复杂~