更新内购 (包括办事器双向验证)

2019年8月7日

比来在更新版本,发现好多用户来进行使用内的办事退款,理由频多,然而还不克不及肯定
用户是否领取成功,所以看了一下苹果内购的民间文档,发现有验证办事器的方法,因而就加上了。

具体内购怎样做在这里就不说了,网上有具体的讲解。

起首内购有几品种别呢,这个一定要搞清楚,否则会遇到很多问题。在游戏中咱们时经常使用到的主要由分两种:

非耗损品 (Nonconsumable)买了就有,头衔,功能

指的是在游戏中一次性购置并具有
永世拜候权的物品或办事。非耗损品物品能够

呐喊被用户再次下载,并且能够

呐喊

呐喊在用户的一切装备
上使用

耗损品 (Consumable),买了就用,用了就没

专为支持可耗损的物品或办事设计的,耗损品购置不成被再次下载,按照其特点,耗损品不克不及在用户的装备
之间跨装备
使用,除非自界说办事在用户的账号之间共享这些信息。

接下来咱们就开始使用内购,需求导入StoreKit框架。界说好的商品

#define kIAPBomb @ “airplay.10bombs”

#define kIAPBullet @”airplay.laserBullet”

1. 实例化乞求时,必须指定无效的identifiers集合,之所以如斯处理,主要是为了确保提交的内购商品真的经由过程了苹果的审批,处于可用形态!

2. 要想取得
到准确的可用产物集合,需求经由过程代理方法实现

