IAP是(In-APP Purchase),苹果商店内购。先来看看它的流程:

 

而实际运营过程中,经常会遇到这二个问题:

只要应用玩的人比较多,基本上都会遇到过此类问题,下面是来自搜索引擎的结果:

 

 

这种情况应该得到重视,对于用户而言实际上是钱已经消费掉了,但是元宝或者物品没有获得,这会让人很焦虑的。的确,作为一名开发人员,遇到这种情况,第一反映确实是苹果出了问题,流程(逻辑)上没有什么问题,但是在苹果自己处理的那些步骤里,它可能就出异常了,导致了上面的问题。而我们实际上应该有相应的解决方案,哪怕它并不“完美”,总比二手一摊什么事不做要强很多吧

 

 

“您已购买此APP内购买项目,此项目将免费恢复。”这个字面意思的确不好理解,“已购买”这三个字,个人推断是钱已经被苹果给扣掉了(点击这里可以查看一个例证>>)。但是并没有发货,订单已经创建而且钱也已经被扣,但在关闭订单的时候似乎遇到了异常。这个异常,我曾经这样测试过:

在同一wifi下,使用不同的二台设备,用同一个沙盒帐号、对同一款应用“同时”进行购买遇到过一次这个问题。

注:“同时” –>  指几乎同一时刻去点击商店来执行购买操作

得到的结果是,设备A购买物品M,与设备B购买物品之前没有关联,绝大多数情况下都能购买到物品。

 

“尚未下载”与“项目将免费恢复”其实有些类似,为什么呢?因为钱已经被扣掉了,不然不会提示“已购买”。

而我测试自己的应用,它的逻辑是收到SKPaymentTransactionStatePurchased状态后,通知后台发货,后台发货成功后返回客户端,客户端再将订单给关闭掉([[SKPaymentQueue defaultQueue] finishTransaction:transaction]; )。并不是收到苹果的响应后关闭订单,如果这样做会导致一个问题,玩家钱扣掉了,但是对应的商品始终未到帐,而且也无法恢复了(因为你调用了finish,将它从购买队列中删除了,后台苹果提供了[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];来进行恢复,但实际上这样做会比较复杂)。

 

而如果是苹果回调并返回SKPaymentTransactionStatePurchased状态,客户端在传给后台处理时出了问题了,而导致一至未调用finishTransaction方法关闭订单,这的确会出问题,但不应该是那种提示,如果有也应该是http响应内容的提示。不调用半单,再重启进游戏时,会进入补单流程,如果补单成功倒还好,如果失败,那么在该设备上将无法使用该Apple ID来购买该商品了(其它商品还是可以购买的),无论是你卸载应用再删除还是重启设备都没有用。唯一的办法就是先关单。

 

如果苹果IAP有一个超时的机制,上面所遇到的情况就能解释的通。这个超时,可能是手机客户端与苹果服务器通信的时长,因为遇到这类问题的时候,通常网络都较慢,而且这个提示绝不是某个应用的程序员写出来的(语句读起来都反人类)。

 

虽然说了这么多,依然还是没能把这个问题的前因后果原原本本讲清楚,尽管如此还是需要有一个解决方案来避免此类问题。我自己后来想到的一个方案是这样:

用户遇到这类问题肯定会找客服反馈,客服通过它提供的登录服务器id、角色名,来查找他的登录信息,从登录信息里再查找它的设备唯一标识,比如IDFA,然后在登录的时候给这个设备返回一个特殊的标记位(仅本次登录返回),如果满足条件,则执行“清单动作”,关闭所有未关闭的订单,让用户能继续消费。至于已经被苹果扣掉的钱,二种选择:

1、用户向苹果申诉,退款给他;

2、用户截取充值的记录,然后研发这边对比它的充值时的信息来甄别订单,对它进行补单操作;

 

 

参考链接:

ios内购(iap)关于问题“您已经购买了此程序内购买(In App Purchase)项目,但尚未下载"的解决方案

