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',"rn-------------------".date('Y-m-d H:i:s')."微信支付回调结果---------rn---响应数据:".json_encode(simplexml_load_string($xmldata, 'SimpleXMLElement', LIBXML_NOCDATA))."rn------------rn");

//处理微信支付返回的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 .= "SUCCESSn";

$xml .= "OKn";

$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',"rn-------------------".date('Y-m-d H:i:s')."查询订单信息---------rn---响应数据:".json_encode($order_data)."rn------------rn");

//数据处理

$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',"rn-------------------".date('Y-m-d H:i:s')."微信支付数据处理结果---------rn---响应数据:".json_encode($data_handle)."rn------------rn");

//支付方式入库

$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 .="rn"."----------------------------------------------------------------------------------------------------------------"."rn";

$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;

}

}

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值