iOS内购你看我就够了(埋坑篇)

作者: 超_iOS | 来源:发表于2016-08-25 17:46 被阅读11655次

在(一)中坑已经说的很多了,但只埋了一半.现在我把我意识到的坑都埋完.
没看过(一)的出门左转,这俩要一起看..抱歉篇幅问题

↓防懵逼必看

iOS内购你看我就够了(一)

↑防懵逼必看

回去看了看貌似(一)已经可以解决所有问题了...额

1.还有订单没结束的坑

所以要把开始监听写在程序入口,在程序挂起时移除监听.
如果有未完成的订单他就会直接走

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions

一般情况下都是购买成功后没有结束订单的坑,所以他会走验证方法

if (self.cash != nil)这句话在这就起作用了,所以他会走[self checkUnTestReceipt];//从本地取凭证验证去 }

2.为什么要存到数组??

因为你可能出现不止一个未验证的订单,擦,好惨


- (void)checkUnTestReceipt
{
  NSArray *payAry =从本地去取存凭证的数组,我就不告诉你怎么取,咬我
  if (!payAry || payAry.count == 0) {
    return;
  }
  for (NSDictionary *dic in payAry) {
    [self untestReceiptByTime:dic];//把本地(漏单)的dic(验证信息)都去验证了
  }
}

untestReceiptByTime:这方法只是多了个失败后的回传,和验证方法有一点不同

