前言

说起内购,其实挺令开发者厌烦的,原因呢,先不说漏单的问题,首先苹果要扣除30%的销售额哦,可恨不?(我觉得可恨),有些想办法先隐藏掉第三方支付(支付宝、微信等),等项目上线了,再跳过内购使用第三方支付,emmmm.......这个方法确实不错,但是如果被苹果发现了,APP内虚拟产品调用第三方支付,那好吧,直接下架吧(或许没这么惨,但会惨不忍睹),不要说发现不了,会有人举报哦(别问我怎么知道的);其次就是漏单问题的处理,这一直是个问题,我的项目里虽然做了处理,但是还是会避免不了漏单的,只是把漏单的几率降到了很小,以确保我们维护,给大家分享下内购及漏单的处理。

内购集成

内购集成并不难,这里我用了一个Git上封装好的(IAPHelper),自己封装也简单(不想造那么多轮子了),封装的话,建议结合单例封装,充值验证都在单例里面进行;当然也可以不封装直接就用的,这里不多说了;建议最好根据服务器的验证方式与逻辑自己写个单利工具。

支付逻辑

1.临时单号

首先根据内购商品ID(此商品ID是在苹果后台建好的内购商品)、用户信息(后台要求),传给服务器获取一个临时单号,然后先将该临时单号保存到一个变量里。在此之前,需要用数据持久化,对用户最后一次选择的内功商品ID进行永久储存,就算用户付款成功却充值失败了,即使App卸载了,也可以拿到最后一次请求的内购商品ID 。

///获取充值临时单号
- (void)iapGetTemOrderIdWithProductId:(NSString *)productId{
self.productId = productId;
[SVProgressHUD showWithStatus:@"请稍后..." ];
NSString *urlString = @"";
[HttpTools getHttpRequestURL:urlString RequestSuccess:^(id repoes, NSURLSessionDataTask *task) {
[SVProgressHUD dismiss];
NSDictionary *dicTem = [HttpTools respoesToDic:repoes];
if ([dicTem[@"code"] integerValue] == ) {
///保存临时单号
self.temporaryOrderId = dicTem[@"data"];
///发起内购支付
[self iapStartRecharge]; }
else{
[SVProgressHUD showErrorWithStatus:dicTem[@"errmsg"]];
[self errorPost:nil];
} } RequestFaile:^(NSError *error) {
[SVProgressHUD showErrorWithStatus:[HttpTools error:error]];
[self errorPost:nil];
}];
}

2.苹果充值

通过商品ID调取苹果内购支付,苹果充值成功后,在返回成功的方法里,首先将上一步中的临时单号、用户信息(这里我取userId)、苹果充值成功返回的data,三个参数一起存入本地(我采用数据库存储)后,然后验证服务器充值(如果苹果充值验证失败,不必做任何操作)。

///发起内购支付
- (void)iapStartRecharge{
[SVProgressHUD showWithStatus:@"请稍后..."];
NSSet* dataSet = [[NSSet alloc] initWithObjects:self.productId, nil];
[IAPShare sharedHelper].iap = [[IAPHelper alloc] initWithProductIdentifiers:dataSet];
// 请求商品信息
[[IAPShare sharedHelper].iap requestProductsWithCompletion:^(SKProductsRequest* request,SKProductsResponse* response){ if(response.products.count > ) {
SKProduct *product = response.products[];
[[IAPShare sharedHelper].iap buyProduct:product onCompletion:^(SKPaymentTransaction* trans){
if(trans.error){
[SVProgressHUD showErrorWithStatus:trans.error.userInfo.allValues[]];
[self errorPost:nil];
}
else if(trans.transactionState == SKPaymentTransactionStatePurchased) {
NSLog(@"*********内部支付成功*********"); ///将临时单号存在本地【此处做返回信息保存(临时单号、用户信息、返回的data)】 ///去服务器验证充值 /// 备注:这里要做两个判断,一是直接支付成功后回调的,二是App打开后,对上次验证失败回调到这里的
}
else if(trans.transactionState == SKPaymentTransactionStateFailed) {
NSLog(@"*********支付失败*********");
if (trans.error.code == SKErrorPaymentCancelled) {
}
else if (trans.error.code == SKErrorClientInvalid) {
}
else if (trans.error.code == SKErrorPaymentInvalid) {
}
else if (trans.error.code == SKErrorPaymentNotAllowed) {
}
else if (trans.error.code == SKErrorStoreProductNotAvailable) {
}
else{
}
[SVProgressHUD showErrorWithStatus:trans.error.userInfo.allValues[]];
[self errorPost:nil];
}
}];
}else{
// ..未获取到商品
[SVProgressHUD showErrorWithStatus:@"暂未获取到商品"];
[self errorPost:nil];
}
}];
}

