官方文檔
該接口提供所有微信支付訂單的查詢,商戶可以通過查詢訂單接口主動查詢訂單狀态,完成下一步的業務邏輯。
一、應用場景
- 當商戶背景、網絡、伺服器等出現異常,商戶系統最終未接收到支付通知
- 調用支付接口後,傳回系統錯誤或未知交易狀态情況
- 調用刷卡支付API,傳回USERPAYING的狀态
- 調用關單或撤銷接口API之前,需确認支付狀态
二、接口位址
https://api.mch.weixin.qq.com/pay/orderquery
三、請求參數
可以根據微信訂單号(優先使用)或者商戶訂單号進行查詢
package com.phil.wechatpay.model.rep;
import java.io.Serializable;
/**
* 查詢訂單請求參數(正常XML)
* @author phil
* @date 2017年7月25日
*
*/
public class OrderQueryParams extends AbstractPayParams implements Serializable{
/**
*
*/
private static final long serialVersionUID = -168458096490563992L;
private String transaction_id; //微信訂單号,優先
private String out_trade_no; //商戶訂單号 二選一
public String getTransaction_id() {
return transaction_id;
}
public void setTransaction_id(String transaction_id) {
this.transaction_id = transaction_id;
}
public String getOut_trade_no() {
return out_trade_no;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
}
}
四、傳回結果
自己酌情封裝
package com.phil.wechatpay.model.resp;
import java.io.Serializable;
import com.phil.common.annotation.NotRequire;
/**
* 查詢訂單傳回參數(帶<![CDATA[]]>XML格式)
*
* @author phil
* @date 2017年7月25日
*
*/
public class OrderQueryResult extends AbstractPayResult implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1996103742747816922L;
private String return_code; // 傳回狀态碼SUCCESS/FAIL
@NotRequire
private String err_code;// 錯誤傳回的資訊描述
@NotRequire
private String err_code_des;// 錯誤傳回的資訊描述
/**** return_code 、result_code、trade_state ***為SUCCESS ****/
.....
}
五、查詢訂單
package com.phil.wechatpay.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.phil.common.config.WechatConfig;
import com.phil.common.util.HttpReqUtil;
import com.phil.common.util.PayUtil;
import com.phil.common.util.SignatureUtil;
import com.phil.common.util.XmlUtil;
import com.phil.wechatpay.model.rep.OrderQueryParams;
import com.phil.wechatpay.model.resp.OrderQueryResult;
import com.phil.wechatpay.service.WechatPayService;
/**
* 查詢訂單
* @author phil
* @date 2017年7月25日
*
*/
@Controller
@RequestMapping("/wxpay/")
public class WechatPayOrderQueryController {
@Autowired
private WechatPayService wechatPayService;
@ResponseBody
@RequestMapping("orderQuery")
public OrderQueryResult orderQuery(HttpServletRequest request, HttpServletResponse response) throws Exception {
OrderQueryResult orderQueryResult = null;
OrderQueryParams orderQueryParams = new OrderQueryParams();
orderQueryParams.setAppid(WechatConfig.APP_ID);
orderQueryParams.setMch_id(WechatConfig.MCH_ID);
orderQueryParams.setNonce_str(PayUtil.createNonceStr());
orderQueryParams.setTransaction_id(""); //二者選其一,推薦transaction_id
//orderQueryParams.setOut_trade_no("");
//請求的xml
String orderQueryXml = wechatPayService.abstractPayToXml(orderQueryParams);//簽名合并到service
// 傳回<![CDATA[SUCCESS]]>格式的XML
String orderQueryResultXmL = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD,WechatConfig.ORDER_QUERY_URL, null, orderQueryXml);
// 進行簽名校驗
if (SignatureUtil.checkIsSignValidFromWeiXin(orderQueryResultXmL)) {
orderQueryResult = XmlUtil.getObjectFromXML(orderQueryResultXmL, OrderQueryResult.class);
}
return orderQueryResult;
}
}