微信支付开发订单查询实例


Posted in PHP onJuly 12, 2016

因为某一方技术的原因,可能导致商户在预期时间内都收不到最终支付通知,此时商户可以通过该API来查询订单的详细支付状态。

订单查询API的URL为:

https://api.weixin.qq.com/pay/orderquery?access_token=xxxxxx

URL中的参数只包含目前微信公众平台凭证access_token,而订单查询的真正数据是放在PostData中的,格式如下:

{
    "appid" : "wwwwb4f85f3a797777",
    "package" : "out_trade_no=11122&partner=1900090055&sign=4e8d0df3da0c3d0df38f",
    "timestamp" : "1369745073",
    "app_signature" : "53cca9d47b883bd4a5c85a9300df3da0cb48565c",
    "sign_method" : "sha1"
}

上述内容参数说明如表所示。

参数 说明
appid 公众平台账户的AppId;
package 查询订单的关键信息数据,包含第三方唯一订单号out_trade_no、财付通商户身?П晔?artner(即前文所述的partnerid)、签名sign,其中sign是对参数字典序排序并使用&联合起来,最后加上&key=partnerkey(唯一分配),进行md5运算,再转成全大写,最终得到sign
timestamp linux时间戳;
app_signature 根据支付签名(paySign)生成方法中所讲的签名方式生成的,参加签名字段为:appid、appkey、package、timestamp;
sign_method 签名方法(不计入签名生成);

 二、实现细节

1. 获得access token

这个很容易,参考微信公众平台开发(26) ACCESS TOKEN

代码如下:

$appid = "wx0000000000000000";
$appsecret = "e76050733c695748537fc4d4c21d0e2c";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
$result = https_request($url);
$jsoninfo = json_decode($result, true);
$access_token = $jsoninfo["access_token"];

2. 参数生成

appid: 直接赋值

timestamp:程序直接获取

$timestamp = time();

 sign_method:这里为sha1

 难点1:package 值的获得

 先要获得sign

 sign是out_trade_no,partner,key(partnerkey)三项信息的字典序排序,再MD5运算,再转为大写

$sign= strtoupper(md5("out_trade_no=JfuKdiBig4zZnE4n&partner=1234567890&key=ebf5cf381de2d716d432bfda34fa9e57"));

 package 是查询订单的关键信息数据,包含第三方唯一订单号 out_trade_no、财付通商户身?П晔 partner(即前文所述的 partnerid) 、签名 sign

$package = "out_trade_no=JfuKdiBig4zZnE4n&partner=1234567890&sign=".$sign;

难点2:获得app_signature

app_signature 依然是根据支付签名(paySign)生成方法中所讲的签名方式生成的,参加签名字段为:appid、appkey、package、timestamp;

$obj['appid']   = "wx0000000000000000";
$obj['appkey']   = "8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6k";
$obj['package']  = $package;
$obj['timestamp']  = $timestamp;
$WxPayHelper->get_biz_sign($obj);

这样各项参数都获得了

3.提交查询

$jsonmenu = '
{
 "appid" : "wx0000000000000000",
 "package" : "'.$package.'",
 "timestamp" : "'.$timestamp.'",
 "app_signature" : "'.$app_signature.'",
 "sign_method" : "sha1"
}
';

$url = "https://api.weixin.qq.com/pay/orderquery?access_token=".$access_token;
$result = https_request($url, $jsonmenu);
var_dump($result);

完整代码如下所示:

include_once("WxPayHelper.php");

//1. 获取access token
$appid = "wx0000000000000000";
$appsecret = "e76050733ce76050733ce76050733cdd";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
$result = https_request($url);
$jsoninfo = json_decode($result, true);
$access_token = $jsoninfo["access_token"];


//2.准备参数
$timestamp = time();
$sign= strtoupper(md5("out_trade_no=JfuKdiBig4zZnE4n&partner=1234567890&key=asdfasdfasdfasdfasdfasdfasdfasdf"));
$package = "out_trade_no=JfuKdiBig4zZnE4n&partner=1234567890&sign=".$sign;