– (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

3. 逃狱用户无法测试内购,然而能够

呐喊购置

1@interfaceITViewController() <SKProductsRequestDelegate,SKPaymentTransactionObserver>

2{

3// 产物字典

4NSMutableDictionary*_productDict;

5}

1(void)viewDidLoad

2{

3[super viewDidLoad];

4

5[self requestProducts];

6

7// 配置购置行列的监听器

8[[SKPaymentQueue defaultQueue]addTransactionObserver:self];

9}

3.4.讯问苹果的办事器能够

呐喊

呐喊发卖哪些商品

#pragma mark 讯问苹果的办事器能够

呐喊

呐喊发卖哪些商品

– (void)requestProducts

{

// 能够

呐喊

呐喊发卖的商品

NSSet*set=[[NSSetalloc] initWithObjects:kIAPBomb, kIAPBullet,nil];

// “异步”讯问苹果能否发卖

SKProductsRequest*request = [[SKProductsRequestalloc] initWithProductIdentifiers:set];

request.delegate=self;

// 启动乞求

[request start];

}

3.5.取得
讯问了局,成功采取操作把商品插手可售商品字典里

– (void)productsRequest:(SKProductsRequest*)request didReceiveResponse:(SKProductsResponse*)response

{

if(_productDict ==nil) {

_productDict=[NSMutableDictionarydictionaryWithCapacity:response.products.count];

}

for(SKProduct*productinresponse.products) {

// 激活了对应的发卖操作按钮,相当于商店的商品上架允许发卖

NSLog(@”%@”, product.productIdentifier);

if([product.productIdentifier isEqualToString:kIAPBullet]) {

_bulletButton.enabled=YES;

}

if([product.productIdentifier isEqualToString:kIAPBomb]) {

_bombButton.enabled=YES;

}

// 加添商品字典

[_productDict setObject:product forKey:product.productIdentifier];

}

}

3.6.用户决定购置商品

1#pragma mark – 用户决定购置商品

2- (void)buyProduct:(SKProduct*)product

3{

4// 要购置产物(店员给用户开了个小票)

5SKPayment*payment =[SKPaymentpaymentWithProduct:product];

6

7//// 配置购置行列的监听器

8//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

9

10// 去收银台列队,准备购置(异步网络)

11[[SKPaymentQueuedefaultQueue] addPayment:payment];

12}

1(IBAction)purchaseProducts

2{

3[self buyProduct:_productDict[kIAPBullet]];

4}

5

6(IBAction)purchaseBomb:(id)sender

7{

8[self buyProduct:_productDict[kIAPBomb]];

9}

3.7.判别购置形态是否成功

#pragma mark – SKPaymentTransaction Observer

#pragma mark 购置行列形态转变

– (void)paymentQueue:(SKPaymentQueue*)queue updatedTransactions:(NSArray*)transactions

{

// 调试

for(SKPaymentTransaction*transactionintransactions) {

NSLog(@”行列形态转变 %@”, transaction);

// 若是小票形态是购置实现

if(SKPaymentTransactionStatePurchased==transaction.transactionState) {

NSLog(@”购置实现 %@”, transaction.payment.productIdentifier);

// 更新界面或数据,把用户购置得商品交给用户

// …

// 验证购置凭证

[selfverifyPruchase];

// 将买卖从买卖行列中删除

[[SKPaymentQueuedefaultQueue] finishTransaction:transaction];

}elseif(SKPaymentTransactionStateRestored==transaction.transactionState) {

NSLog(@”规复成功 %@”, transaction.payment.productIdentifier);

// 更新界面或数据,把用户购置得商品交给用户

// …

// 将买卖从买卖行列中删除

[[SKPaymentQueuedefaultQueue] finishTransaction:transaction];

}

}

}

3.8.给用户提供规复功能(因为在不同装备
上永世性商品可能会出现需求规复购置的情形)

#pragmamark规复商品

(void)restorePurchase

{

// 规复已实现的一切买卖.(仅限永世无效商品)

[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];

}

3.9.验证购置(防止第三方插件漏洞)iOS7新特性

提醒:虽然苹果在iOS7提升了购置凭证的保险性,然而处于金钱斟酌,购置实现后,一定要做凭证的验证事情。

#pragma mark 验证购置凭证

– (void)verifyPruchase

{

// 验证凭证,取得
到苹果返回的买卖凭证

// appStoreReceiptURL iOS7.0增加的,购置买卖实现后,会将凭证存放在该地点

NSURL*receiptURL =[[NSBundlemainBundle] appStoreReceiptURL];

// 从沙盒中取得
到购置凭证

NSData*receiptData =[NSDatadataWithContentsOfURL:receiptURL];

// 发送网络POST乞求,对购置凭证进行验证

NSURL*url =[NSURLURLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL];

// 海内拜候苹果办事器比较慢,timeoutInterval需求长一点

13NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:10.0f];

request.HTTPMethod =@”POST”;

// 在网络中传输数据,大多情形下是传输的字符串而不是二进制数据

/ 传输的是BASE64编码的字符串

/**

BASE64 经常使用的编码计划,通经常使用于数据传输,以及加密算法的基础算法,传输过程中能够

呐喊

呐喊包管数据传输的稳定性

BASE64是能够

呐喊编码和解码的

*/

NSString*encodeStr =[receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

NSString*payload = [NSStringstringWithFormat:@”{\”receipt-data\” : \”%@\”}”, encodeStr];

NSData*payloadData =[payload dataUsingEncoding:NSUTF8StringEncoding];

request.HTTPBody =payloadData;

// 提交验证乞求,并取得民间的验证JSON了局

NSData*result =[NSURLConnectionsendSynchronousRequest:request returningResponse:nilerror:nil];

// 民间验证了局为空

if(result ==nil) {

NSLog(@”验证失败”);

}

NSDictionary*dict =[NSJSONSerializationJSONObjectWithData:result options:NSJSONReadingAllowFragmentserror:nil];

NSLog(@”%@”, dict);

if(dict !=nil) {

// 比对字典中如下信息基本上能够

呐喊包管数据保险

// bundle_id&application_version&product_id&transaction_id

NSLog(@”验证成功”);

}

}

3.9.说说全部
购置流程结构

1.苹果APP(商家) ——— 2.告知苹果Store办事器要卖的商品 ——— 3.苹果审核完(告知你是否能够

呐喊卖)

4.用户(买商品) ———  5.苹果APP(商家) ———  6.开发票给(用户) ————

7.用户(拿着发票去苹果Store办事器付款) —— 8.付款成功(用户在APP里取得办事商品)

(注意:若是要模拟测试内购,需求用真机才能够

呐喊测试)

更多精彩,尽在https://bambi-eyes.com

没有评论

评论已关闭。