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


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 相关文章推荐
php中常用编辑器推荐
Jan 02 PHP
PHP XML数据解析代码
May 26 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
解析PHP中一些可能会被忽略的问题
Jun 21 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
PHP面向对象精要总结
Nov 07 PHP
PHP中if和or运行效率对比
Dec 12 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
Jul 02 PHP
PHP中配置IIS7实现基本身份验证的方法
Sep 24 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
PHP与Web页面的交互示例详解一
Aug 04 PHP
php实例化对象的实例方法
Nov 17 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
jquery 学习笔记一
2010/04/07 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
2016/11/28 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
js数据类型检测总结
2018/08/05 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
Python断言assert的用法代码解析
2018/02/03 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
python的依赖管理的实现
2019/05/14 Python
Django中create和save方法的不同
2019/08/13 Python
对Django中内置的User模型实例详解
2019/08/16 Python
numpy.array 操作使用简单总结
2019/11/08 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
pytorch实现查看当前学习率
2020/06/24 Python
中医学专业自荐信范文
2014/04/01 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL
Hive日期格式转换方法总结
2022/06/25 数据库