3.服务器验证充值(上一步成功后验证)

在苹果充值成功后,根据充值成功返回的数据data、临时单号、用户信息(后台要求)去服务器验证充值,如果验证成功,将上一步存在本地数据库的数据(临时单号、用户信息(这里我取userId)、苹果充值成功返回的data)删除;如果充值失败,即为漏单,但是已经将验证服务器充值的数据存在了本地数据库,可再次尝试,或者稍候尝试,根据自己的提示操作而定。

///向服务器验证进行充值
- (void)iapPayOValidData:(NSString *)strReceipt temOrder:(NSString *)temOrder{
///验证充值
[SVProgressHUD showWithStatus:@"正在为您充值..."];
NSString *urlSting = @"";
///post data【验证参数】
NSMutableDictionary *dicPost = [NSMutableDictionary dictionary];
[HttpTools postHttpRequestURL:urlSting RequestPram:dicPost RequestSuccess:^(id respoes) {
[SVProgressHUD dismiss];
NSDictionary *dicValid = [HttpTools respoesToDic:respoes];
if ([dicValid[@"code"] integerValue] == ) {
///删除本地存的验证信息【临时单号、用户信息、苹果支付成功返回的data】
}
else{
[self errorPost:dicValid[@"errmsg"]];
}
} RequestFaile:^(NSError *erro) {
[SVProgressHUD dismiss];
[self errorPost:[HttpTools error:erro]];
}];
}

结束

至此,整个内购充值流程已完毕,以上传递的参数、存储的参数,是根据服务器后台要求,可根据自己服务器后台商量,怎么做更好,如果大家有更好的方案,希望能借鉴!谢谢!

最后还是要说说,不管怎么做漏单处理,总会有几个漏单的,但是几率很小,而且还想说,什么时候可以有办法躲过这30%的抽成.......

iOS-IAP内购的那些事(iOS内购漏单的问题)的更多相关文章

  1. IOS IAP APP内支付 Java服务端代码

    IOS IAP APP内支付 Java服务端代码   场景:作为后台需要为app提供服务,在ios中,app内进行支付购买时需要进行二次验证. 基础:可以参考上一篇转载的博文In-App Purcha ...

  2. iOS 音频视频图像合成那点事

    代码地址如下:http://www.demodashi.com/demo/13420.html 人而无信不知其可 前言 很久很久没有写点什么了,只因为最近事情太多了,这几天终于闲下来了,趁此机会,记录 ...

  3. iOS面试题大全-点亮你iOS技能树

    所有的内容大部分来自于网络的搜集,所以我不是一个创造者,而是一个搬运工.我尽量把题目,尤其是参考答案的出处列明.若有任何疑问,建议,意见,请联系我. 第一部分面试题来源于iOS-Developer-I ...

  4. iOS是最安全的?苹果iOS恶意软件数量增速首次超过Android

    之前小编还说Android系统似乎已经成为世界各地病毒作者的首选目标,但是近日一份安全研究报告让小编啪啪打脸. Skycure的移动安全报告显示,近三个季度内,在iOS上运行的恶意软件增加了2倍多,而 ...

  5. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

  6. 李洪强iOS之集成极光推送三iOS集成指南

    李洪强iOS之集成极光推送三iOS集成指南 SDK说明 适用版本 本文匹配的 SDK版本:r2.1.5 以后.查看最近更新了解最新的SDK更新情况.使用Xcode 6及以上版本可以使用新版Push S ...

  7. 李洪强iOS之集成极光推送一iOS SDK概述

    李洪强iOS之集成极光推送一iOS SDK概述 JPush iOS 从上图可以看出,JPush iOS Push 包括 2 个部分,APNs 推送(代理),与 JPush 应用内消息. 红色部分是 A ...

  8. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  9. Android与IOS的优缺点比较 对 Android 与 IOS 比较是个个人的问题。 就好比我来说,我两个都用。我深知这两个平台的优缺点。所以,我决定分享我关于这两个移动平台的观点。另外,然后谈谈我对新的 Ubuntu 移动平台的印象和它的优势。 IOS 的优点 虽然这些天我是个十足的 Android 用户,但我必须承认 IOS 在某些方面做的是不错。首先,苹果公司在他们的设备更新方面有更

    Android与IOS的优缺点比较 对 Android 与 IOS 比较是个个人的问题. 就好比我来说,我两个都用.我深知这两个平台的优缺点.所以,我决定分享我关于这两个移动平台的观点.另外,然后谈谈 ...

