由於微信支付介面更新,本文件已過期,請檢視新版微信支付教程。地址 http://www.cnblogs.com/txw1958/category/624506.html
本文介紹微信支付中訂單查詢功能的實現。
作者:方倍工作室
地址:http://www.cnblogs.com/txw1958/p/wxpay-order-query.html
一、訂單查詢
因為某一方技術的原因,可能導致商戶在預期時間內都收不到最終支付通知,此時商戶可以通過該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、財付通商戶身仹標識partner(即前文所述的partnerid)、簽名sign,其中sign是對引數字典序排序並使用&聯合起來,最後加上&key=partnerkey(唯一分配),進行md5運算,再轉成全大寫,最終得到sign |
timestamp |
linux時間戳; |
app_signature |
根據支付簽名(paySign)生成方法中所講的簽名方式生成的,參加簽名欄位為:appid、appkey、package、timestamp; |
sign_method |
簽名方法(不計入簽名生成); |
二、實現細節
1. 獲得access token
這個很容易,參考微信公眾平臺開發(26) ACCESS TOKEN
程式碼如下:
1 $appid = "wx0000000000000000"; 2 $appsecret = "e76050733c695748537fc4d4c21d0e2c"; 3 $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret"; 4 $result = https_request($url); 5 $jsoninfo = json_decode($result, true); 6 $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);
完整程式碼如下所示:
1 include_once("WxPayHelper.php"); 2 3 //1. 獲取access token 4 $appid = "wx0000000000000000"; 5 $appsecret = "e76050733ce76050733ce76050733cdd"; 6 $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret"; 7 $result = https_request($url); 8 $jsoninfo = json_decode($result, true); 9 $access_token = $jsoninfo["access_token"]; 10 11 12 //2.準備引數 13 $timestamp = time(); 14 $sign= strtoupper(md5("out_trade_no=JfuKdiBig4zZnE4n&partner=1234567890&key=asdfasdfasdfasdfasdfasdfasdfasdf")); 15 $package = "out_trade_no=JfuKdiBig4zZnE4n&partner=1234567890&sign=".$sign; 16 17 //2.1構造最麻煩的app_signature 18 $obj['appid'] = "wx0000000000000000"; 19 $obj['appkey'] = "8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6kxCRvdJENpWpw8mruTNOGeX8OVUlIYxIyw6k"; 20 $obj['package'] = $package; 21 $obj['timestamp'] = $timestamp; 22 $WxPayHelper = new WxPayHelper(); 23 //get_biz_sign函式受保護,需要先取消一下,否則會報錯 24 $app_signature = $WxPayHelper->get_biz_sign($obj); 25 26 //3. 將構造的json提交給微信伺服器,查詢 27 $jsonmenu = ' 28 { 29 "appid" : "wx0000000000000000", 30 "package" : "'.$package.'", 31 "timestamp" : "'.$timestamp.'", 32 "app_signature" : "'.$app_signature.'", 33 "sign_method" : "sha1" 34 } 35 '; 36 37 $url = "https://api.weixin.qq.com/pay/orderquery?access_token=".$access_token; 38 $result = https_request($url, $jsonmenu); 39 var_dump($result); 40 41 function https_request($url, $data = null){ 42 $curl = curl_init(); 43 curl_setopt($curl, CURLOPT_URL, $url); 44 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 45 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 46 if (!empty($data)){ 47 curl_setopt($curl, CURLOPT_POST, 1); 48 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 49 } 50 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 51 $output = curl_exec($curl); 52 curl_close($curl); 53 return $output; 54 }
三、訂單結果
上述程式執行後,獲得訂單結果如下
{
"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描述出來。
====================================================================
方倍工作室微信公眾平臺賬號關注方法:
1. 微信通訊錄-新增朋友-查詢公眾號-搜尋“方倍工作室”
2. 微信通訊錄-新增朋友-搜號碼-輸入“pondbaystudio”
3. 使用微信掃描下面的二維碼