iOS 内购遇到的坑

一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗。您以购买过此APP内购项目,此项目将免费恢复

您以购买过此APP内购项目,此项目将免费恢复.PNG
原因:

当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购买商品后就会调用以前已经购买成功的交易事件去购买因为已经购买过,才会有这个提示

解决方法:

1.当我们使用[[SKPaymentQueue defaultQueue] addPayment:payment];这个方法进行支付请求后,因为我们已经把支付所需要的信息都添加到苹果的支付队列,苹果会自动完成后续的购买请求。
在用户购买成功或者点击取消购买的后会回调- (void)paymentQueue:(SKPaymentQueue )queue updatedTransactions:(NSArray )transaction;方法返回响应的结果信息,在该方法内除了得到响应的支付信息编写自身的业务的代码外还要记得调用[[SKPaymentQueue defaultQueue] finishTransaction:transaction];方法通知苹果的支付队列该交易已经完成,否者就会调用已经购买成功的支付队列,就会出现您以购买过此APP内购项目,此项目将免费恢复这句提示。

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
    NSLog(@"调用了几次这个方法?");
    SKPaymentTransaction *transaction = transactions.lastObject;
    switch (transaction.transactionState) {
        case SKPaymentTransactionStatePurchased: {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];//记得关闭交易事件

            NSLog(@"购买完成,向自己的服务器验证 ---- %@", transaction.payment.applicationUsername);
            NSData *data = [NSData dataWithContentsOfFile:[[[NSBundle mainBundle] appStoreReceiptURL] path]];
            NSString *receipt = [data base64EncodedStringWithOptions:0];
//            [self buySuccessWithReceipt:receipt transaction:transaction];
        }
            break;
        case SKPaymentTransactionStateFailed: {
            NSLog(@"交易失败");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }
            break;
        case SKPaymentTransactionStateRestored: {
            NSLog(@"已经购买过该商品");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }
            break;
        case SKPaymentTransactionStatePurchasing: {
            NSLog(@"商品添加进列表");
        }
            break;
        default: {
            NSLog(@"这是什么情况啊?");
        }
            break;
    }
}
2.在买次购买之前检测是否有未完成的交易如果有就关闭。
NSArray* transactions = [SKPaymentQueue defaultQueue].transactions;
   if (transactions.count > 0) {
       //检测是否有未完成的交易
       SKPaymentTransaction* transaction = [transactions firstObject];
       if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
           [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
           return;
       }  
   }

二.内购 元数据丢失

一般情况下是需要填的选项没有填写完整,还有要填写完整不然审核内购项目可能会不通过。

三.iOS 内购 您已经购买了此项目,您想免费再获取一次吗

这个是内购选择类型不匹配原因导致。
非消耗型就是消耗一次后在该appid下都能使用。
消耗型比如一些直播平台的货币 使用完以后可以在充值。
我有这个问题是 最开始我们的项目是购买完产品以后可以永久使用,后来修改成充值余额购买,但是我没有去修改类型才导致的这个错误,

四.测试时记得把App Store上的账号注销,不然会出现购买失败,注销账号后,在进行内购时登录沙盒测试账号。

五.In-App Purchase二次验证

IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功。
当应用向Apple服务器请求购买,成功之后,Apple会返回以下四个数据给应用

  1. 产品标识符: product Identifier[在itunes store应用内定义的产品ID,例如com.公司名.产品名.道具名(com.xxxx.317hu.66)]
  2. 交易状态: state
  3. Receipt:很长的一段字符串,大概49行,作为二次验证的重要依据
  4. 交易标识符: transaction Identifier 我们需要把Receipt发送給苹果的苹果的服务器验证,用户的购买信息是否真实
交易状态 解释
Purchased 购买成功
Restored 恢复购买
Failed 失败
Deferred 等待确认,儿童模式需要询问家长同意

苹果返回状态码 状态码

状态 描述
21000 App Store不能读取你提供的JSON对象
21002 receipt-data域的数据有问题
21003 receipt无法通过验证
21004 提供的shared secret不匹配你账号中的shared secret
21005 receipt服务器当前不可用
21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • iOS应用如果涉及到支付功能,分为两类:第三方支付和苹果内购。那么什么情况下选择使用第三方支付,又在什么情况下选择...
    ZfRee阅读 38,675评论 36 66
  • - 消耗型项目 就像你玩游戏需要买金币,买钻石等,只要花钱就可以无限次的购买 - 非消耗型项目 就像你在App S...
    tiger2016阅读 631评论 0 1
  • 自己开发的视频直播项目,牵涉到充值金币,用到了苹果公司的内购,趴坑了两天,这里总结下实现苹果内购。 一. 创建测试...
    Leo丶Dicaprio阅读 3,330评论 8 7
  • 当购物车是空的时候 没有欲望 没有幻想 只有一丝的闲暇 心是甜甜的喜悦 再也不要为虚荣 奋斗 为华丽的躯壳 发愁 ...
    逗霸君阅读 259评论 0 5
  • 这里的天气总是阴晴不定,还是炎热的早上,午休后便开始有了乌云,还是带着伞继续来到原定计划的古子城 雨中的老街,老店...
    喵小蛙阅读 287评论 0 2