- (void)untestReceiptByTime:(NSDictionary *)dic//第一次访问服务器失败了又一次请求,多了个定时的请求
{
  WEAKSELF;
  [[YLBNetWorkManager sharedInstance]postJsonData:dic url:  e successBlock:^(id responseBody) {

   [weakSelf removeDicFromPayAry:dic];//移除,不懂得看一
   
  } failureBlock:^(NSString *error) {
    DLog(@"%@和自己服务器失败22",error);
      [self untestReceiptByTime:dic];//最好一段时间后再验证,用GCD
}
程序入口监听开始

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

DLog(@"我一进来就看看本地漏单");
  [[IAPManager sharedInstance]checkUnTestReceipt];//一进程序看看有没有漏单
双管齐下,你慢慢漏吧

当然还得在程序入口新建本地数组(只建一次),用NSUserDefaults ,删除添加都是他,这我就不写了,你全部都复制粘贴也没啥成就感.. 

程序出口移除监听
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

.

3.为什么必须存到本地

为了不往本地存我是没少费劲,但是我太年轻,还是错了.
虽然只要不结束订单凭证就不会消失,但是验证时还需要其他(用户Aid,不然你怎么知道谁买的.或者下次登录换用户B了,你只用了本地的凭证和B,擦,充错人)所以必须存本地.
突然有个疑问,这个凭证是怎么和订单一一对应的?谁知道说下,我没事也研究下

4.总结

貌似无法解决用户购买后未验证但是换手机了的丢单问题,额,你找客服吧.好烦..技术有限,以后再说吧.仔细想想好像还不是很完美.以后再补充吧.也请大神们多指教吧
最后我要感谢所有帮助我的人谢谢你们五四的奉献

...
写到这里,算是把内购给写的略微明白点了.我现在也就能理解到这个水平了,以后有什么会再补充.
记得刚拿到任务一脸懵逼头大.貌似大部分内购文章里都有我浏览的身影吧.我针扎
我在想要不要加密本地的东西,还有唐巧说要禁止越狱的用户内购(他们问题太多,比如被黑客挟持)

5 更新11.1(验证)

先去苹果的正式服务器验证,返回21007的话再去测试验证.因为苹果测试用的是测试服务器

相关文章

  • iOS-内购

    前言:关于iOS内购,参考两篇博文 iOS-iOS内购流程(手把手图文教程)iOS内购你看我就够了(埋坑篇) 我自...

  • iOS内购你看我就够了(埋坑篇)

    在(一)中坑已经说的很多了,但只埋了一半.现在我把我意识到的坑都埋完.没看过(一)的出门左转,这俩要一起看..抱歉...

  • 应用内购(In-App Purchase)常见问题解答

    应用内购(In-App Purchase)常见问题解答iOS的应用内购买 iAP 坑 iOS内购你看我就够了(一)...

  • iOS内购你看我就够了(一)

    内购坑多,爬了好久(起码简书里的内购相关文章几乎看过来完了),算是懂了点.对你有用告诉我,有疑问联系我.开始(建议...

  • iOS内购看我就够了(含代码)

    内购是啥 App 内购买项目允许顾客通过访问 App Store 购买您 App 中的内容、功能或服务,并安全处理...

  • iOS内购从放弃到上架

    iOS内购方面的坑

  • applePay

    # iOS应用内支付(内购)的个人开发过程及坑!

  • 苹果内购流程,看我就足够了

    重点总结: 1.获取内购列表(从App内读取或从自己服务器读取)2.App Store请求可用的内购列表3.向用户...

  • iOS 内购最新版(埋坑)

    最近项目中要加进去虚拟币和会员的功能 本以为特别简单不就是几十行代码嘛 但是内购做下来 可把我坑惨了 ...

  • iOS 内购 IAP

    1. iOS内购IAP(一) —— 基础配置篇(一)2. iOS内购IAP(二) —— 工程实践(一)3. iOS...

网友评论

  • 皮乐皮儿:我的处理方式和你的大致相同,但是线上用户偶尔出现了一个问题是:扣款了两次,但是服务端查找的凭证中包含的交易却只有一次(我们是非续期订阅类型,移除交易后凭证中不会删掉上一次的凭证信息)我这边查代码也没查出来可能出现问题的地方,扣款成功就会触发验证接口,服务端返回成功我才移除订单,同时本地又存了订单信息,这是不会出现重复的情况的,关于这个你能给下思路吗?
  • 剪刀_石头_布:我想问一下。内购的钱什么时候公司才能收到。是有时间限制还是得有最低数额限制。这个限制是多少呢
  • Dreamhai:楼主你好,请问只通过用户在App Store上的order id能查到票据吗,或者账单
  • 3f58e6f45d90:支付时跳转到外面,开通了免密支付,支付成功没有回调应用内,没有支付凭证,这种怎么处理?
  • Luser_CC:你好,我最近在做内购,有些问题想向你请教一下,能留一下微信吗?
  • 61d817c65aa8:不是。 哪里判断 我点击的是那个商品,从而开始交易
  • nikaap:真的需要处理你说的所谓漏单的情况吗?不知道你写这篇博客是否看了官方文档。还只是自己看几篇别人的博客瞎想的。[[NSBundle mainBundle] appStoreReceiptURL] 这个路径保存的票据信息你知道都有什么吗?我下面是截取了官方文档的其中一段:
    In-App Purchase Receipt
    The receipt for an in-app purchase.

    ASN.1 Field Type 17

    ASN.1 Field Value SET of in-app purchase receipt attributes

    JSON Field Name in_app

    JSON Field Value array of in-app purchase receipts

    In the JSON file, the value of this key is an array containing all in-app purchase receipts. In the ASN.1 file, there are multiple fields that all have type 17, each of which contains a single in-app purchase receipt.

    The in-app purchase receipt for a consumable product is added to the receipt when the purchase is made. It is kept in the receipt until your app finishes that transaction. After that point, it is removed from the receipt the next time the receipt is updated—for example, when the user makes another purchase or if your app explicitly refreshes the receipt.

    The in-app purchase receipt for a non-consumable product, auto-renewable subscription, non-renewing subscription, or free subscription remains in the receipt indefinitely.

    也就是说,除了消耗性商品其余所有的内购信息会永久的保存在本地,消耗性商品除非在苹果那边已经验证过了否则也会一直保存在本地,只要没有验证成功的消耗性商品都会保存在票据信息中,你每次获取这个票据时都会存有所有你之前没有验证过的商品信息。说了这么多累死了希望所有开过这篇文档的同学们看见我的评论后不要做一些无用的操作被作者误导了
    d0ab8ef28fa2:so 你的意思是等到服务器那边验证成功后,然后执行 finishTransaction: ?
    d0ab8ef28fa2:感觉说的不错,能不能上点代码看看说明一下。
    超_iOS:@GGGHub 嗯先谢谢你的指正。我这里存本地是和用户id一起的。购物凭证里没有用户信息。不存本地就乱了。还有你说的凭证里是存了所有的的购物信息么?这个倒记不清楚了:smile:。我会再查查
  • 下一页123:这个 验证receipt-data失败 是苹果服务器返回的什么?
  • 乔兰伊雪:self.cash这个从哪获取给它赋值呢,它是什么类型?
  • 75ab76f11224:内购必须经过IAP吗
    超_iOS:@lionwhitch 恩
  • Aacmr:为什么不写个能运行的demo呢
    超_iOS:@cmr 不想写
  • 汉秋:购买成功了。有个系统的弹框。“您已成功完成购买”。下面的“好”,事件怎么监听啊?
  • 1cdb19c230be:你好 可以加下我的QQ吗 有些细节想问你一下 不会太麻烦你的
  • ab27e9fc9b49:作者你好,我想请问你个问题,关于充值完成后苹果服务器返回的充值凭证。之前我们项目在做充值时,返回的这个凭证字符串长度是8000多,但是现在充值的话返回的凭证字符串长度都10000多了,请问下是不是正常的呢,谢谢
    超_iOS:@只记一首好了歌 没关注过长度的问题,目测正常
  • M_慕宸:你好,请问请求的商品id,在无效商品列表里面。不知道因为什么原因???
    超_iOS:@M_慕宸 无效商品列表?有这玩意么?
  • af3acae33dcd:既然购买时payment.applicationUsername = @(1000000).stringValue;//充值用户的id,也就是uid. 保存了用户id,验证时为什么没有用transaction.payment.applicationUsername来获取uid去验证,是有什么坑吗?
    超_iOS:没有什么坑,验证时用不用都行
  • 丶Destinyxl:神 购买成功(扣钱)之后,怎么拿到具体订单详情(比如有没有订单号之类)
    超_iOS: @LL_Summit 没有这个,只能拿到汇总
  • 6fb39bb570d8:你好,麻烦问一下,内购后的虚拟物品,能否被转赠呢?比如说我通过内购买了1000金币,是否可以转赠给他人呢?
    超_iOS: @哼哼哈5521 666
    6fb39bb570d8:@_超 试了下,没通过审核。。:sweat:
    超_iOS:@哼哼哈5521 这个你可以试试,不知道苹果允许不
  • 有梦想的咸鱼宁:能给个demo参考一下吗
    超_iOS:@Rookie_ning :joy: 有空写一个
  • 761e1a094a6d:博主!请教一下,服务器可以用c#之类的语言写吗?我做的游戏,所以服务器不是oc的
    镜头下的涂鸦:服务端只是掉一个接口 和语言没关系
    超_iOS:@761e1a094a6d 我们是PHP,服务器我不了解
  • Dismon:请问,你有没有遇到这种情况,测试内购的时候,总是成功一次,失败一次,然后成功一次,失败一次

    第一次能购买成功,然后第二次购买能够弹出确认框,点击购买返回 SKErrorDomain Code=0 无法连接 itunes 的错误,然后再次购买,又能成功
    Dismon:我无线,4g 都是过了,都不行,代码也不光试自己的,还试了几个第三方封装的内购比如RMStore,IAPHelper,都是同样的问题,好奇怪,博主你有空能试一下你的代码吗
    超_iOS: @Dismon 没遇到,目测网不好
  • acf19fc34d38:你有没有遇到这样的情况,点击购买,弹出对话框,此时点击取消,弹出框消失后,程序还可以正常运行,但是当点击使用现有的Apple Id,输入账号的时候,xcode会打印 XPC connection interrupted ,然后填写完账号密码,点击 好 或者 取消,程序就死掉了,点击无任何反应,遇到过吗????
    超_iOS:@pcfier 666
    acf19fc34d38:哈哈,解决了,是我一个单例类,接收键盘通知,结果输入帐号时候,键盘弹出来了,然后就这样引发的……
    超_iOS:@pcfier 没有
  • 简书12138:大神、后端怎么和苹果验证啊
    丶Destinyxl:@_超 啥意思?先用sandbox 后 production? 两个嵌套验证码?
    超_iOS:@26326c67955f 先正式,返回21007(貌似),在用测试的.
  • 哼哈猿:我写的也是这样 去年也是逛了好多好多才写出来 还是赞你写出来分享
    超_iOS:@笑你个大麻花 :innocent:
  • a32bf0b5109e:请问下内购版本上线之前只能用沙盒账号测试吗?
    超_iOS:@jarvis1990 我感觉是,我不权威
  • Metaz:建议把凭证存到 KeyChain 里,这样不管是用户换了手机还是删除重新安装应用都能找到,当然是同一个 AppleId
    皮乐皮儿:@李龙简书 这个applicationUserName就是个大坑,苹果那边没有做持久化,有时候为nil,坑死人
    李龙简书:@_超 我直接用的 SKPayment的applicationUsername 把自己用户的id给他 请求自己服务器的时候 传过去自己服务器根据 applicationUsername存的id去充值钱 不过这个属性貌似是7.0以后才有 不过听别人说可能有时候会获取不到 但是目前我还没有遇到
    超_iOS: @Metaz 受教了,有空研究下
  • 博博博博博博:6666打赏打赏
    超_iOS:@博博博博 我擦,还真有人打赏,谢谢啊开张了
  • 61b921b1367d:我用我刚创建好的沙盒账号测试 他提示我无法连接到 iTunes Store 但中秋过来我又试了一遍 竟然没问题了,好怪啊
    博博博博博博:@故事中的路人甲 你应该去看看 返回的code是什么
    超_iOS:@故事中的路人甲 苹果那边还是要有做处理的时间
  • 61b921b1367d:仅用于测试内购的 app 需要专门选择具有IAP功能的证书吗
    码渣:不需要 如果是苹果支付就需要证书了
  • wjc21wjc:app中同时有内购和第三方支付会不会被拒啊
    61b921b1367d:Error Domain=SKErrorDomain Code=0 "无法连接到 iTunes Store" UserInfo={NSLocalizedDescription=无法连接到 iTunes Store}
    超_iOS:@wjc21wjc 感觉不会,我这个也没上线呢没经验抱歉啊
    wjc21wjc:@wjc21wjc 内购是购买金币,第三方支付是购买别的实物。
  • 上善若水jf:请问你的苹果内购上线了吗?
    超_iOS:@上善若水jf 私信你了,大神
    上善若水jf:@李二超 什么时候上线可以交流一下
    超_iOS:@上善若水jf 没呢

本文标题:iOS内购你看我就够了(埋坑篇)

本文链接:https://www.haomeiwen.com/subject/vhsosttx.html