PS:本篇文章用于获取微信支付订单的查询,代码中使用的是out_trade_no:商户订单号来进行查询,可以直接将文中的out_trade_no替换为transaction_id微信支付订单号来进行查询,按照个人需求来就行,代码如下
小程序端js代码:
getData(){
wx.request({
url: 'http://127.0.0.1:2908/wxPayV2/queryOrder/actionQuery.php',
method:'GET',
header:{
'content_type':'application/json'
},
data:{
'out_trade_no':'此处写你的商户订单号' //如果写微信订单号记得将后面改为transaction_id
},
success(res){
console.log(res)
}
})
}
PHP相关的类的代码:
<?php
require_once ('../../config/appConfig.php');
class queryOrder{
public $appid;
public $mch_id;
public $APIv2;
/**
* 获取基本配置相关信息
*/
public function __construct(){
$appid = appid;
$mch_id = mchID;
$APIv2 = APIv2;
$this -> appid = $appid;
$this -> mch_id = $mch_id;
$this -> APIv2 = $APIv2;
}
/**
* @return string :返回32位随机字符串
*/
public function get_nonce_str(): string //此处可以写的更复杂些,为了篇幅我简单写一下
{
$body = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$disposeData = str_shuffle($body);
return substr($disposeData,0,32);
}
/**
* 获取查询订单所需要的签名
* @param $out_trade_no :微信支付订单号
* @param $nonce_str :随机字符串
* @return string
*/
public function getQuerySign($out_trade_no,$nonce_str): string
{
$signBody = array(
'appid' => $this -> appid,
'mch_id' => $this -> mch_id,
'out_trade_no' => $out_trade_no,
'nonce_str' => $nonce_str,
'sign_type' => 'MD5'
);
ksort($signBody);
$stringSignBody = http_build_query($signBody);
$resultSignBody = $stringSignBody.'&key='.$this -> APIv2;
$sign = strtoupper(MD5($resultSignBody));
return $sign;
}
/**
* 获取查询订单所需要的请求数据
* @return false|string :返回查询订单所需要的xml格式数据
* @throws DOMException
*/
public function queryOrderBody($out_trade_no,$nonce_str,$sign){
$requestData = new DOMDocument;
$requestData -> formatOutput = true;
$xml = $requestData-> createElement('xml');
$appid = $requestData -> createElement('appid',$this -> appid);
$mch_id = $requestData -> createElement('mch_id',$this -> mch_id);
$out_trade_no = $requestData -> createElement('out_trade_no',$out_trade_no);
$nonce_str = $requestData -> createElement('nonce_str',$nonce_str);
$sign = $requestData -> createElement('sign',$sign);
$sign_type = $requestData -> createElement('sign_type','MD5');
$requestData -> appendChild($xml);
$xml -> appendChild($appid);
$xml -> appendChild($mch_id);
$xml -> appendChild($out_trade_no);
$xml -> appendChild($nonce_str);
$xml -> appendChild($sign);
$xml -> appendChild($sign_type);
$requestData -> save('./queryOrderBody.xml');
return $requestData -> saveXML();
}
/**
* curl请求接口
* @return bool|string
*/
public function curlRequest($data){
$url = 'https://api.mch.weixin.qq.com/pay/orderquery';
$getData = curl_init();
curl_setopt($getData,CURLOPT_URL,$url);
curl_setopt($getData,CURLOPT_RETURNTRANSFER,1);
curl_setopt($getData,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($getData,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($getData,CURLOPT_POST,1);
curl_setopt($getData,CURLOPT_POSTFIELDS,$data);
curl_setopt($getData,CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($getData,CURLOPT_HEADER,0);
$result = curl_exec($getData);
curl_close($getData);
return $result;
}
}
PHP类的方法调用
<?php
/*
* 本PHP文件通过访问https://api.mch.weixin.qq.com/pay/orderquery,提交out_trade_no商户订单号来对订单状态进行查询
*/
require_once ('./queryOrder.php'); //读取queryOrder类中的方法
$out_trade_no = $_GET['out_trade_no']; //接受由前端传来的out_trade_no商户订单参数
$getData = new queryOrder;
$nonce_str = $getData -> get_nonce_str(); //获取32位随机字符串
$sign = $getData -> getQuerySign($out_trade_no,$nonce_str); //获取请求参数中所需要的签名
//echo $sign;
$queryOrderBody = $getData -> queryOrderBody($out_trade_no,$nonce_str,$sign); //获取请求数据,即xml格式数据
$data = file_get_contents('./queryOrderBody.xml'); //将xml格式请求数据存入变量
$result = $getData -> curlRequest($data); //使用curl对接口https://api.mch.weixin.qq.com/pay/orderquery进行访问
file_put_contents('./resultQueryOrder.xml',$result); //将返回的数据存入文件resultQueryOrder.xml
$getResultData = file_get_contents('./resultQueryOrder.xml'); //将返回的xml格式数据存入变量
$disposeResultData = simpleXML_load_string($getResultData,null,LIBXML_NOCDATA); //将xml格式数据解析为对象
$json_data = json_encode($disposeResultData); //将解析的对象转换为json格式数据
$array_data = json_decode($json_data,true); //将json格式数据转换为数组
//官方文档中只有result_code,return_code与trade_state都为SUCCESS时,表示用户支付成功
$result_code = $array_data['result_code'];//获取返回数据中的result_code
$return_code = $array_data['return_code'];//获取返回数据中的return_code
$trade_state = $array_data['trade_state'];//获取返回数据钟的trade_state
//从此处开始后面的逻辑按照个人需求来写
//判断用户是否支付
if($return_code == 'SUCCESS' && $result_code == 'SUCCESS' && $trade_state == 'SUCCESS'){
$resultStatus = '用户该订单已支付';
}else{
$resultStatus = '用户该订单未支付';
}
echo $resultStatus;
本篇文章由CSDN用户:缱绻淡蓝海 原创,代码具有时效性,作者会不定时进行更新