IAP有问题,提示你已经购买了此程序内购买项目,但尚未下载

[转]IAP 苹果官方文档翻译 超级详解

IAP的几个问题的更多相关文章

  1. LPC43xx系列使用IAP的注意事项

    LPC43xx系列使用IAP的注意事项 Tags: LPC43xx IAP 单片机 LPC43xx IAP函数的调用 一般MCU的IAP是,厂商固化一段代码在芯片的某个区域,然后告诉你这个代码的入口地 ...

  2. IAP

    release_check_url := "https://buy.itunes.apple.com/verifyReceipt" debug_check_url := " ...

  3. [Amazon] Amazon IAP for Unity

    1> 下载amazon IAP3.0 for unity plugin 2> 根据 https://developer.amazon.com/public/apis/earn/in-app ...

  4. [Android] Google IAP unmaneged items服务器校验

    android IAP unmaneged items 服务器校验 当成功IAP以后, 会在google服务器记录此次购买的状态. 可以通过Google Play Android Developer ...

  5. <转>iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!

    原文地址:http://blog.csdn.net/xiaominghimi/article/details/6937097 //——2012-12-11日更新   获取"产品付费数量等于0 ...

  6. iOS应用内付费(IAP)开发步骤列表

    iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作.步骤繁多,在此把开发步骤列表整理如下.因为只是步骤列表, ...

  7. 关于IAP的破解

    介绍 大概在今年7月份,有俄罗斯黑客破解了苹果的应用内付费(In-App Purchases),设备在不越狱的情况下就可以免费获得来自苹果官网App Store里应用的收费道具.受影响的产品众多,包括 ...

  8. IAP 破解漏洞验证

    IAP支付有个漏洞,用户使用的可能是IAP Free 或者俄罗斯破解什么的,所产生的交易号:170000029449420 product_id:com.zeptolab.ctrbonus.super ...

  9. [转]iOS 应用内付费(IAP)开发步骤

    FROM : http://blog.csdn.net/xiaoxiangzhu660810/article/details/17434907 参考文章链接: (1)http://mobile.51c ...

随机推荐

  1. Android 在线更新apk

    1.获取当前包的信息: 1 PackageManager manager = Main.this.getPackageManager(); 2 try { 3 PackageInfo info = m ...

  2. CentOS6.4安装mysql2redis

    1.安装apr 下载:http://apache.dataguru.cn//apr/apr-1.5.1.tar.gz tar zxvf apr-.tar.gz cd apr- vi configure ...

  3. 摘:JavaScript性能优化小知识总结

    原文地址:http://www.codeceo.com/article/javascript-performance-tips.html JavaScript的性能问题不容小觑,这就需要我们开发人员在 ...

  4. c 语言结构体的三种定义方式

    struct 结构体名{   成员列表:   ..... }结构体变量: 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体 ...

  5. virtual关键字的本质是什么?

    MSDN上对virtual方法的解释:试着翻译如下 当一个方法声明包含virtual修饰符,这个方法就是虚方法.如果没有virtual修饰符,那么就不是虚方法. 非虚方法的实现是不变的:不管该方法是被 ...

  6. BZOJ3456: 城市规划

    Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或 ...

  7. [译]FastClick: native-like tapping for touch apps

    原文地址:http://labs.ft.com/2011/08/fastclick-native-like-tapping-for-touch-apps/ 这篇文章是一篇老文了,现在才看到,真是落后啊 ...

  8. JAVA操作MongoDB数据库

    1. 首先,下载MongoDB对Java支持的驱动包 驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads 2.Java操作Mo ...

  9. iOS 程序员 6 级考试(答案和解释)

    iOS 程序员 6 级考试(答案和解释)   我是前言 1. 下面的代码分别输出什么? @implementation Son : Father- (id)init { self = [super i ...

  10. iOS中的通知

    一.了解几个相关的类 1.NSNotification 这个类可以理解为一个消息对象,其中有三个成员变量. 这个成员变量是这个消息对象的唯一标识,用于辨别消息对象. @property (readon ...