PS:v2版本支付的回调以及订单的查询都已经写过了,昨天在和别人讨论时,对相关的逻辑做出了较大的修改,回调配合订单查询共同使用,提高安全防护;
小程序端JS代码:

  getData(){var openid = wx.getStorageSync('openid')var userName = wx.getStorageSync('userName')// console.log(openid)wx.request({url: 'http://127.0.0.1:2910/wxPayV2/createOrder/createOrderAction.php',method:'POST',header:{'content-type':'application/x-www-form-urlencoded'},data:{'total_fee':1,'body':'0.38mm.pen','openid':openid,'userName':userName,'goods_id': 1},success(res){var out_trade_no = res.data.out_trade_nowx.requestPayment({nonceStr: res.data.nonceStr,package: res.data.package,paySign: res.data.sign,timeStamp: res.data.timeStamp,signType: 'MD5',success(res){wx.request({url: 'http://127.0.0.1:2910/wxPayV2/queryOrder/queryOrderAction.php',method:'POST',header:{'content-type':'application/x-www-form-urlencoded'},data:{'out_trade_no':out_trade_no},success(res){console.log(res)}})},fail(res){wx.showToast({title: '你取消了支付,支付失败',icon: 'error',duration: 2000})}})}})},

PS:这段JS代码中的userName与openid全都是从缓存中获取,先关操作请前往微信开放文档进行查阅

PHP代码 回调处理代码
callBackAction.php:

<?php
require_once dirname(__FILE__, 3) . '/config/appConfig.php';
require_once dirname(__FILE__, 3) . '/database/connect.php';$getData = file_get_contents('php://input');  //接收微信的回调数据
$content = $getData;
$disposeData = simplexml_load_string($content, null, LIBXML_NOCDATA); //对xml格式数据进行解析$json_data = json_encode($disposeData);  //将数据转换为json格式
$array_data = json_decode($json_data, true); //将json格式数据转换为数组
$sign = $array_data['sign'];   //获取回调数据中的签名unset($array_data['sign']);  //从数组中删除签名
ksort($array_data);  //对数组进行排序
$APIv2 = APIv2;  //获取配置文件中的APIv2密钥
$signBody = '';  //遍历数组,将数组转化为签名数据主体字符串
foreach ($array_data as $key => $val) {$signBody .= "$key=$val&";
}
$signBody .= "key=$APIv2";  //签名数据主体链接APIv2密钥
$signature = strtoupper(MD5($signBody));  //对数据主体进行签名if ($sign != $signature) {die;
}$transaction_id = $array_data['transaction_id'];  //从数组中获取微信订单号
$pay_total_fee = $array_data['cash_fee'];  //现金支付金额
$payTime_data = $array_data['time_end'];   //支付完成时间
$pay_time = date("Y-m-d H:i:s", strtotime($payTime_data));  //将字符串格式的时间转换为时间格式
$out_trade_no = $array_data['out_trade_no'];  //获取商户订单号$connectDatabase = new Connect;
$selectStatusSql = "select * from order_basic_information where out_trade_no = " . $out_trade_no . ";"; //从数据库中查询当前订单的状态
$selectSqlReturn = $connectDatabase->querySql($selectStatusSql);
$selectSqlReturnData = mysqli_fetch_assoc($selectSqlReturn);$returnData = file_get_contents('./returnData.xml');  //获取返回给微信的数据if ($selectSqlReturnData == 2) {echo $returnData;  //状态已经为已支付,无需修改,返回数据给微信接受数据成功
} else {if (isset($array_data['return_code']) && isset($array_data['result_code'])) {  //判断接收的数据中是否含有return_code与result_code$return_code = $array_data['return_code'];  //获取return_code的值$result_code = $array_data['result_code'];  //获取result_code的值if ($result_code == 'SUCCESS' && $return_code == 'SUCCESS') {  //判断return_code与result_code是否都为SUCCESS$sql = 'update order_basic_information set status = 2,transaction_id = "' . $transaction_id . '",pay_total_fee = "' . $pay_total_fee . '",pay_time = "' . $pay_time . '" where out_trade_no = "' . $out_trade_no . '";';$updateOrderStatus = $connectDatabase->querySql($sql);  //将订单状态修改为已支付if ($updateOrderStatus == 1) {echo $returnData;  //修改成功将接收成功的通知返回给微信} else {echo "FAIL";}}}
}

PS:这边是首先对回调返回的结果进行验签操作,验签通过后在数据库中找到这条订单数据,判断该条订单是否是已支付状态,若为待支付再继续对业务结果的判断,继而对数据库相关数据进行修改.

PHP代码 订单查询代码:
queryOrderAction.php

<?php
require_once dirname(__FILE__).'/queryOrder.php';
require_once dirname(__FILE__,3).'/database/connect.php';$out_trade_no = $_POST['out_trade_no'];  //接收订单号$connectDatabase = new Connect;  //从数据库查询该订单的支付状态,如果该支付状态为已支付,那么就无需继续执行下方代码,直接退出
$sql = 'select status from order_basic_information where out_trade_no = "'.$out_trade_no.'";';
$DataResult = $connectDatabase -> querySql($sql);
$getReturnData = mysqli_fetch_assoc($DataResult);
$orderStatus = $getReturnData['status'];if($orderStatus == 2){  //判断该订单是否是已支付订单die;
}$getData = new queryOrder;$nonce_str = $getData -> nonce_str();  //获取随机数$signBody = $getData -> signBody($out_trade_no,$nonce_str);  //获取签名数据主体$signature = $getData -> getSign($signBody);  //获取签名$requestBody = $getData -> requestBody($signature,$signBody);  //获取请求微信查询接口的数据$resultData = $getData -> curlRequest($requestBody);  //访问微信查询接口返回的数据file_put_contents('./getData.json',$resultData."\n\r",FILE_APPEND);  //将返回的数据存入相对应的文件中$array_data = json_decode($resultData,true);  //将获取到的数据转换为数组格式$sign = $array_data['sign'];  //从返回的数据中获取签名值
unset($array_data['sign']);  //将签名值从数组中移除
ksort($array_data);   //将数组重新排序
$getVerifySignBody = $getData -> verifySignBody($array_data);  //获取返回数据验签的数据主体
$signature = strtoupper(MD5($getVerifySignBody));  //对返回数据的主体进行签名
if($sign != $signature){   //判断签名是否一致,若不一致则停止执行代码die;
}if(isset($array_data['return_code']) && isset($array_data['result_code']) && isset($array_data['trade_state'])){$return_code = $array_data['return_code'];  //获取返回结果$result_code = $array_data['result_code'];  //获取业务结果$trade_state = $array_data['trade_state'];  //获取交易状态$transaction_id = $array_data['transaction_id'];  //获取微信支付订单号$pay_total_fee = $array_data['cash_fee'];  //获取现金支付金额$pay_time_data = $array_data['time_end'];  //获取支付时间(string)$pay_time = date('Y-m-d H:i:s',strtotime($pay_time_data));  //将string的支付时间转换为室间隔是if($return_code == 'SUCCESS' && $result_code == 'SUCCESS' && $trade_state == 'SUCCESS'){  //判断是否交易成功,并将相关数据存入数据库$updateSql = 'update order_basic_information set status = 2 , transaction_id = "'.$transaction_id.'" , pay_total_fee = "'.$pay_total_fee.'" , pay_time = "'.$pay_time.'";';$updateReturn = $connectDatabase -> querySql($updateSql);}
}

PS:首先在接受到商户订单号后,直接通过商户订单号在数据库订单表找到相关数据,并对该条订单的状态进行判断,若为已支付则停止代码运行无需进行修改,若为待支付则对微信返回的数据进行验签,眼前通过后在对业务结果进行判断,最后修改数据库相关数据

PHP代码 查询订单代码:
queryOrder.php

<?php
require_once dirname(__FILE__,3).'/config/appConfig.php';
require_once dirname(__FILE__,2).'/createOrder/createOrder.php';class queryOrder
{/*** 获取相关配置*/public function __construct(){$this -> appid = appid;$this -> mch_id = mch_id;$this ->APIv2 = APIv2;}/*** 返回32位随机字符串* @return false|string*/public function nonce_str(){$getData = new createOrder;return $getData -> nonce_str();}/*** 返回参与微信支付订单查询签名的参数主体* @param $out_trade_no :商户订单号* @param $nonce_str :32位随机字符串* @return array*/public function signBody($out_trade_no,$nonce_str): array{$data = array('appid' => $this -> appid,'mch_id' => $this -> mch_id,'out_trade_no' => $out_trade_no,'nonce_str' => $nonce_str,'sign_type' => 'MD5');ksort($data);return $data;}//下面这个方法为临时添加与返回签名之方法有所重复,按照自身需求自行修改即可,删除也可以,对queryOrderAction.php同样需要做出相对应的修改public function verifySignBody($data){$signBody = '';foreach ($data as $key => $val){$signBody .= "$key=$val&";}$signBody .= "key=$this->APIv2";return $signBody;}/*** 返回签名值* @param $data :参与查询订单的签名参数主体* @return string*/public function getSign($data): string{$getBody = '';foreach ($data as $key => $val){$getBody .= "$key=$val&";}$getBody .= "key=$this->APIv2";return strtoupper(MD5($getBody));}/*** 返回请求微信接口的主体数据* @param $sign :签名值* @param $signBody :签名主体数据* @return string*/public function requestBody($sign,$signBody): string{$signature = array('sign' => $sign,);$getData = array_merge($signature,$signBody);$requestData = '<xml>';foreach($getData as $key => $val){$requestData .= "<$key>".$val."</$key>";}$requestData .= '</xml>';return $requestData;}/*** 返回查询订单微信返回的相关数据,并将xml数据转换为JSON数据格式* @param $data* @return false|string*/public function curlRequest($data){$getData = new createOrder;$url = 'https://api.mch.weixin.qq.com/pay/orderquery';$result = $getData -> curlRequest($url,'POST',$data);$disposeData = simplexml_load_string($result,null,LIBXML_NOCDATA);return json_encode($disposeData);}
}

PS:此段代码仅供参考,请各位读者按照自身需求进行修改;


本文由CSDN用户: 缱绻淡蓝海 原创,代码具有时效性,作者会对代码进行不定时的更新.

PHP对微信支付V2版本回调以及订单查询(逻辑重制版)相关推荐

  1. (微信支付签名失败)微信支付v2版本踩坑-二次签名不同类型签名参数key不同

    小伙伴们在做微信支付对接的时候会遇到各种各样的坑,特别是微信支付v2版本,微信支付的二次签名官方文档没有给出明显的签名参数,导致在开发中很容易碰到微信支付的这个坑(微信支付签名失败),app签名key ...

  2. 微信支付V3版本回调+验签流程

    本文主要是接前面2篇微信V3支付参数准备和微信V3支付整合进项目中的后续之微信支付后的回调. 一.回调验签流程介绍 二.核心流程操作 本文主要是接前面2篇微信V3支付参数准备和微信V3支付整合进项目中 ...

  3. 【微信支付】(亲测可用)对接app微信支付V2版本 后端代码示例

    业务场景:基本上做业务的话,也是逃不开对接各种支付接口的,比如数字人民币支付.农行免密支付.支付宝支付.微信支付等等.在着手开发时候,也是遇到不少阻力,微信官方提供的接口文档很散乱,如果之前没接触过, ...

  4. android v2签名 微信,golang实现微信支付v2版本

    一.准备阶段 配置密钥 .获取证书apiclient_key.p12 apiclient_cert.pem apiclient_key.pem 本次示例程序中,使用的是文件 apiclient_cer ...

  5. java微信支付 [统一下单接口] 与 [订单查询接口] 调用成功完整代码与结果

    公司最近要搞微信支付, 之前也没有做过, 但是搞过阿里云, 想来也不是很难. 在网上找了很多贴子, 在eclipse里做了5个测试工程, 没有测试成功, 后来下了微信SDK, 也做了个测试样例, 期间 ...

  6. 2020微信支付v3版本java对接详细流程

    都0202年,我似乎翻遍了百度,都没找到最新版微信支付v3的对接相关的详细博客,我都纳闷了,只有自己摸索.还有就是竟然还有人用一些v3对接的假代码,来骗积分,我真的服了,感同身受,以下是我对接的过程, ...

  7. PHP实现小程序微信支付(v3版本)

    PS:本篇文章是PHP对小程序进行微信支付v3版本的实现,仅用于对支付流程的了解,具体使用方面需要大家自行调整 小程序端JS代码: getPrepayID(){var that = thiswx.ge ...

  8. Java对接第三方支付渠道之微信支付APIV3版本

    提示:微信支付APIV3版本对接流程梳理,目前微信支付提供APIV3和APIV2两个版本,简而言之,V3版本的安全性比V2更高. Java对接第三方支付渠道之微信支付APIV3版本 一.接入指引 1. ...

  9. 微信支付V3版本的 签名生成,验签,解密,统一下单的简单封装

    微信支付 V3版本的 签名生成,验签,解密,统一下单的简单封装 V3Base 获取平台证书 回调报文解密 统一下单 暂时看了文档只完成了这部分,感觉封装的不是特别完美,希望有大佬指点一下,想着封装好一 ...

最新文章

  1. 硬件Pythia:将现实世界桥接到区块链
  2. 关于无法显示-隐藏文件、文件夹以及操作系统文件夹
  3. java lambda使用_Java 8 Lambda表达式的使用
  4. AOP的两种实现方式
  5. 知乎嵌入式大杂烩:学习STM32的一点经验分享
  6. leetcode 1339. Maximum Product of Splitted Binary Tree | 1339. 分裂二叉树的最大乘积(树形dp)
  7. 发动机冒黑烟_挖掘机冒黑烟,是怎么回事?
  8. 机器学习梯度下降举例_举例说明:机器学习
  9. 操作无法完成因为其中的文件夹或文件已在另一个程序中打开
  10. html5商城后台源码,商城后台管理系统HTML+css+jquery
  11. 变压器高低压侧的电流计算
  12. Vue-Layout(可视化布局)
  13. 时区缩写与UTC(GMT)时差对照表
  14. SSM项目使用ConfigTools对数据库的密码进行加密
  15. 服务器ghost备份后无法进入系统还原,一键Ghost备份还原解决方法
  16. aptana手动配置python环境_关于使用Aptana+Pydev构建Python开发环境(Django)
  17. 坑爹的No matching method
  18. server 服务器文档,服务器文档,server document,音标,读音,翻译,英文例句,英语词典...
  19. 排球-五一跑位(转)
  20. 【元器件学习笔记—电阻】(6)——电阻并联电路

热门文章

  1. 当用户属于超过16个组时,无法读取或写入NFS或Samba共享
  2. 迷宫城堡 HDU - 1269 (塔尖算法求强连通分量)
  3. 2021年起重机司机(限桥式起重机)最新解析及起重机司机(限桥式起重机)模拟考试
  4. pmp直方图与帕累托图的区别_pmp考试必知的十个图和表
  5. uva 11795 - Mega Man's Mission 洛克人的难题 基础集合动态规划
  6. ERP生产作业控制 金蝶
  7. Seo界神话 360好搜
  8. 如何在word里面插入代码块?
  9. spark:计算LTV3
  10. 【echarts】柱图+折线图