以下是实际测试通过的苹果支付服务端代码,给大家提供些许思路帮助。再加强的安全处理根据自己的业务增加即可,这儿只列出了可用的骨架。

public function applepayAction(){$receipt = isset($this->param['receipt'])?$this->param['receipt']:'';$orderid = isset($this->param['transactionId'])?$this->param['transactionId']:'';$username = isset($this->param['username'])?$this->param['username']:'';$password = isset($this->param['password'])?$this->param['password']:''if(!$receipt||!$orderid){$this->ajaxerror('参数缺失');}$rechargeModel = new \Model\RechargeModel;$membersModel = M('Members');$member = $membersModel->where(array('uid'=>$uid))->find();//创建订单,使用苹果给的订单号$record = $rechargeModel->where(array('waterno'=>$orderid))->find();$orderno = date('YmdHis',time()).rand(1000,9999);if(empty($record)){$data = array('uid'           => $uid,'orderno'      => $orderno,'waterno'      => $orderid,'ordertime' => time(),'fromaddr'      => $_SERVER['HTTP_HOST'],'paytype'      => 10,);$rechargeModel->add($data);}$isSandbox = false;//沙箱是测试环境,正式环境改为false$info = $this->getReceiptData($receipt, $isSandbox);//去苹果进行二次验证,防止收到的是伪造的数据if(is_array($info) && $info['status'] == 0){//没有错误就进行业务逻辑的处理,订单设置成已支付,给用户加钱$answer['status'] = 1;$answer['msg']    = '支付成功';if($record['status'] != '1'){$data['amount'] = $this->product[$info['product_id']];//这个价格列表是你提交给苹果的,苹果不会直接给你具体多少钱$rechargeModel->where(array('waterno'=>$orderid))->save($data);//实际充值}else{$answer['msg']    = '该订单已支付';}}elseif(is_array($info) && $info['status'] == 21007){$infonew = $this->getReceiptData($receipt, true);//接着去苹果官网进行二次验证(沙盒)if(is_array($infonew) && $infonew['status'] == 0){$answer['status'] = 1;$answer['msg']    = '支付成功';}else{$answer['status'] = -100;$answer['msg']    = '正式不通过改测沙盒依旧不通过,错误码:'.$infonew['status'];}}else{$answer['status'] = -100;$answer['msg']    = '正式不通过且非21007不测沙盒,错误码:'.$info['status'];}$this->ajaxReturn($answer);}private $product = ['cb_18'  => 18,'cb_68'  => 68,'cb_118'  => 118,'cb_198'  => 198,'cb_208'  => 208,'cb_298'  => 298,'cb_308'  => 308,'cb_518'  => 518,'cb_698'  => 698,'cb_1048'  => 1048,'cb_1998'  => 1998,'cb_2298'  => 2298,'cb_5898'  => 5898,'cb_6498'  => 6498];private function getReceiptData($receipt, $isSandbox = false){if ($isSandbox) {$endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';//沙箱地址} else {$endpoint = 'https://buy.itunes.apple.com/verifyReceipt';//真实运营地址}$postData = json_encode(array('receipt-data' => $receipt));$ch = curl_init($endpoint);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);$response = curl_exec($ch);$errno    = curl_errno($ch);curl_close($ch);if ($errno != 0) {//curl请求有错误$this->ajaxerror('请求超时,请稍后重试');}else{$data = json_decode($response, true);if(isset($data['status'])){//返回产品的信息$order = $data['receipt']['in_app'][0];$order['status']=$data['status'];}else{$order['status']=30000;}            return $order;}}

这儿给大家贴个中文状态码:

再给个返回示例

/*返回数据参照样例array ('status' => 0,'environment' => 'Sandbox','receipt' => array ('receipt_type' => 'ProductionSandbox','adam_id' => 0,'app_item_id' => 0,'bundle_id' => 'com.abcde.www','application_version' => '0.0.9','download_id' => 0,'version_external_identifier' => 0,'receipt_creation_date' => '2016-07-13 18:22:19 Etc/GMT','receipt_creation_date_ms' => '1468434139000','receipt_creation_date_pst' => '2016-07-13 11:22:19 America/Los_Angeles','request_date' => '2016-07-13 18:22:22 Etc/GMT','request_date_ms' => '1468434142143','request_date_pst' => '2016-07-13 11:22:22 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' => array (0 => array ('quantity' => '1','product_id' => 'price_1',//去看$this->product里对应的价格,就是你的充值额'transaction_id' => '1000000223463280','original_transaction_id' => '1000000223463280','purchase_date' => '2016-07-13 18:22:19 Etc/GMT','purchase_date_ms' => '1468434139000','purchase_date_pst' => '2016-07-13 11:22:19 America/Los_Angeles','original_purchase_date' => '2016-07-13 18:22:19 Etc/GMT','original_purchase_date_ms' => '1468434139000','original_purchase_date_pst' => '2016-07-13 11:22:19 America/Los_Angeles','is_trial_period' => 'false',),),),)*/

苹果支付php服务端处理,以及双重验证,收据,状态码相关推荐

  1. ios 自己服务器 苹果支付_苹果支付 PHP 服务端处理

    因为上周末连续加班 2 天(产品非要周一上线新版本),因此断更公众号一段时间,今天继续补上. 之前有了微信和支付宝支付后,产品要加上苹果支付,于是有了这篇文章. 一.ios 端流程 itunnes 相 ...

  2. PHP处理苹果APP内购后到服务端的二次验证(项目经验)

    一.苹果APP支付到服务端验证流程 1. 用户在app中点击购买: 2. app调用服务端接口生成订单: 3. app获取到服务端订单生成成功后弹出支付窗口: 4. 用户输入密码支付: 5. app接 ...

  3. 微信app支付功能-服务端的实现-python3版

    微信app支付功能-服务端的实现-python3版 一:需求说明 二:微信app支付处理流程 三:所需依赖 3.1 支付配置 四:接口开发 4.1 创建订单接口 4.2 微信异步回调接口 4.3 订单 ...

  4. 支付宝app支付功能-服务端的实现-python3版

    支付宝app支付功能-服务端的实现-python3版 一:需求说明 二:支付宝app支付处理流程 三:所需依赖 3.1 依赖库 3.2 支付配置 3.2.1 沙箱环境配置 3.2.2 正式环境配置 四 ...

  5. 支付宝APP支付Java服务端

    支付宝APP支付Java服务端: 公司项目要求对接支付宝进行支付功能,这边做出整理方便以后使用(支付宝的支付对接还是很简单的). 1):去支付宝开放平台,-1.注册账号,2.创建应用 3.配置应用 4 ...

  6. Android安卓原生接入微信app支付PHP服务端

    Android安卓接入微信app支付PHP服务端 1.进入微信商户平台查看统一下单接口文档. 在查看完统一下单文档后,能够看到需要传递给微信"统一下单接口"地址的参数有哪些 统一下 ...

  7. 从游戏服务端角度分析移动同步(状态同步)

    从游戏服务端角度分析移动同步(状态同步) 参考文章: https://www.lfzxb.top/ow-gdc-gameplay-architecture-and-netcode/ https://z ...

  8. 魔坊APP项目-15-邀请好友(业务逻辑流程图、服务端提供邀请好友的二维码生成接口、客户端通过第三方识别微信二维码,服务端提供接口允许访问、App配置私有协议,允许第三方应用通过私有协议,唤醒APP)

    邀请好友 1.业务逻辑流程图 客户端提供点击"邀请好友"以后的页面frame,html/invite.html,代码: <!DOCTYPE html> <html ...

  9. 服务端大量处于TIME_WAIT和CLOSE_WAIT状态连接的原因

    服务端大量处于TIME_WAIT和CLOSE_WAIT状态连接的原因 1.服务端大量处于TIME_WAIT状态的连接原因? 1.HTTP没有使用长连接 2.HTTP长连接超时 3.HTTP长连接的请求 ...

