PHP对接苹果支付全流程
对接苹果支付流程上相较于微信或者支付宝来说 后端做的代码是非常少的 但是需要注意的点很多
对于支付 最重要的是知道这笔支付到底是不是真正意义上成交了,以及成交价格是否对应我们的商品价格 这是我们需要去判断的
苹果支付对于微信支付和支付宝支付来说,有本质的区别。苹果支付的商品需要现在appstore里面去上架。所以整个支付流程如下
APP内请求苹果SDK发起支付。并完成购买。支付成功之后APP端会传一段receipt_data(同时需要带上APP支付成功的交易单号)给后端去做验证。后端拿到这个数据之后,会再次请求苹果服务器去解析数据。
结构如下:
{"receipt": {"receipt_type": "ProductionSandbox","adam_id": 0,"app_item_id": 0,"bundle_id": "申请苹果支付时的串号 固定的值","application_version": "24","download_id": 0,"version_external_identifier": 0,"receipt_creation_date": "2022-02-18 08:02:19 Etc/GMT","receipt_creation_date_ms": "1645171339000","receipt_creation_date_pst": "2022-02-18 00:02:19 America/Los_Angeles","request_date": "2022-02-23 13:21:51 Etc/GMT","request_date_ms": "1645622511107","request_date_pst": "2022-02-23 05:21:51 America/Los_Angeles","original_purchase_date": "2013-08-01 07:00:00 Etc/GMT","original_purchase_date_ms": "1375340400000","original_purchase_date_pst": "2013-08-01 00:00:00 America/Los_Angeles","original_application_version": "1.0","in_app": [{"quantity": "1","product_id": "10000",#产品ID"transaction_id": "1000000972016787", ##交易单号"original_transaction_id": "1000000972016787","purchase_date": "2022-02-18 08:02:19 Etc/GMT","purchase_date_ms": "1645171339000","purchase_date_pst": "2022-02-18 00:02:19 America/Los_Angeles","original_purchase_date": "2022-02-18 08:02:19 Etc/GMT","original_purchase_date_ms": "1645171339000","original_purchase_date_pst": "2022-02-18 00:02:19 America/Los_Angeles","is_trial_period": "false","in_app_ownership_type": "PURCHASED"#交易状态},{"quantity": "1","product_id": "betterwe_camp_21","transaction_id": "1000000970947758","original_transaction_id": "1000000970947758","purchase_date": "2022-02-17 07:26:24 Etc/GMT","purchase_date_ms": "1645082784000","purchase_date_pst": "2022-02-16 23:26:24 America/Los_Angeles","original_purchase_date": "2022-02-17 07:26:24 Etc/GMT","original_purchase_date_ms": "1645082784000","original_purchase_date_pst": "2022-02-16 23:26:24 America/Los_Angeles","is_trial_period": "false","in_app_ownership_type": "PURCHASED"},]},"environment": "Sandbox","status": 0
}
订单总共如下几种状态
状态 | 描述 |
---|---|
Purchased | 购买成功 |
Restored | 恢复购买 |
Failed | 失败 |
Deferred | 等待确认,儿童模式需要询问家长同意 |
app从服务器获取产品标识列表
app从app store 获取产品信息
用户选择需要购买的产品
app 发送 支付请求到app store
app store 处理支付请求,返回transaction信息
app 将transaction receipt 发送到服务器
服务器收到收据后发送到app stroe验证收据的有效性
app store 返回收据的验证结果
根据app store 返回的结果决定用户是否购买成功
基本的支付校验流程如下:
下面贴上具体的业务逻辑代码
public function actionsApplepay($receipt_data, $order_number, $transaction_id, $order_info, $is_test){$ret = array();$ret['status'] = 200;$ret['msg'] = "ok";try{//修改状态为校验中(new Order())::updateAppleOrderIsPaying($order_number);if ($is_test == 1) { //沙盒购买地址$url = "https://sandbox.itunes.apple.com/verifyReceipt";}else{ //正式购买地址$url = "https://buy.itunes.apple.com/verifyReceipt";}$receipt_data = str_replace(' ',"+", $receipt_data);$post_data = json_encode(array("receipt-data" => $receipt_data));$response = https_request($url, $post_data);$res = json_decode($response, true);$err_msg = array('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环境的验证服务');// 判断是否购买成功if(intval($res['status']) === 0){//支付成功 更改订单状态if($res['receipt']['bundle_id'] != 'com.wegymer.betterwestar'){throw new Exception('非法请求!', -1);}$pay_status = false;//默认支付为失败态if(count($res['receipt']['in_app'])){foreach ($res['receipt']['in_app'] as $apple_order){//满足二次验证的商品和客户端的商品一致 且 apple订单号一致 且支付状态为 PURCHASED 方式if($apple_order['product_id'] == $order_info['goods_id'] && $apple_order['transaction_id'] == $transaction_id && $apple_order['in_app_ownership_type'] == 'PURCHASED'){//如果查询到里面有满足条件的 将状态置为true$pay_status = true;}}}if($pay_status == true){$update_order_info_res = (new Order())->updateOrderIsPaySuccess($order_number, 3, $transaction_id);if($update_order_info_res['status'] != 200){throw new Exception($update_order_info_res['msg'], $update_order_info_res['status']);}}else{throw new Exception('未查询到当前订单的支付成功记录', -3);}}else{//沙盒情况下直接走完流程if($res['status'] == 21007){$update_order_info_res = (new Order())->updateOrderIsPaySuccess($order_number, 3, 'XXXXXXXXXX-SANDBOX');if($update_order_info_res['status'] != 200){throw new Exception($update_order_info_res['msg'], $update_order_info_res['status']);}}else{(new Order())::recordOrderErrorLog($order_number, '购买失败 status:'.$res['status'].' - '.@$err_msg[$res['status']].'receipt_data:'.$receipt_data);throw new Exception('购买失败 status:'.$res['status'].' - '.@$err_msg[$res['status']], $res['status']);}}}catch (Exception $e) {//修改状态为校验中(new Order())::updateAppleOrderIsNoPaying($order_number);$ret['status'] = $e->getCode();$ret['msg'] = $e->getMessage();}return $ret;}```
上面为具体的业务逻辑代码
PHP对接苹果支付全流程相关推荐
- jsapi支付签名_微信支付小程序支付全流程
点击蓝色字关注我们! 一个努力中的公众号 长的好看的人都关注了 本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解.小程序支付主要包含如下几步骤,1.预下单-调用微信 ...
- 微信支付-小程序支付全流程
点击蓝色字关注我们! 一个努力中的公众号 长的好看的人都关注了 本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解.小程序支付主要包含如下几步骤,1.预下单-调用微信 ...
- unity集成InAppPurchase,发布GooglePlay,并在GooglePlay上下载应用,吊起Google支付全流程
unity集成InAppPurchase,发布GooglePlay,并在GooglePlay上下载应用,吊起Google支付全流程 第一步:准备一个google开发者账号,此账号国家和地区不能在中国大 ...
- 对接三方支付通道流程步骤
第三方支付通道对接的流程和步骤,在确认支付流程和特定产品计划的细节后,将进入技术对接阶段.在这个阶段,两个公司的技术人员在技术层面进行对接和调试,根据双方确定的支付过程,根据第三方支付接口公司提供的接 ...
- 【JAVA】对接苹果授权登录流程
背景 苹果公司要求所有使用第三方登录的 App,都必须接入Sign in with Apple. 接入方式 基于JWT identityToken的算法验证 基于授权码的验证 校验流程 上图为苹果对接 ...
- 支付宝怎么提交html表单提交,支付宝支付全流程
支付宝沙箱环境 蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境.沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑(当前沙箱支持产品请参考"沙箱支持产品列表&q ...
- 微信小程序接入微信支付全流程(koa2)
在微信公众平台配置request合法域名和业务域名 使用ten_pay插件接入微信支付 1.配置域名 开发管理->开发设置->在服务器域名在里面配置request合法域名(必须是https ...
- node 对接微信支付的踩坑记录(服务端)
因项目需要,对接了微信支付,微信支付对于网页来说没有什么工作量,申请了商户号后,直接将收款码放到网页上就可以,但是小程序需要调起微信支付直接付款,于是认真翻阅了官网要针对小程序做微信支付的对接. 准备 ...
- uniapp 苹果支付注意事项(前端)
<script> let iapChannel = null, productId = 'Recharge_1',//默认苹果内购商品ID productIds = ['Recharge_ ...
- Java对接微信支付(完整全流程)
Java对接微信支付及支付回调通知的全流程 一.所用框架.对接微信支付我们技术组用的是payment框架,因为该框架已整合springboot因此很方便快捷 <dependency>< ...
最新文章
- 这四个问题场景你会排查原因吗?看看高手是如何使用 Arthas 快速定位原因的!...
- 笔记-项目采购管理-战略合作管理-建立供应商战略合作伙伴关系的意义
- algorithm头文件函数全集——史上最全,最贴心
- css3如何实现倒影效果
- 为什么我偏爱用 GitHub 来写书?
- java模仿银行账务业务_一个银行转账业务模型分析:大魏Java记5-7
- java 反编译 调试_eclipse 反编译 jar 中 .class 并打断点调试
- oracle64位 32位plsql,64位oracle 安装32位plsql develop
- 用VBA代码打开xls文件时,判断被打开的xls文件是否含VBA代码并禁止其运行
- 网络七层协议的形象说明
- Android 图片裁剪
- 电脑安装有道后打开word文档很慢
- SpringBoot 结合 Mybatis 实现创建数据库表
- android appwidget 空间动画,Android学习之AppWidget笔记分享
- win10 家庭中文版打开本地组策略编辑器
- 居家办公以外一些有意思的事
- 让我摘下星星送给你_抖音摘下星星给你是什么歌_抖音想摘下星星给你歌名是什么_好特教程...
- 计算机教师中级职称个人总结,教师评职称个人总结
- 基础的http协议构成
- Postgresql源码(60)事务系统总结