对接苹果支付流程上相较于微信或者支付宝来说 后端做的代码是非常少的 但是需要注意的点很多

对于支付 最重要的是知道这笔支付到底是不是真正意义上成交了,以及成交价格是否对应我们的商品价格 这是我们需要去判断的

苹果支付对于微信支付和支付宝支付来说,有本质的区别。苹果支付的商品需要现在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 等待确认,儿童模式需要询问家长同意
  1. app从服务器获取产品标识列表

  2. app从app store 获取产品信息

  3. 用户选择需要购买的产品

  4. app 发送 支付请求到app store

  5. app store 处理支付请求,返回transaction信息

  6. app 将transaction receipt 发送到服务器

  7. 服务器收到收据后发送到app stroe验证收据的有效性

  8. app store 返回收据的验证结果

  9. 根据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对接苹果支付全流程相关推荐

  1. jsapi支付签名_微信支付小程序支付全流程

    点击蓝色字关注我们! 一个努力中的公众号 长的好看的人都关注了 本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解.小程序支付主要包含如下几步骤,1.预下单-调用微信 ...

  2. 微信支付-小程序支付全流程

    点击蓝色字关注我们! 一个努力中的公众号 长的好看的人都关注了 本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解.小程序支付主要包含如下几步骤,1.预下单-调用微信 ...

  3. unity集成InAppPurchase,发布GooglePlay,并在GooglePlay上下载应用,吊起Google支付全流程

    unity集成InAppPurchase,发布GooglePlay,并在GooglePlay上下载应用,吊起Google支付全流程 第一步:准备一个google开发者账号,此账号国家和地区不能在中国大 ...

  4. 对接三方支付通道流程步骤

    第三方支付通道对接的流程和步骤,在确认支付流程和特定产品计划的细节后,将进入技术对接阶段.在这个阶段,两个公司的技术人员在技术层面进行对接和调试,根据双方确定的支付过程,根据第三方支付接口公司提供的接 ...

  5. 【JAVA】对接苹果授权登录流程

    背景 苹果公司要求所有使用第三方登录的 App,都必须接入Sign in with Apple. 接入方式 基于JWT identityToken的算法验证 基于授权码的验证 校验流程 上图为苹果对接 ...

  6. 支付宝怎么提交html表单提交,支付宝支付全流程

    支付宝沙箱环境 蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境.沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑(当前沙箱支持产品请参考"沙箱支持产品列表&q ...

  7. 微信小程序接入微信支付全流程(koa2)

    在微信公众平台配置request合法域名和业务域名 使用ten_pay插件接入微信支付 1.配置域名 开发管理->开发设置->在服务器域名在里面配置request合法域名(必须是https ...

  8. node 对接微信支付的踩坑记录(服务端)

    因项目需要,对接了微信支付,微信支付对于网页来说没有什么工作量,申请了商户号后,直接将收款码放到网页上就可以,但是小程序需要调起微信支付直接付款,于是认真翻阅了官网要针对小程序做微信支付的对接. 准备 ...

  9. uniapp 苹果支付注意事项(前端)

    <script> let iapChannel = null, productId = 'Recharge_1',//默认苹果内购商品ID productIds = ['Recharge_ ...

  10. Java对接微信支付(完整全流程)

    Java对接微信支付及支付回调通知的全流程 一.所用框架.对接微信支付我们技术组用的是payment框架,因为该框架已整合springboot因此很方便快捷 <dependency>< ...

最新文章

  1. 这四个问题场景你会排查原因吗?看看高手是如何使用 Arthas 快速定位原因的!...
  2. 笔记-项目采购管理-战略合作管理-建立供应商战略合作伙伴关系的意义
  3. algorithm头文件函数全集——史上最全,最贴心
  4. css3如何实现倒影效果
  5. 为什么我偏爱用 GitHub 来写书?
  6. java模仿银行账务业务_一个银行转账业务模型分析:大魏Java记5-7
  7. java 反编译 调试_eclipse 反编译 jar 中 .class 并打断点调试
  8. oracle64位 32位plsql,64位oracle 安装32位plsql develop
  9. 用VBA代码打开xls文件时,判断被打开的xls文件是否含VBA代码并禁止其运行
  10. 网络七层协议的形象说明
  11. Android 图片裁剪
  12. 电脑安装有道后打开word文档很慢
  13. SpringBoot 结合 Mybatis 实现创建数据库表
  14. android appwidget 空间动画,Android学习之AppWidget笔记分享
  15. win10 家庭中文版打开本地组策略编辑器
  16. 居家办公以外一些有意思的事
  17. 让我摘下星星送给你_抖音摘下星星给你是什么歌_抖音想摘下星星给你歌名是什么_好特教程...
  18. 计算机教师中级职称个人总结,教师评职称个人总结
  19. 基础的http协议构成
  20. Postgresql源码(60)事务系统总结

热门文章

  1. ReactNative仿支付宝付款密码输入框
  2. 工作组可以看到计算机 但是无法访问,Win7中工作组计算机无法访问解决技巧
  3. Linux服务器间如何进行文件同步
  4. Java基础:如何在IDEA中查看依赖关系
  5. 计算机excel四舍五入,如何在Excel中设置四舍五入
  6. android 视频截屏代码,android视频截屏手机录屏实现代码
  7. i微信编辑器服务器,i排版微信编辑器
  8. C# 如何生成CHM帮助文件
  9. win10快捷键大全 win10常用快捷键
  10. PS图片上传图片 同时生成微缩图