返回的加密参数-苹果支付返回的参数  $receipt_data="MIIbWQYJKoZIhvcNAQcCoIIbSjCCG0YCAQExCzAJBgUrDgMCGgUA......";function validate_apple_pay($receipt_data) {
//      $receipt_data='dsfsfs';/**  * 21000  App Store无法读取您提供的JSON对象。* 21002 该receipt-data属性中的数据格式错误或丢失。* 21003 收据无法认证。* 21004 您提供的共享密码与您帐户的文件共享密码不匹配。* 21005 收据服务器当前不可用。* 21006 该收据有效,但订阅已过期。当此状态代码返回到您的服务器时,收据数据也会被解码并作为响应的一部分返回。仅针对自动续订的iOS 6样式交易收据返回。* 21007 该收据来自测试环境,但已发送到生产环境以进行验证。而是将其发送到测试环境。* 21008 该收据来自生产环境,但是已发送到测试环境以进行验证。而是将其发送到生产环境。* 21010 此收据无法授权。就像从未进行过购买一样对待。* 21100-21199 内部数据访问错误。* 在测试环境中,https://sandbox.itunes.apple.com/verifyReceipt用作URL。在生产中,https://buy.itunes.apple.com/verifyReceipt用作URL。*/   function acurl($receipt_data, $sandbox=0) {   //小票信息   $POSTFIELDS = array("receipt-data" => $receipt_data);   $POSTFIELDS = json_encode($POSTFIELDS);   $url_buy     = "https://buy.itunes.apple.com/verifyReceipt"; //正式购买地址 $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt"; //沙盒购买地址
//          $url = $sandbox ? $url_sandbox : $url_buy;     $url = $url_buy;     return curlHtml($url, $POSTFIELDS);   }   // 验证参数   if (strlen($receipt_data)<20){   $result = ['status'=>false, 'message'=>'非法参数'];   return $result;   }   // 请求验证   $html = acurl($receipt_data);   $data = json_decode($html,true);
//      var_dump($data);// 如果是沙盒数据 则验证沙盒模式   if($data['status'] == '21007'){   // 请求验证   $html = acurl($receipt_data, 1);   $data = json_decode($html,true);   $data['sandbox'] = '1';   }   //        if (isset($_GET['debug'])) {
//          exit(json_encode($data));
//      }   // 判断是否购买成功   if(intval($data['status']) === 0){   $result = ['code'=>200, 'msg'=>'购买成功'];   }else{   $result = ['code'=>-200, 'msg' => '购买失败 status:'.$data['status'] ];  }   return $result;   } 

function curlHtml($url, $data = ''){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);if(!empty($data)) {curl_setopt($ch, CURLOPT_POST, TRUE);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);}$output = curl_exec($ch);//释放curl句柄curl_close($ch);return $output;
}/**  * 验证AppStore内付  * @param  string $receipt_data 付款后凭证  * @return array                验证是否成功  */
function validate_apple_pay($receipt_data) {   /**  * 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环境的验证服务  */   function acurl($receipt_data, $sandbox=0) {   //小票信息   $POSTFIELDS = array("receipt-data" => $receipt_data);   $POSTFIELDS = json_encode($POSTFIELDS);   //正式购买地址 沙盒购买地址   $url_buy     = "https://buy.itunes.apple.com/verifyReceipt";   $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";   $url = $sandbox ? $url_sandbox : $url_buy;     return curlHtml($url, $POSTFIELDS);   }   // 验证参数   if (strlen($receipt_data)<20){   $result = ['status'=>false, 'message'=>'非法参数'];   return $result;   }   // 请求验证   $html = acurl($receipt_data);   $data = json_decode($html,true);   // 如果是沙盒数据 则验证沙盒模式   if($data['status'] == '21007'){   // 请求验证   $html = acurl($receipt_data, 1);   $data = json_decode($html,true);   $data['sandbox'] = '1';   }   if (isset($_GET['debug'])) {   exit(json_encode($data));   }   // 判断是否购买成功   if(intval($data['status']) === 0){   $result = ['status'=>true, 'message'=>'购买成功'];   }else{   $result = ['status'=>false, 'message' => '购买失败 status:'.$data['status'] ];  }   return $result;
}  

参考:

https://blog.csdn.net/fangdong88/article/details/82698810?utm_source=distribute.pc_relevant.none-task

https://www.cnblogs.com/cj8988/p/10648932.html

官方文件:

https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1

苹果支付(内购项目)回调验证相关推荐

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

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

  2. 服务器接收 App Store 苹果商店内购项目IAP的退款通知

    苹果商店内购IAP相信大家一定不陌生,苹果从中抽成30%更是让大多数公司都很反对.有时候碰上恶意退款的人更是没有办法,只能认栽.好消息是苹果终于上线了退款通知! "AppStore服务器通知 ...

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

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

  4. 虚拟内购服务器,苹果APP内购客户付款成功,没收到相应虚拟产品的解决办法

    一.引导用户走申请苹果的退款 1.告知用户新版本可以使用支付宝.微信支付,更划算 2.苹果可申请90天以内的退款,一般情况申请后48小时内就有反馈. 二.用户坚持补偿虚拟产品 1.如果是今天的交易,让 ...

  5. ios 自己服务器 苹果支付_thinkphp整合系列之苹果AppStore内购付款的服务器端php验证...

    如果要演一部霸道总裁的剧: 我想这主角必须非苹果莫属了: 苹果的霸道实在是出了名的: 这不:如果是非实物的交易: 现在你不给苹果交个过路费: 那都是立马被审核处死的节奏: 好了:以上仅为吐槽: 正题: ...

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

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

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

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

  8. 苹果IAP内购验证工具类

    苹果内购 java验证类 package com.utils.ios; import lombok.extern.slf4j.Slf4j;import javax.net.ssl.*; import ...

  9. ItunesConnect:苹果内购项目元数据缺失

    问题描述: 添加内购的App审核时被拒,原因为:ios内购 元数据丢失 问题原因: 审核信息里的 "审核屏幕快照" 和 "备注" 要填写,不然就失败的. 示例图 ...

最新文章

  1. php传值到模板,laravel 实现向公共模板中传值 (view composer)
  2. 北风设计模式课程---深入理解[代理模式]原理与技术
  3. 【Flask】项目中使用请求钩子的妙处有那些?
  4. java 报500该怎么解决_关于servlet500错误 应该怎么解决
  5. docker启动.NET3.1与5.0的包
  6. citrix android,Citrix Receiver
  7. laravel mysql驱动_Laravel 如何同时使用不同数据库驱动
  8. js bind 传参、_js中的面向对象(一)
  9. 中国可打印标签市场趋势报告、技术动态创新及市场预测
  10. 540.有序数组中的单一元素
  11. 澜舟科技开源轻量级中文语言预训练模型——孟子模型
  12. TCP Timestamp选项
  13. BZOJ 1977/洛谷P4180 - 次小生成树 Tree(严格次小生成树)
  14. windows下mysql忘记密码重置
  15. OSGB 倾斜摄影数据生产完成后裁剪模型问题
  16. C++ 完全平方数
  17. win7设置自动开机时间_电脑如何设置定时开机?瞬间让你的电脑启动变得随心所欲...
  18. 1020寒星孤月-蛇形矩阵
  19. spring注解之@PreDestroy的实现原理
  20. linux修改主机名命令

热门文章

  1. 关于RTP的一些背景知识
  2. python-字典列表集合字符串
  3. Xilinx FPGA高速串行收发器简介
  4. php 2038年,PHP 处理大于2038年以后的日期
  5. 嵌入式开发——rtc时钟调试笔记
  6. Mac OS X 10.8.5升级到更高版本的方法
  7. android studio中的模拟器,使用Android Studio创建Andorid模拟器
  8. 万字长文带你探究 Docker 容器化技术背后的黑科技
  9. dbca静默建库踩坑
  10. 21岁日本女星惨遭猥亵,只因自拍瞳孔倒影暴露住址? 一张照片是怎么出卖你的?