iOS开发-IAP内购
2021-08-17 本文已影响0人
辉辉岁月
接入
使用RMStore。
1、使用RMStore的接入步骤
1、在Podfile内添加pod 'RMStore'并pod install;
2、实现并设置接口RMStoreReceiptVerificator;
3、在应用启动时调用接口
- (void)requestProducts:(NSSet*)identifiers
success:(RMSKProductsRequestSuccessBlock)successBlock
failure:(RMSKProductsRequestFailureBlock)failureBlock
4、在支付时调用接口
- (void)addPayment:(NSString*)productIdentifier
user:(NSString*)userIdentifier
success:(void (^)(SKPaymentTransaction *transaction))successBlock
failure:(void (^)(SKPaymentTransaction *transaction, NSError *error))failureBlock
2、详细解析
- 步骤1,引入第三方库。
- 步骤2,RMStoreReceiptVerificator类是验证凭据的有效性。
实现接口RMStoreReceiptVerificator,并向服务器请求验证凭据的有效性,等返回后回调RMStore。
@implementation IAPReceiptVerificator
- (void)verifyTransaction:(SKPaymentTransaction*)transaction
success:(void (^)())successBlock
failure:(void (^)(NSError *error))failureBlock
{
RequestSuccessResponseBlock success=^(NSDictionary *responseDic){
NSLog(@"success");
if (successBlock) {
successBlock();
}
};
RequestFailResponseBlock fail=^(NSError *error){
NSLog(@"fail");
if (failureBlock) {
failureBlock(error);
}
};
NSData* data = [NSData dataWithContentsOfURL:[NSBundle mainBundle].appStoreReceiptURL];
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"receipt-data"] = [data base64EncodedStringWithOptions:0];
[[HTTPClient sharedHTTPClient] requestWithParameters:params
withPath:@"pay/apple"
withRESTful:POST_REQUEST
withSuccessBlock:success
withFailBlock:fail];
}
- 步骤3,在应用启动时请求商品列表,可以每次请求列表,也可以暂存本地并设置有效时间;
- 步骤4,发起支付,传入商品ID和用户ID。
疑难杂症排查
1、invalid ID
检查下列项目
-
内购是否申请
-
内购是否添加到应用
-
银行协议是否添加(重点排查对象)
-
BundleID是否和申请的ID一致
下列是无关的项目
-
不需要配置特殊的provisioning profile
-
不需要提交二进制文件
2、支付失败
检查下列项目
-
添加沙盒账号
-
是否为沙盒账号
-
检查请求的ID是否一致
-
检查是否持有引用 (因为RMStore持有的是弱引用)
3、如何登陆沙盒测试账号
在iPhone的设置里面注销原来的账号,在应用中发起支付,会弹出系统提示框,在这里登录;
沙盒测试账号的要求:不能是已有的账号,可以使用任意的邮箱,不能购买app。
4、您的首个 App 内购买项目必须以新的 App 版本提交,只能创建报刊免费内购
填写银行信息。
总结
总体的流程是
- (后台)配置协议
- (后台)配置商品
- (后台)添加商品
- (iOS)请求商品列表
- (iOS)用RMStore发起支付
- (iOS)RMStore回调,请求服务器验证凭据
- (服务器)暂存凭据并请求苹果服务器验证
- (服务器)发放商品并回调客户端
- (iOS)收到服务器回调,回调RMStore,完成支付