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


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&&mysql)六
Oct 09 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
PHP实现GIF图片验证码
Nov 04 PHP
Zend Framework连接Mysql数据库实例分析
Mar 19 PHP
php判断用户是否关注微信公众号
Jul 22 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
Sep 14 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 PHP
PDO::inTransaction讲解
Jan 28 PHP
Swoole实现异步投递task任务案例详解
Apr 02 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
laravel 解决crontab不执行的问题
Oct 22 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中英混合字符串截取函数代码
2011/07/17 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
python基础教程之获取本机ip数据包示例
2014/02/10 Python
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
微信跳一跳游戏python脚本
2020/04/01 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
关于责任的演讲稿
2014/05/20 职场文书
个人租房协议书
2014/11/28 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python
python使用BeautifulSoup 解析HTML
2022/04/24 Python
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android