/**

* @Author woann

* @param Request $request

* @return \Illuminate\Http\JsonResponse

* @des ios内购支付回调

*/

public function iosNotify(Request $request)

{

$this->validate(

$request,

[

'order_id' => 'required|digits_between:1,9|integer',

'apple_receipt' => 'required|min:20',

]

);

//苹果内购的验证收据

$receipt_data = $request->input('apple_receipt');

$order_id = $request->input('order_id');

$order = LevelOrder::find($order_id);

if (!$order || $order->state != 0) {

return returnApi(500,'订单状态异常');

}

$ios_sandBox = env('IOS_SANDBOX',true);//判断生产环境,开发环境

if(empty($receipt_data)){

return json(500, '参数不正确');

}

// 获取校验结果

$result=$this->validate_apple_pay($receipt_data,$ios_sandBox);

if (!$result || !is_array($result) || !isset($result['status'])) {

return returnApi(500,'获取数据失败,请重试');

}

//如果校验失败

if ($result['status'] != 0) {

return returnApi(500,'miss [apple_receipt]');

}

if ($result['status'] == 0) {

$transaction_ids = [];//用来收集需要关闭的transaction_id

//遍历未结束交易的列表(in_app)

foreach ($result['receipt']['in_app'] as $v){

$transaction_ids[] = $v['transaction_id'];//不管当前交易是否已经处理过,都要返回给客户端结束交易

$is_exist = DB::table('ios_transaction_id')->where('transaction_id', $v['transaction_id'])->first();

if ($is_exist) {

//如果已经处理过该订单 直接跳过

continue;

}

//否则在此处理业务逻辑

//...

//然后记录下此transaction_id标记为已处理过

DB::table('ios_transaction_id')->insert(['transaction_id' => $v['transaction_id']]);

}

//返回给客户端需要结束交易的transaction_id列表

return returnApi(200,'SUCCESS',['transaction_ids' => $transaction_ids]);

}

}

/**

* 验证AppStore内付

* @param string $receipt_data 付款后凭证

* @return array 验证是否成功

*/

protected function validate_apple_pay($receipt_data,$ios_sandBox)

{

/**

* 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环境的验证服务

*/

$POSTFIELDS = '{"receipt-data":"'. $receipt_data .'"}';

if($ios_sandBox){

// 请求验证

$data = httpRequest('https://sandbox.itunes.apple.com/verifyReceipt', $POSTFIELDS);

}else{

// 请求验证

$data = httpRequest('https://buy.itunes.apple.com/verifyReceipt', $POSTFIELDS);

}

return $data;

}

protected function httpRequest($url, $postData = array(), $json = true)

{

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

if ($postData) {

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

}

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);

$info = curl_getinfo($ch);

$data = curl_exec($ch);

curl_close($ch);

if ($json) {

return json_decode($data, true);

} else {

return $data;

}

}

ios内购php验证码,PHP (Laravel) 实现 iOS 内购服务端验证相关推荐

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

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

  2. Python Google内购服务端验证

    Google内购完成后,服务端需要校验订单的状态是否正确(是否已经成功付款). 一.申请认证 参考https://developers.google.cn/android-publisher/gett ...

  3. ios 支付验证 php,PHP服务端验证APPLE支付的收据

    使用服务器来交付内容,我们还需要做些额外的工作来验证从Store Kit发送的收据信息. 重要信息:来自Store的收据信息的格式是专用的. 你的程序不应直接解析这类数据.可使用如下的机制来取出其中的 ...

  4. 最新苹果服务器认证,iOS 苹果登录Sign in with Apple 和 服务端验证(nodejs 版)

    Sign in with Apple 服务端要做的其实很简单 nodejs需要装三个东西 npm install node-rsa npm install axios npm install json ...

  5. ios 内购正式环境_php服务端处理 ios内购充值

    app一直没有接入iOS内购充值,随着业务支付功能越来越多,ios内购充值就提到日程上来了.那么,ios内购充值怎么做呢? 其实iOS内购充值是通过客户端接入iOS的IAP模块(In-AppPurch ...

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

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

  7. Unity 之 Mac App Store 内购过程解析(购买非消耗道具 | 恢复购买 | 支付验证)

    Unity 之 Mac App Store 内购过程解析(恢复购买) 准备工作 一,具体实现 1.1 场景搭建 1.2 代码实现 1.3 打包设置 二,打包测试 2.1 实现步骤说明 2.2 Mac签 ...

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

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

  9. python内网穿透 开源_反向代理和内网穿透

    概念 反向代理看上去看深奥,其实不然,只是因为汉语言文化的差异导致它看上去深奥.一般反派感觉都比较厉害和神秘. 要理解反向代理,我们就不得不说一下正向代理. 正向代理 (Forward Proxy) ...

最新文章

  1. 从生成对抗网络到更自动化的人工智能
  2. win7下80端口被(Pid=4)占用的解决方法
  3. 电容触摸屏GT911、GT928、GT9147的使用
  4. zend怎么保存php,Zend Framework页面缓存实例
  5. Asp.net生成工作流、审批流的解决方案(asp.net workflow svg)
  6. 计算机应用技术商务网站运营,计算机应用技术云计算与商务网站运营有什么区别...
  7. 探索Julia(part6)--基本命令与数学函数
  8. Codeforces Round #344 (Div. 2) B. Print Check
  9. 零基础自学html5要多久?Web前端学习路线的6点建议
  10. Spring MVC JSR-303验证框架之Hibernate-Validator
  11. 《腾讯iOS测试实践》一一1.8 小结
  12. Java中的random
  13. 唐宇迪pytorch课程全部代码数据集github
  14. 百度经纬度和google经纬度互转
  15. [BZOJ5064]B-number
  16. Spring源码解析之AOP篇(一)----代理模式详解
  17. 打卡国潮新风尚@东莞隐贤山庄#玩转主题乐园#
  18. Notelife for Mac(笔记管理工具)
  19. oppofindx3pro分辨率设置方法
  20. [每日一题]C语言:将输入的一句话的单词倒置,但标点符号不倒置

热门文章

  1. 目标检测YOLO实战应用案例100讲-基于深度学习目标检测的白细胞分类技术研究
  2. FileReader对象
  3. VSCode用户代码片段无提示
  4. MP4V2--如何使用 MP4SetTrackESConfiguration
  5. python 小海龟 教案_小班分享阅读教案《小海龟》
  6. HTML5+CSS3+JavaScript从入门到精通(标准版)
  7. 一张图理清楚profile,chirp,subframe和frame之间的关系
  8. 小米、OPPO、vivo的“枪手博弈”,小米会先出局?
  9. 使用java反编译查看java生成的exe文件的源码
  10. 2013年06月新萝卜家园Ghost xp3装机版v2013◆年中推荐◆