一、苹果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内购后到服务端的二次验证(项目经验)相关推荐

  1. 虚拟内购服务器,苹果APP内购客户付款成功,没收到相应虚拟产品的解决办法

    一.引导用户走申请苹果的退款 1.告知用户新版本可以使用支付宝.微信支付,更划算 2.苹果可申请90天以内的退款,一般情况申请后48小时内就有反馈. 二.用户坚持补偿虚拟产品 1.如果是今天的交易,让 ...

  2. java(jfinal) 接入ios苹果内购(连续包月订阅),服务端将二次验证。

    大致流程: 1.ios端进行支付,然后收到苹果的一串数据(也叫收据),然后ios端将其转码为BASE64编码的字符串. 2.ios端请求服务端接口,将数据传给服务端,服务端拿到数据后,通过一系列处理后 ...

  3. ios内购二次验证安全性问题_苹果IOS内购二次验证返回state为21002的坑

    项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...

  4. 苹果美区app内购方法及经验

    苹果美区app内购方法及经验 方法一:礼品卡(失败) 淘宝or亚马逊购买苹果礼品卡,经测试账号充值成功,也可以购买付费app,但内购会经典限购,等了n周依然没有解除.(如果养号成功大概就没什么问题.. ...

  5. 服务器接收 App Store 苹果商店内购项目IAP的退款通知

    苹果商店内购IAP相信大家一定不陌生,苹果从中抽成30%更是让大多数公司都很反对.有时候碰上恶意退款的人更是没有办法,只能认栽.好消息是苹果终于上线了退款通知! "AppStore服务器通知 ...

  6. App内购项目的App Store推广

    转载自:http://blog.hudongdong.com/ios/918.html 之前说了<iOS的应用内支付In-app purchase的开发>,说明了App内购项目的流程,今天 ...

  7. JAVA项目之苹果IAP内购JAVA服务器验证流程详解

    1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员,  认真看,  定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...

  8. apple pay 和 In-App Purchase(app内购)

    由于公司app审核遭拒,苹果公司回复需要走苹果内购.因此特意去看了周多软件看了他们是怎么做的,扒了网上很多帖子现在整理如下: 一.apple pay 和 In-App Purchase(app内购)是 ...

  9. 苹果IAP内购验证工具类

    苹果内购 java验证类 package com.utils.ios; import lombok.extern.slf4j.Slf4j;import javax.net.ssl.*; import ...

最新文章

  1. 使用Python和OpenCV捕获鼠标事件,并裁剪图像
  2. 【组队学习】【30期】时间序列分析
  3. python简易图形-python图形用户界面(四):教你实现一个简单实用的计时器
  4. 堆(heap)和栈(stack)的区别
  5. asprise java_使用asprise进行图片验证码识别
  6. Nhibernate和 Entity Framework 4优缺点
  7. 使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表
  8. mac/linux 解决启动命令行出现declare问题
  9. model 提交表信息java,Angular6+antd+java+SpringMVC,表单提交自动接收模型对象?
  10. html绘制word柱状图,word如何制作柱状图
  11. 为什么你设计的网页不够惊艳?
  12. 虚拟机自省XenAccess和vmitools
  13. win10计算机文件夹隐藏,Win10此电脑6个文件夹隐藏方法
  14. 塞尔达传说-荒野之息 体验复盘
  15. 手写一个抖音视频去水印工具,千万别刚一个程序员
  16. 如何给电脑重装系统--一点通
  17. 【转】Principles of User Interface Design
  18. 2021-2025年中国废水泵行业市场供需与战略研究报告
  19. php快手开发平台api签名
  20. Qcom 8909 sbl1流程

热门文章

  1. SU-03T语音识别模块使用以及注意事项
  2. 如何查看水表(图例详解)
  3. PNAS:音乐能增强早产儿的高级认知脑网络
  4. HTML中marquee标签的使用
  5. 联想学生机器出现网络连接不上的原因
  6. [Zotero] 解决ubuntu中zotero:// 链接跳转无法工作的问题
  7. scrapy实战之爬取简书
  8. 1333:【例2-2】Blah数集 一本通 队列
  9. rf框架搭建_RF框架—自动化UI框架解决方案模版
  10. U盘或者移动硬盘弹出时出现弹窗的解决方法