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的几个问题的更多相关文章
- LPC43xx系列使用IAP的注意事项
LPC43xx系列使用IAP的注意事项 Tags: LPC43xx IAP 单片机 LPC43xx IAP函数的调用 一般MCU的IAP是,厂商固化一段代码在芯片的某个区域,然后告诉你这个代码的入口地 ...
- IAP
release_check_url := "https://buy.itunes.apple.com/verifyReceipt" debug_check_url := " ...
- [Amazon] Amazon IAP for Unity
1> 下载amazon IAP3.0 for unity plugin 2> 根据 https://developer.amazon.com/public/apis/earn/in-app ...
- [Android] Google IAP unmaneged items服务器校验
android IAP unmaneged items 服务器校验 当成功IAP以后, 会在google服务器记录此次购买的状态. 可以通过Google Play Android Developer ...
- <转>iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!
原文地址:http://blog.csdn.net/xiaominghimi/article/details/6937097 //——2012-12-11日更新 获取"产品付费数量等于0 ...
- iOS应用内付费(IAP)开发步骤列表
iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作.步骤繁多,在此把开发步骤列表整理如下.因为只是步骤列表, ...
- 关于IAP的破解
介绍 大概在今年7月份,有俄罗斯黑客破解了苹果的应用内付费(In-App Purchases),设备在不越狱的情况下就可以免费获得来自苹果官网App Store里应用的收费道具.受影响的产品众多,包括 ...
- IAP 破解漏洞验证
IAP支付有个漏洞,用户使用的可能是IAP Free 或者俄罗斯破解什么的,所产生的交易号:170000029449420 product_id:com.zeptolab.ctrbonus.super ...
- [转]iOS 应用内付费(IAP)开发步骤
FROM : http://blog.csdn.net/xiaoxiangzhu660810/article/details/17434907 参考文章链接: (1)http://mobile.51c ...
随机推荐
- struts1 核心类
http://ajh-123.blog.163.com/blog/static/161727409201031455634475/ 1.ActionServlet类: 是一个前端控制器,将reques ...
- Leetcode Remove Nth Node From End of List
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- 一、午夜倒数《苹果iOS实例编程入门教程》
该app为应用的功能为计算离午夜12:00点的剩余时间 现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View ...
- 纪念逝去的岁月——C/C++快速排序
快速排序 代码 #include <stdio.h> void printList(int iList[], int iLen) { ; ; i < iLen; i++) { pri ...
- Linux文件/目录权限设置命令:chmod
文件/目录权限设置命令:chmod 这是Linux系统管理员最常用到的命令之一,它用于改变文件或目录的访问权限.该命令有两种用法: 用包含字母和操作符表达式的文字设定法 其语法格式为:chmod [w ...
- BFS 骑士的移动
骑士的移动 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E 题目: Description A f ...
- java pio项目使用
一.简介 pio是apache的一个针对microsoft office的一个开源项目. Apache POI - the Java API for Microsoft Documents 官网地址: ...
- LaTex Remove Left Margin 去除左边空间
LaTex中使用itemize的时候,默认的每一项左边都有一小段距离,并不是紧贴着边缘的,那么如果我们想去掉这段距离,我们可以使用下面的命令: \usepackage{enumitem} \setli ...
- JavaScript基础 DOM的操作
1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Windows对象操作 一.属性和方法: window对象——浏览器 ...
- $_POST 变量以及$GLOBALS['HTTP_RAW_POST_DATA']
$_POST 变量是一个数组,内容是由 HTTP POST 方法发送的变量名称和值. $_POST 变量用于收集来自 method="post" 的表单中的值.从带有 POST 方 ...