PHP处理苹果APP内购后到服务端的二次验证(项目经验)
一、苹果APP支付到服务端验证流程
1. 用户在app中点击购买;
2. app调用服务端接口生成订单;
3. app获取到服务端订单生成成功后弹出支付窗口;
4. 用户输入密码支付;
5. app接收支付后apple应用商店返回的支付凭证;
6. app将支付凭证传回服务器,调用服务器接口验证凭证是否有效;
7. app获取服务器端的验证结果,反馈用户支付结果状态。
说明:苹果支付的商品,需要先在 itunes Connect 中配置APP内购项目,配置后对应会生成一个商品ID,在苹果APP端调用苹果支付时,就需要给苹果商店传送这个商品ID(product_id)参数。然后支付过程是在苹果商店中进行,支付完成后,返回一个支付凭证给APP,表示支付完成,但一般会再次调用自己的服务器(商家服务器)端进行支付验证,这时候在服务器写个验证接口,判断凭证是否有效,如果有效,对应修改订单状态和购买的商品状态等等。
二、凭证验证函数
/*** 验证AppStore内付* @param string $receipt_data 付款后凭证* @return array 验证是否成功*/function validate_apple_pay($receipt_data){/*** 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环境的验证服务*/function acurl($receipt_data, $sandbox=0){//小票信息$secret = "XXXXXXXXXXXXXXXXXXXX"; // APP固定密钥,在itunes中获取$POSTFIELDS = array("receipt-data" => $receipt_data,'password'=>$secret);$POSTFIELDS = json_encode($POSTFIELDS);//正式购买地址 沙盒购买地址$url_buy = "https://buy.itunes.apple.com/verifyReceipt";$url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";$url = $sandbox ? $url_sandbox : $url_buy;//简单的curl$ch = curl_init($url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);$result = curl_exec($ch);curl_close($ch);return $result;}// 验证参数if (strlen($receipt_data)<20){$result=array('status'=>false,'message'=>'非法参数');return $result;}// 请求验证$html = acurl($receipt_data);$data = json_decode($html,true);// 如果是沙盒数据 则验证沙盒模式if($data['status']=='21007'){// 请求验证$html = acurl($receipt_data, 1);$data = json_decode($html,true);$data['sandbox'] = '1';}if (isset($_GET['debug'])) {exit(json_encode($data));}// 判断是否购买成功if(intval($data['status'])===0){$result=array('status'=>true,'message'=>'购买成功');}else{$result=array('status'=>false,'message'=>'购买失败 status:'.$data['status']);}return $result;}
注意:验证函数中有一个密钥需要在 itunes 中获取。
三、应用示范(ThinkPHP3.2控制器)
public function verify(){// 获取订单号$order_no = I('post.order_no');// 获取用户id$user_id = I('post.uid');//苹果内购的验证收据$apple_receipt = I('post.apple_receipt');// 判断是否缺少参数if ( empty($order_no) || empty($user_id) || empty($apple_receipt) ) {$message = "缺少请求参数";$status = "400";} else {// 代码思路// 1. 判断订单是否存在并且有效// 2. 判断用户是否存在// 3. 调用苹果支付凭证验证函数$verify_result = validate_apple_pay($apple_receipt);// 4.判断验证结果if( $apple_result['status'] ) { // 凭证验证成功// 其他code,修改订单状态、购买商品状态……$message = "ok";$status = "200";} else { // 凭证验证失败$status = "401";$message = "验证失败";}}// 返回接口数据$result = array();if( !empty($apple_receipt) ) {$result['verify_result'] = $verify_result['message'];$result['apple_receipt'] = $apple_receipt;}$result['status'] = $status;$result['message'] = $message;$this->response($result,'json'); //以json方式返回数据}
四、参考文档
1. HTTP标准状态码;
2. 苹果内购买项目配置流程;
3. http://www.cnblogs.com/zhaoqingqing/p/4589200.html
4. https://www.cnblogs.com/zhaoqingqing/p/4597794.html
5. iOS应用内支付(IAP)详解
PHP处理苹果APP内购后到服务端的二次验证(项目经验)相关推荐
- 虚拟内购服务器,苹果APP内购客户付款成功,没收到相应虚拟产品的解决办法
一.引导用户走申请苹果的退款 1.告知用户新版本可以使用支付宝.微信支付,更划算 2.苹果可申请90天以内的退款,一般情况申请后48小时内就有反馈. 二.用户坚持补偿虚拟产品 1.如果是今天的交易,让 ...
- java(jfinal) 接入ios苹果内购(连续包月订阅),服务端将二次验证。
大致流程: 1.ios端进行支付,然后收到苹果的一串数据(也叫收据),然后ios端将其转码为BASE64编码的字符串. 2.ios端请求服务端接口,将数据传给服务端,服务端拿到数据后,通过一系列处理后 ...
- ios内购二次验证安全性问题_苹果IOS内购二次验证返回state为21002的坑
项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...
- 苹果美区app内购方法及经验
苹果美区app内购方法及经验 方法一:礼品卡(失败) 淘宝or亚马逊购买苹果礼品卡,经测试账号充值成功,也可以购买付费app,但内购会经典限购,等了n周依然没有解除.(如果养号成功大概就没什么问题.. ...
- 服务器接收 App Store 苹果商店内购项目IAP的退款通知
苹果商店内购IAP相信大家一定不陌生,苹果从中抽成30%更是让大多数公司都很反对.有时候碰上恶意退款的人更是没有办法,只能认栽.好消息是苹果终于上线了退款通知! "AppStore服务器通知 ...
- App内购项目的App Store推广
转载自:http://blog.hudongdong.com/ios/918.html 之前说了<iOS的应用内支付In-app purchase的开发>,说明了App内购项目的流程,今天 ...
- JAVA项目之苹果IAP内购JAVA服务器验证流程详解
1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员, 认真看, 定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...
- apple pay 和 In-App Purchase(app内购)
由于公司app审核遭拒,苹果公司回复需要走苹果内购.因此特意去看了周多软件看了他们是怎么做的,扒了网上很多帖子现在整理如下: 一.apple pay 和 In-App Purchase(app内购)是 ...
- 苹果IAP内购验证工具类
苹果内购 java验证类 package com.utils.ios; import lombok.extern.slf4j.Slf4j;import javax.net.ssl.*; import ...
最新文章
- 使用Python和OpenCV捕获鼠标事件,并裁剪图像
- 【组队学习】【30期】时间序列分析
- python简易图形-python图形用户界面(四):教你实现一个简单实用的计时器
- 堆(heap)和栈(stack)的区别
- asprise java_使用asprise进行图片验证码识别
- Nhibernate和 Entity Framework 4优缺点
- 使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表
- mac/linux 解决启动命令行出现declare问题
- model 提交表信息java,Angular6+antd+java+SpringMVC,表单提交自动接收模型对象?
- html绘制word柱状图,word如何制作柱状图
- 为什么你设计的网页不够惊艳?
- 虚拟机自省XenAccess和vmitools
- win10计算机文件夹隐藏,Win10此电脑6个文件夹隐藏方法
- 塞尔达传说-荒野之息 体验复盘
- 手写一个抖音视频去水印工具,千万别刚一个程序员
- 如何给电脑重装系统--一点通
- 【转】Principles of User Interface Design
- 2021-2025年中国废水泵行业市场供需与战略研究报告
- php快手开发平台api签名
- Qcom 8909 sbl1流程