最新文章

  1. 庖丁解InnoDB之REDO LOG
  2. ul 原点显示_web前端开发学习教程,CSS HTML - ul li列表原点如何相连
  3. 转 最小生成树(kruskal 算法 和prim算法)
  4. 现代操作系统原理与实践03:操作系统结构
  5. 树莓派3b接收USB串口数据并解析处理
  6. spring中配置数据源
  7. Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
  8. 中文乱码问题:JSP页面的显示问题,获取中文参数值问题
  9. 自定义 feign 调用实现 hystrix 超时、异常熔断
  10. 如何官网下载 IEEE 论文 Latex 和 Word 模板
  11. java首行缩进两个字符,都是首行缩进2字符,为什么缩进又不相同.d – 手机爱问...
  12. Unity3D第三人称Camera视角旋转实现
  13. 什么时间做职业生涯规划最合适?
  14. 第114课:SparkStreaming+Kafka+Spark SQL+TopN+Mysql+KafkaOffsetMonitor电商广告点击综合案例实战(详细内幕版本)
  15. FFmpeg执行命令时屏蔽输出
  16. Java输出一个数组
  17. ubuntu 18.04 开启rc.local
  18. 【WIN10蓝屏】win10系统蓝屏原因调查
  19. 王者荣耀服务器维护2020421,王者荣耀维护
  20. Ubuntu 编译jdk源码

热门文章

  1. 文本数据挖掘----数据预处理
  2. 爬王者荣耀图片源码,战国
  3. 如何绘制公司组织结构图
  4. 【疯狂的架构】牛公司组织结构图一览:华为,阿里,腾讯,百度,新浪……
  5. TFVC解锁被其他成员占用的文件
  6. HCIE-Security Day46:AC准入控制Dot1x
  7. DR钻戒能给“真爱”定价,但难救股价
  8. 名悦集团:冬季汽车保养怎么做才到位
  9. CVE-2020-11100: HAProxy 内存越界写入漏洞通告
  10. 接入点 CMNET和CMWAP 区别