PHP实现对小程序微信支付v2订单的结果查询

本文介绍了如何使用PHP实现对小程序微信支付订单的结果查询。通过商户订单号(out_trade_no)或微信支付订单号(transaction_id)进行查询,适用于按需定制。提供PHP相关类的代码示例,适合开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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用户:缱绻淡蓝海 原创,代码具有时效性,作者会不定时进行更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值