app一直没有接入iOS内购充值,随着业务支付功能越来越多,ios内购充值就提到日程上来了。那么,ios内购充值怎么做呢?

其实iOS内购充值是通过客户端接入iOS的IAP模块(In-AppPurchase)后,由客户端发起充值,然后再把充值数据(receipt)发给服务端,最后由服务端远程调用AppStore服务器验证。

具体的流程如图:

服务端连接AppStore验单

验单的过程是,服务端发起HTTP Post请求,将以下字段的数据以json格式请求 AppStore 服务器,解析返回数据来验证。

字段:receipt-data

来源:ios端内置的生成base64编码的token。

AppStore 服务器有两个,对应测试环境(沙盒测试)和正式环境:

测试环境: https://sandbox.itunes.apple.com/verifyReceipt

正式环境: https://buy.itunes.apple.com/verifyReceipt

// $verification_uri = 'https://buy.itunes.apple.com/verifyReceipt';

$verification_uri = 'https://sandbox.itunes.apple.com/verifyReceipt';

$post_data = array(

'receipt-data'=>$receipt_data // 此处的值 是ios客户端生成的验签token

);

$ch = curl_init($verification_uri);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_POST, true);

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));

$response = curl_exec($ch);

$errno    = curl_errno($ch);

$errmsg   = curl_error($ch);

curl_close($ch);

if ($errno != 0) {

throw new Exception($errmsg, $errno);

}

$data = json_decode($response, 1);

服务端验证返回数据

iOS发起票据验证请求后,通过处理AppStore返回数据来验单。下面举两个示例,同时说明不同iOS版本的返回数据不同,服务端要做好区别。

1、iOS7及以上获取的票据返回数据:{

receipt =  {

"adam_id" = 0,

"app_item_id" = 0,

"application_version" = 1,

"bundle_id" = "com.test",

"download_id" = 0,

"in_app" = {

{

"is_trial_period" = false,

"original_purchase_date" = "2017-01-01 01:01:01 Etc/GMT",

"original_purchase_date_ms" = 1483203661000,

"original_purchase_date_pst" = "2017-01-01 01:01:01 America/Los_Angeles",

"original_transaction_id" = 1000000000000001,

"product_id" = "com.test.10",

"purchase_date" = "2017-01-01 01:01:01 Etc/GMT",

"purchase_date_ms" = 1483203661000,

"purchase_date_pst" = "2017-01-01 01:01:01 America/Los_Angeles",

"transaction_id" = 1000000000000001

},

//......

},

"receipt_type" = ProductionSandbox,

"request_date" = "2017-01-01 01:01:01 Etc/GMT",

"request_date_ms" = 1483203661000,

"request_date_pst" = "2017-01-01 01:01:01 America/Los_Angeles",

"version_external_identifier" = 0,

},

status = 0

}

2、iOS7以下获取的票据返回数据(不包括iOS7):{

receipt = {

"bid" = "com.test",

"bvrs" = 1,

"item_id" = 573837050,

"original_purchase_date" = "2017-01-01 01:01:01 Etc/GMT",

"original_purchase_date_ms" = 1483203661000,

"original_purchase_date_pst" = "2017-01-01 01:01:01 America/Los_Angeles",

"original_transaction_id" = 1000000000000001,

"product_id" = "com.test.10",

"purchase_date" = "2017-01-01 01:01:01 Etc/GMT",

"purchase_date_ms" = 1483203661000,

"purchase_date_pst" = "2017-01-01 01:01:01 America/Los_Angeles",

"transaction_id" = 1000000000000001

},

status = 0

}

验证订单是否成功,关键看这几个数据:

1、status为 0 表示成功;其他都为失败,表示失败原因

2、根据 receipt.in_app 字段判断iOS版本,验证方法也不同

iOS7及以上:有in_app字段,验证 receipt.bundle_id 是否为你 App 的 bundle id,根据 in_app 处理充值的每一笔订单, 根据 product_id 判断用户充值了哪个档位,同时取出 transaction_id

iOS7以下:没有in_app字段,验证 receipt.bid 是否为你 App 的 bundle id,根据 product_id 判断用户充值了哪个档位,同时取出 transaction_id

3、根据 transaction_id 对比数据库历史订单判断是否已处理过,没有则认为本次充值是有效的。

iOS充值坑点: in_app 究竟是什么

receipt.in_app 是请求AppStore验单后返回的数据,前面有提及,为用户的充值订单数据。

有两个问题要注意:

1、iOS内购充值时,客户端充值后从iOS得到的票据 receipt_data 不是针对本次充值的,而是相当于给一个授权 token, 获取用户 appleid 账号在本 App 中所有未关闭的充值记录,包括刚刚发起的充值。

2、根据这个票据查到的充值数据(receipt.in_app) ,除了最近发起的充值,还包括了非消耗品型,订阅型的充值数据。其中,最近发起的充值,不只是刚刚发起的充值,还可能是最近的几笔充值。特别是沙盒测试,还可能拿到已经确认关闭了的充值订单

所以,取到充值数据,不是取 receipt.in_app 中的第一个数据、或最后一个,而是在客户端完成充值后,将AppStore回调给到的 transaction_id 拿来做匹配。