随机推荐

  1. 网络编程之基于tcp和udp的套接字

    一   udp协议网络编程 DNS:将域名解析成ip地址 SOCK_DGRAM:数据报协议,也是udp协议 udp协议的网络编程的一些用法: recvfrom:接收消息,接收的时一个元组,元组里面的元 ...

  2. 2019.01.23 hdu1964 Pipes(轮廓线dp)

    传送门 题意简述:给一个没有障碍的网格图,任意两个格子连通需要花费一定代价,现在求一条覆盖所有格子的哈密顿回路的总权值的最小值. 思路: 跟这道题一毛一样,除了把求和变成求最小值以外. 代码: #in ...

  3. 2018.11.06 NOIP训练 最大获利(profit)(01分数规划+最大权闭合子图)

    传送门 好题啊. ∑i<jpi,jK∗(200−K)>X\frac{\sum_{i<j}p_{i,j}}{K*(200-K)}>XK∗(200−K)∑i<j​pi,j​​ ...

  4. 2018.10.27 loj#6035. 「雅礼集训 2017 Day4」洗衣服(贪心+堆)

    传送门 显然的贪心题啊...考试没调出来10pts滚了妙的一啊 直接分别用堆贪心出洗完第iii件衣服需要的最少时间和晾完第iii件衣服需要的最少时间. 我们设第一个算出来的数组是aaa,第二个是bbb ...

  5. jquery遍历之parent()与parents()的区别 及 parentsUntil() 方法

    来自:http://blog.csdn.net/zm2714/article/details/8117746 .parent(selector) 获得当前匹配元素集合中每个元素的父元素,由选择器筛选( ...

  6. HDMI之(AVI)Auxiliary Video Information InfoFrame

    这是HDMI协议中关于AVI接口的信息     AVI InfoFrame在H14b中进行了定义.从HDMI 2.0 10.1 Use of the AVI InfoFrame in This Spe ...

  7. C#-vs2012学习笔记-惊奇于vs的强大和便利

    网站常用功能自动完成,包括网页和数据库.

  8. (最短路)Silver Cow Party --POJ--3268

    题目链接: http://poj.org/problem?id=3268 题意: 先求出所有牛到x的最短路,再求出x到所有牛的最短路,两者相加取最大值(单向图)(可以用迪杰斯特拉,SPFA) 迪杰斯特 ...

  9. 20155326 实验三 敏捷开发与XP实践

    20155326 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器 ...

  10. android 发送url带中文出现乱码怎么解决

    上传的时候参数中带中文的时候发送参数的时候就有可能出现乱码,这种情况怎么解决呢,就是设置url的格式为utf-8 httpRequest.setEntity(new UrlEncodedFormEnt ...