大体流程:

1.IOS端需要在iTunes Connect上面添加配置一些内购商品,并审核通过,每个内购商品有自己的唯一标识product_id。

2.PHP后端要有一套与之对应的内购商品、IOS应用唯一标识bundle_id和应用秘钥配置,以便用于验证。如下在tp5的config中做了配置://IOS内购配置

'applepay'         =>[

'bundle_id'     => 'com.oyhdo.lws', //应用唯一标识

'products'      => ['com.lws.good1','com.lws.good2','com.lws.good3'], //内购商品

'apple_secret'  => '6666666' //应用密钥,在itunes中获取

],

3.IOS端调起内购支付,支付成功后会返回票据receipt_data,IOS端需将此票据及其他参数提交给后端接口验证(建议加密)。

(后端接收到的receipt_data票据信息打印如下:)array(3) {

["receipt"] => array(18) {

["receipt_type"] => string(17) "ProductionSandbox"

["adam_id"] => int(0)

["app_item_id"] => int(0)

["bundle_id"] => string(18) "com.oyhdo.lws"

["application_version"] => string(1) "1"

["download_id"] => int(0)

["version_external_identifier"] => int(0)

["receipt_creation_date"] => string(27) "2019-01-16 13:24:02 Etc/GMT"

["receipt_creation_date_ms"] => string(13) "1547645042000"

["receipt_creation_date_pst"] => string(39) "2019-01-16 05:24:02 America/Los_Angeles"

["request_date"] => string(27) "2019-01-16 13:26:00 Etc/GMT"

["request_date_ms"] => string(13) "1547645160103"

["request_date_pst"] => string(39) "2019-01-16 05:26:00 America/Los_Angeles"

["original_purchase_date"] => string(27) "2013-08-01 07:00:00 Etc/GMT"

["original_purchase_date_ms"] => string(13) "1375340400000"

["original_purchase_date_pst"] => string(39) "2013-08-01 00:00:00 America/Los_Angeles"

["original_application_version"] => string(3) "1.0"

["in_app"] => array(1) {

[0] => array(11) {

["quantity"] => string(1) "1"

["product_id"] => string(15) "com.lws.good1"

["transaction_id"] => string(16) "1000000494954657"

["original_transaction_id"] => string(16) "1000000494954657"

["purchase_date"] => string(27) "2019-01-16 13:24:02 Etc/GMT"

["purchase_date_ms"] => string(13) "1547645042000"

["purchase_date_pst"] => string(39) "2019-01-16 05:24:02 America/Los_Angeles"

["original_purchase_date"] => string(27) "2019-01-16 13:24:02 Etc/GMT"

["original_purchase_date_ms"] => string(13) "1547645042000"

["original_purchase_date_pst"] => string(39) "2019-01-16 05:24:02 America/Los_Angeles"

["is_trial_period"] => string(5) "false"

}

}

}

["status"] => int(0)

["environment"] => string(7) "Sandbox"

}

4.PHP后端对票据进行验证,并执行一些业务逻辑。代码如下://IOS内购

public function applepay(){

$arr = ['code'=>0,'msg'=>'支付失败','data'=>[]];

$user_id = $_POST['user_id'];//用户id

$money = $_POST['money']; //支付金额

$receipt_data = $_POST['receipt_data'];//票据

if ($user_id && $money>0 && $receipt_data) {

//生成商家订单号

$order_no = 'IOS'.time().rand(10000,99999);

/**

添加订单记录

省略逻辑......

**/

if($order_log){

//验证收据

$res = $this->validate_applepay($receipt_data,false); //false沙盒 true正式

if(intval($res['status'])==0) {  //验证成功

$bundleId = config('bundle_id');

$products = config('products');

$bundle_id = $res['receipt']['bundle_id'];

$product_id = $res['receipt']['in_app'][0]['product_id'];

if($bundle_id==$bundleId && in_array($product_id,$products)){

//更新订单记录

$data['trade_no'] = $res['receipt']['in_app'][0]['transaction_id'];//内购交易订单号

$data['total_fee'] = $money; //总金额

$data['pay_time'] = time(); //支付成功时间

$data['state'] = 1;//修改订单状态

$updatelog = PayModel::updateLog($order_no,$data);

if($updatelog){

$arr['code'] = 200;

$arr['msg'] = '支付成功';

}

}else{

$arr['msg'] = '配置错误';

}

}else{  //验证失败

$arr['code'] = $res['status'];

}

}

}else{

$arr['msg'] = '参数错误';

}

echo json_encode($arr);

}

/**

* IOS内购验证票据

* @param  string $receipt_data 付款后凭证

* @return array                验证是否成功

*/