iOS充值坑点:App审核不通过

苹果审核App时,是在沙盒环境下测试。所以,当App提交苹果审核时,服务端需换成沙盒环境,否则就无法通过苹果审核。通常游戏开发商都会搞一个审核服来给苹果审核,这样,审核服用沙盒环境,正式服用正式环境。

但对于很多App应用开发商来说,专门搞一个服务器显然增加了不少成本。其实还是有办法处理的,方法如下:

根据验单返回的 status 字段:

当 status = 21007 时,把请求地址换成沙盒测试地址,再次请求验单。

ios 内购正式环境_php服务端处理 ios内购充值相关推荐

  1. 企业实操任务- 正式环境Redis服务启用密码认知

    正式环境Redis服务启用密码认证 变更原因:现网Redis服务未启用密码认证,存在安全风险,变更启用密码认证. 操作人:ln@turingcat.com 审批人:ti@turingcat.com 知 ...

  2. php推送手机,PHP_解析php做推送服务端实现ios消息推送,准备工作1.获取手机注册应用 - phpStudy...

    解析php做推送服务端实现ios消息推送 准备工作1.获取手机注册应用的deviceToken(iphone手机注册应用时返回唯一值deviceToken) 2.获取ck.pem文件(做手机端的给) ...

  3. ios 内购正式环境_iOS 内购最新讲解

    本文为CocoaChina网友IIronMan投稿 一.总说内购的内容协议.税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注意事项 二.协议.税务和银行业务 信 ...

  4. ios 内购正式环境_iOS 内购的实现

    自己开发的视频直播项目,牵涉到充值金币,用到了苹果公司的内购,趴坑了两天,这里总结下实现苹果内购. 一. 创建测试App 首先你需要登录 App的ItunesConnection,你会看到如下界面 简 ...

  5. ios 内购正式环境_iOS 内购经验

    最近在做iOS内购,碰到的一些问题及解决方案,希望能帮到大家 1.如果需要内购实现代码,请留下你的QQ 2.关于内购商品被退回 内购被退回,主要有两个原因, 一是标题描述等信息没写清楚,这里需要你填写 ...

  6. ios 内购正式环境_iOS app内购

    一.测试账户生成 1.添加沙盒测试员 在App Store Connect中选择 Users and Access打开页面后在sandbox 下点击Testers,点击添加按钮(+),输入测试信息然后 ...

  7. ios 内购正式环境_iOS内购-部分玩家无法恢复购买

    起因是这样,自去年12月份,就陆续有玩家反馈以下问题购买了商品,却无法获得,也无法恢复购买 兑换码无法兑换到商品 重现:在设备1上兑换了A商品,恢复购买和再次免费购买,是无效的,而在设备2上用同一个账 ...

  8. ios 内购正式环境_iOS开发-2017苹果内购最新教程

    公司项目中有虚拟产品,所以要使用苹果内购.自此记录一下苹果内购的流程.前提是已有开发者账号 协议,税务和银行业务 协议,税务和银行业务 协议,税务和银行业务 申请合同 这里提示地址太长,按照要求重新填 ...

  9. ios 内购正式环境_iOS苹果内购(详细步骤)

    #### 一.设置付费协议 1.进入开发者平台,点击如下图所示: 设置 2.查看付费同意条款 1. 设置付费协议 添加这3个信息 4.添加银行账户 5.选择报税表 默认美国 6.根据报税表填写报税情况 ...

最新文章

  1. FastReport.Net 入门
  2. Scrum中如何实现一个Sprint?
  3. redis批量删除key
  4. Swoft 源码剖析 - Swoft 中的注解机制
  5. 查表法实现反正切_关于python实现CRC32的应用和总结
  6. 阿里云服务器安装JDK指南
  7. shell脚本将mysql查询结果制作成csv格式
  8. ubuntu 16.04 手动安装Java过程
  9. SQL Server存储过程作业(三)
  10. 网站开发之HTML基础表格Table和表单Form(三)
  11. Windows内核编程学习1:构建HelloWorld
  12. 常见的数据结构及其特征
  13. Spark入门项目Top10
  14. 9月18日博文阅读数异常波动公告
  15. 几种非接触涂层测厚方法原理对比
  16. 机器学习中的数学原理——随机梯度下降法
  17. ROS serial 读取IMU数据, 打包发布topic
  18. HDFS的滚动升级: Rolling Upgrade
  19. 过来人教你看清工程造价行业的职场真相
  20. CSS 了解transparent,用transparent透明实现箭头绘制

热门文章

  1. 2010年考研数学一解析
  2. 性能测试—性能测试方案设计思路总结
  3. Python爬虫实战视频教程-李宁-专题视频课程
  4. Azkaban 简介
  5. 知识图谱(一)——概述
  6. 托福高频真词List04 // 9:40~10:30 |阅读真题 // 11:00~11:50
  7. 关于数据库科学计数法显示问题
  8. sublime插件神器
  9. Dell服务器 iDRAC(IPMI) 连接管理服务器
  10. UVA 211 The Domino Effect 多米诺效应 (回溯)