天天看點

Java微信支付開發之查詢訂單

官方文檔

該接口提供所有微信支付訂單的查詢,商戶可以通過查詢訂單接口主動查詢訂單狀态,完成下一步的業務邏輯。

一、應用場景

  • 當商戶背景、網絡、伺服器等出現異常,商戶系統最終未接收到支付通知
  •  調用支付接口後,傳回系統錯誤或未知交易狀态情況
  •  調用刷卡支付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;
	}
}           

繼續閱讀