private function validate_applepay($receipt_data,$sandbox=false){

$apple_secret = config('applepay.apple_secret');

$jsonData = array('receipt-data'=>$receipt_data,'password'=>$apple_secret);

$post_json = json_encode($jsonData);

if($sandbox){

$url="https://buy.itunes.apple.com/verifyReceipt";//正式环境

}else{

$url="https://sandbox.itunes.apple.com/verifyReceipt";//沙盒环境

}

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_json);

$result = curl_exec($ch);

curl_close($ch);

return json_decode($result,true);

//返回status示例:

// * 0     验证成功

// * 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环境的验证服务

}

php 苹果支付验证,IOS苹果内购 PHP后端验证票据相关推荐

  1. IOS苹果内购 PHP后端验证票据

    大体流程: 1.IOS端需要在iTunes Connect上面添加配置一些内购商品,并审核通过,每个内购商品有自己的唯一标识product_id. 2.PHP后端要有一套与之对应的内购商品.IOS应用 ...

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

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

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

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

  4. ios内购二次验证安全性问题_iOS内购之二次验证

    开篇:关于iOS内购整体流程网上能找到很多.我抽丝剥茧,着重说一下二次验证及收据回传的数据问题. 二次验证 关于二次验证,其实有两种做法,第一种是在app端验证,第二种也是安全防盗的一种,在服务端进行 ...

  5. 直播平台开发时iOS 开发内购功能,直播平台源码搭建

    1.首先登录苹果账号,在直播平台源码搭建完成好后,进入后台管理中心添加商品,选择功能----App内购买项目------添加商品类型.商品的ID.以及说明信息. 2.在直播平台源码搭建后台创建沙盒测试 ...

  6. Python Google内购服务端验证

    Google内购完成后,服务端需要校验订单的状态是否正确(是否已经成功付款). 一.申请认证 参考https://developers.google.cn/android-publisher/gett ...

  7. 苹果支付(内购项目)回调验证

    返回的加密参数-苹果支付返回的参数 $receipt_data="MIIbWQYJKoZIhvcNAQcCoIIbSjCCG0YCAQExCzAJBgUrDgMCGgUA......&quo ...

  8. postman关闭ssl验证_【第5期】springboot:苹果内购服务端验证

    ​苹果内购: 只要你在苹果系统购买APP中虚拟物品(虚拟货币,VIP充值等),必须通过内购方式进行支付,苹果和商家进行三七开 验证模式有两种: Validating Receipts With the ...

  9. 苹果不允许 iOS 应用内置购买(IAP)使用第三方支付方式,那么跨平台的支付怎么解决这个问题?

    最近很多讨论应用内支付(IAP)的问题,但是好像很少有人看了这个 App Store Review Guidelines  (https://developer.apple.com/appstore/ ...

最新文章

  1. Flink在美团的应用与实践听课笔记
  2. Modern Control
  3. port常用和不常用端口一览表
  4. 用js实现放大镜的效果
  5. matlab1信号的单边z变换:,实验二 离散时间信号与系统的Z变换分析
  6. 从源代码的角度分析--在BaseAdapter调用notifyDataSetChanged()之后发生了什么
  7. PHP和MySQL入门(3)
  8. pandas 根据列名索引多列数据_Pandas 数据聚合与分组运算[groupby+apply]速查笔记
  9. “大团队”和“敏捷开发”,谁说不可兼得?
  10. 音视频开发(30)---新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
  11. OpenShift 4 - 对镜像进行合规扫描,加固应用镜像安全
  12. Web后端学习笔记Flask(2)模板
  13. 海王什么意思,海王是什么意思梗,网络流行词海王介绍
  14. CSS设置文本——行间距
  15. python的多行语句可以使用反斜杠_Python的续行符:反斜杠\
  16. 控制系统数字仿真-基于MATLAB实现四阶龙格库塔法
  17. 迅雷服务器IP地址列表的获取办法
  18. 扬州大学计算机专业考研分数,扬州大学考研分数线
  19. 基于74LS148的简单四路抢答器 Multisim
  20. GNN学习笔记(四):图注意力神经网络(GAT)节点分类任务实现

热门文章

  1. 完美解决Mac软件意外退出的方法
  2. EEGLAB数据分析:预处理与后续处理
  3. java ssm oa_基于SSM的OA系统
  4. Nginx安装及配置教程
  5. 软件测试面试常见问题(2)
  6. Android之应用开发基础
  7. 请别把加班说的那么“高大上”
  8. TMECH发表优必选运控技术最新进展:实现人形机器人高鲁棒性行走
  9. 1月VR大数据:Quest 2增长2.91%,HTC份额跌至10%以下
  10. 福禄克寻线仪跟200左右的寻线仪品牌有什么区别?