php 苹果支付验证,IOS苹果内购 PHP后端验证票据
大体流程:
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后端验证票据相关推荐
- IOS苹果内购 PHP后端验证票据
大体流程: 1.IOS端需要在iTunes Connect上面添加配置一些内购商品,并审核通过,每个内购商品有自己的唯一标识product_id. 2.PHP后端要有一套与之对应的内购商品.IOS应用 ...
- ios内购二次验证安全性问题_苹果IOS内购二次验证返回state为21002的坑
项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...
- JAVA项目之苹果IAP内购JAVA服务器验证流程详解
1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员, 认真看, 定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...
- ios内购二次验证安全性问题_iOS内购之二次验证
开篇:关于iOS内购整体流程网上能找到很多.我抽丝剥茧,着重说一下二次验证及收据回传的数据问题. 二次验证 关于二次验证,其实有两种做法,第一种是在app端验证,第二种也是安全防盗的一种,在服务端进行 ...
- 直播平台开发时iOS 开发内购功能,直播平台源码搭建
1.首先登录苹果账号,在直播平台源码搭建完成好后,进入后台管理中心添加商品,选择功能----App内购买项目------添加商品类型.商品的ID.以及说明信息. 2.在直播平台源码搭建后台创建沙盒测试 ...
- Python Google内购服务端验证
Google内购完成后,服务端需要校验订单的状态是否正确(是否已经成功付款). 一.申请认证 参考https://developers.google.cn/android-publisher/gett ...
- 苹果支付(内购项目)回调验证
返回的加密参数-苹果支付返回的参数 $receipt_data="MIIbWQYJKoZIhvcNAQcCoIIbSjCCG0YCAQExCzAJBgUrDgMCGgUA......&quo ...
- postman关闭ssl验证_【第5期】springboot:苹果内购服务端验证
苹果内购: 只要你在苹果系统购买APP中虚拟物品(虚拟货币,VIP充值等),必须通过内购方式进行支付,苹果和商家进行三七开 验证模式有两种: Validating Receipts With the ...
- 苹果不允许 iOS 应用内置购买(IAP)使用第三方支付方式,那么跨平台的支付怎么解决这个问题?
最近很多讨论应用内支付(IAP)的问题,但是好像很少有人看了这个 App Store Review Guidelines (https://developer.apple.com/appstore/ ...
最新文章
- Flink在美团的应用与实践听课笔记
- Modern Control
- port常用和不常用端口一览表
- 用js实现放大镜的效果
- matlab1信号的单边z变换:,实验二 离散时间信号与系统的Z变换分析
- 从源代码的角度分析--在BaseAdapter调用notifyDataSetChanged()之后发生了什么
- PHP和MySQL入门(3)
- pandas 根据列名索引多列数据_Pandas 数据聚合与分组运算[groupby+apply]速查笔记
- “大团队”和“敏捷开发”,谁说不可兼得?
- 音视频开发(30)---新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
- OpenShift 4 - 对镜像进行合规扫描,加固应用镜像安全
- Web后端学习笔记Flask(2)模板
- 海王什么意思,海王是什么意思梗,网络流行词海王介绍
- CSS设置文本——行间距
- python的多行语句可以使用反斜杠_Python的续行符:反斜杠\
- 控制系统数字仿真-基于MATLAB实现四阶龙格库塔法
- 迅雷服务器IP地址列表的获取办法
- 扬州大学计算机专业考研分数,扬州大学考研分数线
- 基于74LS148的简单四路抢答器 Multisim
- GNN学习笔记(四):图注意力神经网络(GAT)节点分类任务实现