IAP的几个问题

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有问题,提示你已经购买了此程序内购买项目,但尚未下载

时间: 2024-08-04 10:33:03

IAP的几个问题的相关文章

IAP

release_check_url := "https://buy.itunes.apple.com/verifyReceipt" debug_check_url := "https://sandbox.itunes.apple.com/verifyReceipt" 请求数据: {"receipt-data":"xxxxxxxx"} 苹果的返回值如下: { "receipt": { "origin

stm32 IAP + app的实现

基于STM32F407 的IAP+APP 已经全部实现,做个笔记. 1. 先准备boot  判断是否存在 APP,不存在就进入IAP模式等待有数据过来进行烧写. 2.boot 如果是接收 bin 文件数据,可以直接读bin 写入flash.  hex文件需要解析的. bin文件和hex 文件数据格式是有区别的. 3.如果boot准备好,那就准备一个上位机软件,读取bin文件并按包格式传送给boot(我暂时只打通了 uart 口.以后可以尝试一下usb). 4.APP 需要修改几个地方,第一个就是

编写IAP升级遇到的问题总结

IAP的源码等资料我上传了,压缩包内有12个文件,,http://download.csdn.net/detail/f907279313/7524849(要积分的辛苦收集的你们就给点积分吧) 还有另一篇博客总结的IAP:http://blog.csdn.net/super_demo/article/details/32133257 一,串口通信问题 1,串口通信两端的TTL电平要一致,看选用的芯片,要么都是3.3V要么都是5V..当两端电平不一致时通常是收不到数据的..当检测程序等都没有问题但是

ARUBA IAP简要配置指导

ARUBA IAP简要配置指导 一.     基本配置 1.      首先启动IAP,将两颗(或者多颗如学校部署多个AP)IAP接在同一个网段里,AP启动后使用笔记本无线功能搜索名称为instant的SSID.搜到后点击连接该SSID.如下图: 2.      无线连上instant的SSID之后查看PC是否获取到非169.x.x.x网段的地址,查看结果如下: 3.      打开网页输入https://instant.arubanetworks.com(有可能浏览器会提示此网站证书不受信任,

phonegap(cordova) 自定义插件代码篇(一)----IAP 应用内支付

appstore 中审核中,如果你app内卖的东西是个虚拟的产品,那么你有可能被要求不能使用第三方支付工具,只能使用 IAP 应用内支付功能. 使用这个功能需要在apple 开发者后台签合同,设置银行账号,设置价格,这个就不讲了,本篇主要讲phonegap中整合IAP的代码 /** * 苹果应用内支付 */ (function (cordova) { var define = cordova.define; define("cordova/plugin/applepay", funct

iOS应用IAP设置总结

iOS应用调置 wjforstudy分享了IAP的一些基本知识.在论坛的地址是:http://www.cocoachina.com/bbs/read.php?tid=92060 1.在开始IAP开发前,先要对IAP有个大概的了解,下面这片文章就是给你预备的:  苹果的官方文档:Store Kit Guide(In App Purchase)    现在网上已经有对这个文档很成熟的翻译了,如果想加快阅读速度,看这里    翻译版本:http://yarin.blog.51cto.com/11308

在bootloader及IAP中使用zlib解压缩

原有的bootloader方案是在片内FLASH上面分成3块,bootloader区占一小块,然后剩下区域平分成两块,一块是运行区,一块是新固件临时存储区. 好在现在FLASH在系统成本中占的比例越来越低了,不然这样用肯定很奢侈浪费了. 在此方案基础上,我们还可以使用压缩功能,这样临时存储区可以更小一些,可以释放出更多空间给运行区. 压缩算法格式综合考虑后使用gzip,解压程序使用zlib. 因为gzip格式比较通用,方便压缩和调试.而解压所消耗的资源也尚可接受. 一般测试下来,gz所用的 de

cocos2dx平台对接(Amazon IAP,Chartboost,Email)

主要目的是备忘,如果有幸能帮上其他朋友,那最好了 我的游戏使用的是cocos2dx 2.2.5,当然,使用2.1.x ~ 2.2.5版本都是可以的,没有什么变动. 一.Java调用C++ 1.在JAVA项目中,声明一个带“native”的静态函数,比如 (假设包名是 com.ooxx.mygame class MyActivity{ … public static native int onIAPCallback(int select); … } 在JAVA项目中,你就当这个函数是一个普通的静态

STM32 IAP工具

捣鼓了几天,用QT写了一个串口IAP工具. 使用前,需要将axf转换成bin文件.可以使用keil的fromelf来生产bin文件.然后载入文件并打开串口,按下载就可以了. 工具特点:将文件按1K为单位发送.不足1K,在末尾补全0xff至1K 按下面的格式传送 data_len_L data_len_H data(no more than 1K) index_L index_H CRC 2B数据长度 最多1KB的有效数据(真正的烧录数据) 2B的数据索引(表示接收/发送的数据是第几个1K) 4B

一个STM32的IAP程序,测试可以用

注意使用的是keil5.11a 自己根据开发指南写的一个IAP程序.在mini板上成功跑一个app.因为RB是128K的flash,所以将rom分割为 27K 1K 100K.其中27K 用来存储IAP.1K 用来存储一些信息,目前暂未使用到.100K就是app用的啦.    IAP程序的大致流程是这样的,上电后,在5s内(实际测试发现大于5s,暂时不管这个误差),轮询串口是否发送:updata;(update这个可以随意,保证:;中间有6个字母就好).如果超时没有收到:update;那么程序跳