//2.1构造最麻烦的app_signature
$obj['appid']   = "wx0000000000000000";
$obj['appkey']   = "8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6k";
$obj['package']  = $package;
$obj['timestamp']  = $timestamp;
$WxPayHelper = new WxPayHelper();
//get_biz_sign函数受保护,需要先取消一下,否则会报错
$app_signature = $WxPayHelper->get_biz_sign($obj);

//3. 将构造的json提交给微信服务器,查询
$jsonmenu = '
{
 "appid" : "wx0000000000000000",
 "package" : "'.$package.'",
 "timestamp" : "'.$timestamp.'",
 "app_signature" : "'.$app_signature.'",
 "sign_method" : "sha1"
}
';

$url = "https://api.weixin.qq.com/pay/orderquery?access_token=".$access_token;
$result = https_request($url, $jsonmenu);
var_dump($result);

function https_request($url, $data = null){
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_URL, $url);
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
 if (!empty($data)){
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
 }
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 $output = curl_exec($curl);
 curl_close($curl);
 return $output;
}

三、订单结果

上述程序执行后,获得订单结果如下

{
 "errcode": 0,
 "errmsg": "ok",
 "order_info": {
  "ret_code": 0,
  "ret_msg": "",
  "input_charset": "GBK",
  "trade_state": "0",
  "trade_mode": "1",
  "partner": "1234567890",
  "bank_type": "CMB_FP",
  "bank_billno": "201405273540085997",
  "total_fee": "1",
  "fee_type": "1",
  "transaction_id": "1218614901201405273313473135",
  "out_trade_no": "JfuKdiBig4zZnE4n",
  "is_split": "false",
  "is_refund": "false",
  "attach": "",
  "time_end": "20140527194139",
  "transport_fee": "0",
  "product_fee": "1",
  "discount": "0",
  "rmb_total_fee": ""
 }
}

各个字段的含义如表所示

参数 说明
ret_code 查询结果状态码,0表明成功,其他表明错误;
ret_msg 查询结果出错信息;
input_charset 返回信息中的编码方式;
trade_state 订单状态,0为成功,其他为失败;
trade_mode 交易模式,1为即时到帐,其他保留;
partner 财付通商户号,即前文的partnerid;
bank_type 银行类型;
bank_billno 银行订单号;
total_fee 总金额,单位为分;
fee_type 币种,1为人民币;
transaction_id 财付通订单号;
out_trade_no 第三方订单号;
is_split 是否分账,false为无分账,true为有分账;
is_refund 是否退款,false为无退款,ture为退款;
attach 商户数据包,即生成订单package时商户填入的attach;
time_end 支付完成时间;
transport_fee 物流费用,单位为分;
product_fee 物品费用,单位为分;
discount 折扣价格,单位为分;
rmb_total_fee 换算成人民币之后的总金额,单位为分,一般看total_fee即可。

如果程序有误,会在errcode和errmsg描述出来。

以上就是对微信支付开发中查询功能的资料整理,希望能帮到微信开发支付的朋友。

PHP 相关文章推荐
相对路径转化成绝对路径
Apr 10 PHP
PHP生成带有雪花背景的验证码
Sep 28 PHP
php中jQuery插件autocomplate的简单使用笔记
Jun 14 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
php实现Session存储到Redis
Nov 11 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
Jun 11 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
php接口实现拖拽排序功能
Apr 23 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
Jul 12 #PHP
PHP简单实现DES加密解密的方法
Jul 12 #PHP
微信支付开发交易通知实例
Jul 12 #PHP
php实现的debug log日志操作类实例
Jul 12 #PHP
PHP数据库表操作的封装类及用法实例详解
Jul 12 #PHP
WordPress过滤垃圾评论的几种主要方法小结
Jul 11 #PHP
php处理带有中文URL的方法
Jul 11 #PHP
You might like
php实现点击可刷新验证码
2015/11/07 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
VBScript版代码高亮
2006/06/26 Javascript
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
js 操作select相关方法函数
2009/12/06 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
sqlalchemy对象转dict的示例
2014/04/22 Python
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
浅谈Django REST Framework限速
2017/12/12 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
python实现淘宝购物系统
2019/10/25 Python
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
经贸专业毕业生求职信范文
2014/05/01 职场文书
2014高考励志标语
2014/06/05 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
Golang入门之计时器
2022/05/04 Golang