苹果支付(内购项目)回调验证
返回的加密参数-苹果支付返回的参数 $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
苹果支付(内购项目)回调验证相关推荐
- JAVA项目之苹果IAP内购JAVA服务器验证流程详解
1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员, 认真看, 定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...
- 服务器接收 App Store 苹果商店内购项目IAP的退款通知
苹果商店内购IAP相信大家一定不陌生,苹果从中抽成30%更是让大多数公司都很反对.有时候碰上恶意退款的人更是没有办法,只能认栽.好消息是苹果终于上线了退款通知! "AppStore服务器通知 ...
- ios内购二次验证安全性问题_苹果IOS内购二次验证返回state为21002的坑
项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...
- 虚拟内购服务器,苹果APP内购客户付款成功,没收到相应虚拟产品的解决办法
一.引导用户走申请苹果的退款 1.告知用户新版本可以使用支付宝.微信支付,更划算 2.苹果可申请90天以内的退款,一般情况申请后48小时内就有反馈. 二.用户坚持补偿虚拟产品 1.如果是今天的交易,让 ...
- ios 自己服务器 苹果支付_thinkphp整合系列之苹果AppStore内购付款的服务器端php验证...
如果要演一部霸道总裁的剧: 我想这主角必须非苹果莫属了: 苹果的霸道实在是出了名的: 这不:如果是非实物的交易: 现在你不给苹果交个过路费: 那都是立马被审核处死的节奏: 好了:以上仅为吐槽: 正题: ...
- PHP处理苹果APP内购后到服务端的二次验证(项目经验)
一.苹果APP支付到服务端验证流程 1. 用户在app中点击购买: 2. app调用服务端接口生成订单: 3. app获取到服务端订单生成成功后弹出支付窗口: 4. 用户输入密码支付: 5. app接 ...
- postman关闭ssl验证_【第5期】springboot:苹果内购服务端验证
苹果内购: 只要你在苹果系统购买APP中虚拟物品(虚拟货币,VIP充值等),必须通过内购方式进行支付,苹果和商家进行三七开 验证模式有两种: Validating Receipts With the ...
- 苹果IAP内购验证工具类
苹果内购 java验证类 package com.utils.ios; import lombok.extern.slf4j.Slf4j;import javax.net.ssl.*; import ...
- ItunesConnect:苹果内购项目元数据缺失
问题描述: 添加内购的App审核时被拒,原因为:ios内购 元数据丢失 问题原因: 审核信息里的 "审核屏幕快照" 和 "备注" 要填写,不然就失败的. 示例图 ...
最新文章
- php传值到模板,laravel 实现向公共模板中传值 (view composer)
- 北风设计模式课程---深入理解[代理模式]原理与技术
- 【Flask】项目中使用请求钩子的妙处有那些?
- java 报500该怎么解决_关于servlet500错误 应该怎么解决
- docker启动.NET3.1与5.0的包
- citrix android,Citrix Receiver
- laravel mysql驱动_Laravel 如何同时使用不同数据库驱动
- js bind 传参、_js中的面向对象(一)
- 中国可打印标签市场趋势报告、技术动态创新及市场预测
- 540.有序数组中的单一元素
- 澜舟科技开源轻量级中文语言预训练模型——孟子模型
- TCP Timestamp选项
- BZOJ 1977/洛谷P4180 - 次小生成树 Tree(严格次小生成树)
- windows下mysql忘记密码重置
- OSGB 倾斜摄影数据生产完成后裁剪模型问题
- C++ 完全平方数
- win7设置自动开机时间_电脑如何设置定时开机?瞬间让你的电脑启动变得随心所欲...
- 1020寒星孤月-蛇形矩阵
- spring注解之@PreDestroy的实现原理
- linux修改主机名命令