<?php /** * 微信支付回调类 * @name CallbackAction.class.php * @author yangzl * @date(20180820) */ class CallbackAction extends Action{ /** * @param 获取微信支付回调接口 * @return [type] [descripti * @date(20180820) * @author yangzl */ public function getPayMentCallBack(){ $curl_request = $_SERVER['REQUEST_METHOD']; //获取请求方式 if($curl_request == 'POST'){ $xmldata=file_get_contents("php://input"); libxml_disable_entity_loader(true); //把微信支付回调结果写入日志 $this->writeLogs(RUNTIME_PATH.'Logs/','getPayMentCallBack',"\r\n-------------------".date('Y-m-d H:i:s')."微信支付回调结果---------\r\n---响应数据:".json_encode(simplexml_load_string($xmldata, 'SimpleXMLElement', LIBXML_NOCDATA))."\r\n------------\r\n"); //处理微信支付返回的xml数据 $data = json_encode(simplexml_load_string($xmldata, 'SimpleXMLElement', LIBXML_NOCDATA)); $sign_return = json_decode($data,true)['sign']; $sign = $this->appgetSign(json_decode($data,true)); //给微信返回接收成功通知,生成xml数据 $this->returnXml(); if($sign == $sign_return){ //把数据提交给订单处理方法 $this->proOrders($data); } } } /* * 格式化参数格式化成url参数 生成签名sign */ public function appgetSign($data){ require_once WEB_LIB."WxPay.Config.php"; $config = new WxPayConfig(); $appwxpay_key = $config->GetKey(); //签名步骤一:按字典序排序参数 ksort($data); $String = $this->callbackToUrlParams($data); //签名步骤二:在string后加入KEY if($appwxpay_key){ $String = $String."&key=".$appwxpay_key; } //签名步骤三:MD5加密 $String = md5($String); //签名步骤四:所有字符转为大写 $result_ = strtoupper($String); return $result_; } /** * 格式化参数格式化成url参数 */ public function callbackToUrlParams($Parameters){ $buff = ""; foreach ($Parameters as $k => $v){ if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; } /** * @param 拼装xml数据返回 * @author yangzl ]> */ public function returnXml(){ header("Content-type:text/xml;"); $xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; $xml .= "\n"; $xml .= "SUCCESS\n"; $xml .= "OK\n"; $xml .= "\n"; echo $xml; } /** * @param 支付回调程序处理 * @author yangzl * @date(20180820) */ public function proOrders($data){ if (!$data) { $date = date("Y-m-d H:i:s",time()); log::write( "proOrders方法错误".$date); } //处理则返回数据入库 分表 $orders_info = json_decode($data,true); $orders_model = new OrdersModel(); $branch_id = json_decode($orders_info['attach'],true)['branch_id']; //查询排重 $result_pay_data = $orders_model->get_pay_data($branch_id,$orders_info['transaction_id']); if(!$result_pay_data){ //不存在 //存数据 $table_id = json_decode($orders_info['attach'],true)['table_id']; //根据tableid查询桌台信息 $tables_model = new TablesModel(); $table_info = $tables_model->get_table_by_id( $table_id, $branch_id); if($table_info['is_delete'] == '0'){ $title = $table_info['title']; } //回调支付信息 $pay_info = array( 'branch_id' => $branch_id, 'transaction_id' => $orders_info['transaction_id'], 'cash_fee' => sprintf("%.2f",$orders_info['cash_fee']/100), 'pay_type' => 1, 'mch_id' =>$orders_info['mch_id'], 'result_code' => $orders_info['result_code'] == 'SUCCESS' ? 1 : 0, 'orders_id' =>$orders_info['out_trade_no'], 'time_end' => $orders_info['time_end'], 'title' => $title, 'openid'=> $orders_info['openid'], 'pay_source' => 1, 'is_subscribe' => $orders_info['is_subscribe'] == 'Y' ? 1 : 0, //是否关注公众账号 'sub_mch_id' => $orders_info['sub_mch_id'], 'total_fee' =>sprintf("%.2f",$orders_info['total_fee']/100), 'bank_type' => $orders_info['bank_type'], ); //存数据 $add_data = $orders_model->add_pay_info($branch_id,$pay_info); if(!$add_data){ log::write( "支付数据存储失败".$orders_info['transaction_id']); return false; } if($orders_info['result_code'] == 'SUCCESS'){ //查询订单信息 // $order_data = $orders_model->get_orders_data($table_id, $branch_id); $order_data = $orders_model->get_orders_tem($table_id, $branch_id); if(!$order_data){ log::write( "查询订单信息失败".time()); return false; } $this->writeLogs(RUNTIME_PATH.'Logs/','proOrders',"\r\n-------------------".date('Y-m-d H:i:s')."查询订单信息---------\r\n---响应数据:".json_encode($order_data)."\r\n------------\r\n"); //数据处理 $data_handle = $orders_model->data_handle($order_data,$table_id,$branch_id,$orders_info['cash_fee']/100,$orders_info['transaction_id']); $this->writeLogs(RUNTIME_PATH.'Logs/','proOrders',"\r\n-------------------".date('Y-m-d H:i:s')."微信支付数据处理结果---------\r\n---响应数据:".json_encode($data_handle)."\r\n------------\r\n"); //支付方式入库 $pay_data = array( 'orders_id' => $data_handle['orders_id'], //订单编号 'branch_id' => (int)$branch_id, // 店铺 ID 'pay_sn' => $orders_info['transaction_id'], // 支付 SN 'pay_total' => sprintf("%.2f",$orders_info['cash_fee']/100), // 支付金额 'pay_type' => 1, // 支付类型 'table_id' => $table_id, // 桌台ID ); //添加副表 $pay_sn = $orders_model->add_orders_pay_sn($pay_data); $pay_state = $data_handle['state']; if($pay_state == 1){ //完成订单 //完成订单后,没有确认的订单也全部清空 add yangzl $del_redis_orders = $orders_model->del_redis_orders_p($branch_id, $table_id); if (!$del_redis_orders){ log::write( "现金订单完成后收尾".$table_id); } //设置状态 $table_model = new TablesModel(); $state = $table_model->set_table_state($table_id, $branch_id, 4); } // 服务员下单一对一推送 $table_base = $table_model->get_table_by_id($table_id,$branch_id); $table_title = $table_base['title']; Push::app_push_waiter_checkout($table_id, $table_title, '1'); exit(); }else{ //支付失败 log::write( "支付订单号数据支付失败::支付订单号".$orders_info['transaction_id']); exit(); } }else{ log::write( "支付订单号数据已处理".$orders_info['transaction_id']); $this->returnXml(); exit(); } } /**********写入日志方法***********/ /** * 日志记录 * @param $path string 日志文件目录 * @param $file string 日志文件名,不包含后缀 * @param $content string 记录内容 * @param @author yangzl * @return void **/ public function writeLogs($path,$file,$content,$more=true){ $newpath = ''; if (!file_exists($path)) { mkdir ($path); @chmod ($path, 0777 ); } if($more){ $newpath .= $path.$file.@date('Y-m-d').".log"; }else{ $newpath .= $path.$file.".log"; } $content .="\r\n"."----------------------------------------------------------------------------------------------------------------"."\r\n"; $this->write_file($newpath,$content,"a+"); } /** * 写内容 * @param $filename string 日志文件名 * @param $data string 记录内容 * @param $method * @author yanzl **/ private function write_file($filename,$data,$method="rb+",$iflock=1){ @touch($filename); $handle=@fopen($filename,$method); if($iflock){ @flock($handle,LOCK_EX); } @fputs($handle,$data); if($method=="rb+") @ftruncate($handle,strlen($data)); @fclose($handle); @chmod($filename,0777); if( is_writable($filename) ){ return 1; }else{ return 0; } } } ?>

php微信回调验证签名,微信支付回调验证签名处理相关推荐

  1. 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态

    微信支付 微信支付开发的整体思路 生成支付二维码 查询支付状态(微信的服务器) 实现订单状态的修改.删除订单 支付状态回查->微信服务器将支付状态返回给支付微服务 MQ处理支付回调状态 Rabb ...

  2. ios支付宝支付失败不回调_iOS 支付宝网页支付回调问题

    今天遇到支付宝网页支付回调的问题 当手机里面没有支付宝客户端的时候,会自动调起网页支付页面,但是我发现我原来写在AppDelegate.m里面的代码没走. 造成的结果是,不管是支付成功,还是退出支付, ...

  3. 网银支付回调 php,企业网银支付回调方法验签是怎么个逻辑?

    最近用php做银行的一个购买服务的功能,用的是银行自己的企业网银接口.现在遇到个问题, 支付成功后,银行那边 还要调我写的一个回调函数,但是我写的这个总是验签失败,谁能给个例子吗? //支付返回界面 ...

  4. PHP微信支付回调接口下单,如何验证微信支付签名 ,处理异步回调(验证的坑)

    在写这之前  看了好多文档,有好多坑在里面,通过多半天的努力终于把验证的问题搞出来了我也不理解微信官网文档写的那么不清晰,一个简单的介绍就能介绍明白,弄一大堆还没写明白,下面直接把我实操的验证贴上,供 ...

  5. 微信,支付宝支付回调的入参处理方法

    微信的支付回调为xml格式.支付宝回调为json格式.返回的格式如何处理 首先看下回调的入参经过处理后长啥样. 微信的支付回调: 支付宝的支付回调: 微信的支付回调处理: StringBuilder ...

  6. google支付回调验证

    原文链接: https://my.oschina.net/lemonzone2010/blog/398736 Google支付问题 20150218,挂机的日本服务器出现google支付被刷单现象,虽 ...

  7. Android之调用微信登陆、分享、支付

    转载:http://blog.csdn.net/lowprofile_coding/article/details/48086381 前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调 ...

  8. 利用内网穿透实现无固定IP调试支付回调

    在家(使用NAT网)开发项目时,难免会涉及到第三方外部接口回调(如:支付回调.微信小程序登录),需要固定IP或域名解析,内网穿透是个不错的选择.常见的内网穿透工具有 向日葵.natapp.网云穿 等. ...

  9. php 微信支付md5签名,微信支付回调验证签名处理

    微信支付回调验证签名:一定要验证签名,可能不造成伪造数据,或者数据库造到灌水: /** * 微信支付回调类 * @name callbackaction.class.php * @author yan ...

  10. php支付回调怎么写_php如何接入微信支付回调接口?PHP如何验证微信支付签名?PHP处理微信支付回调的函数...

    需求:  安卓,ios端集成微信支付,PHPer(我)要提供一个接口给微信调用,(支付完成后调用),若是成功,就返回success,若是失败就返回fail,php 环境说明:thinkphp 框架开发 ...

最新文章

  1. 017-平衡二叉树(三)
  2. 博客搬迁至网易博客 http://happyboy200032.blog.163.com
  3. python英文高频句统计_使用Python 统计高频字数的方法
  4. from server sql 拼接统计两个子查询_[SQL SERVER系列]之嵌套子查询和相关子查询
  5. 自动驾驶路径规划论文解析(4)
  6. 【leetcode】杨辉三角Ⅱ
  7. 为什么很少人写类似金庸的武侠小说
  8. Formtec.NCspeed.v5.1.0.4
  9. 【机器学习】机器学习数据集大全
  10. 音频帧率计算方法(只需要知道 采样率 和 一帧采样数 )
  11. Resolution 归结原理
  12. 小程序向数组中添加数据
  13. pureftpd mysql.conf_Pure-ftpd.conf 配置详解
  14. 在正式使用计算机账务系统的银行对账功能,会计电算化账务处理系统中,银行对账的功能有哪些? 爱问知识人...
  15. html背景图片不完全填充,background-size为100% 100%时背景图填充不完整
  16. 网上购车平台低首付购车噱头的运作模式
  17. 大整数加法【信息学奥赛一本通-1168】
  18. 蚂蚁课堂(每特学院)-2期
  19. 江苏大学计算机技术考研试卷,江苏大学考研历年真题汇总
  20. 质量管理体系之测试用例

热门文章

  1. py获取前端的参数_Python小工具系列(3)之参数检查
  2. android 串口键盘_侧面滑盖+实体全键盘的安卓手机,能走向大众化吗?
  3. 第8.18节 Python类中内置析构方法__del__
  4. python内置函数zip
  5. 【NOIP模拟】矩阵
  6. jQuery实现左移右移
  7. HTML DOM学习
  8. 含有自增序列的表中使用truncate与delete的不同结果
  9. 09、win32 转换为 store app
  10. protobuf 编码实现解析(java)