微信支付開發(5) 訂單查詢


由於微信支付接口更新,本文檔已過期,請查看新版微信支付教程。地址 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. 使用微信掃描下面的二維碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM