介紹
分享下自己做內購遇到問題,總結出來的經驗。
接入
使用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,完成支付