如果你已经可以微信支付成功,那么你已经成功90%,剩下的就是订单确认问题了。
接上一篇文章,今天我们来谈一谈,订单查询与确认:
APP端支付成功之后,会再次向服务端发起请求,确认付款订单时候成功,同时服务端也要根据订单号更新数据库,确保前后端一直性。
服务端收到APP端发送的请求后,回获取到APP端传递过来的订单号,拿到订单号后,同样的方式,拼接xml格式的字符串,发送微信端,查询订单信息,比如付款是否成功,付款金额,订单详情等等。
/调用微信接口,查询订单是否支付成功
public Map<String, String> queryOrder(String out_trade_no){
log.debug("WeChatPayController.queryOrder,parameter[{out_trade_no},{"+out_trade_no+"}]");
Map<String, String> mapVal = new HashMap<String, String>();
try {
//商户相关资料
String appid = CommonUtils.getPropertiesValue("config", "appid");
String appsecret = CommonUtils.getPropertiesValue("config", "appsecret");
String partner = CommonUtils.getPropertiesValue("config", "partnerId");
String partnerkey = CommonUtils.getPropertiesValue("config", "partnerkey");
//商户号
String mch_id = partner;
//随机数
Random random = new Random();
String nonce_str = cn.emagsoftware.utils.MD5Util.getMD5String(String.valueOf(random.nextInt(10000)));
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("appid", appid);
packageParams.put("mch_id", mch_id);
packageParams.put("nonce_str", nonce_str);
packageParams.put("out_trade_no", out_trade_no);
HttpServletResponse httpServletResponse = null;
RequestHandler reqHandler = new RequestHandler(request, httpServletResponse);
reqHandler.init(appid, appsecret, partnerkey);
String sign = reqHandler.createSign(packageParams);
String xml="<xml>"+
"<appid>"+appid+"</appid>"+
"<mch_id>"+mch_id+"</mch_id>"+
"<nonce_str>"+nonce_str+"</nonce_str>"+
"<out_trade_no>"+out_trade_no+"</out_trade_no>"+
"<sign>"+sign+"</sign>"+
"</xml>";
log.debug("xml = "+xml);
String queryOrderURL = WECHAT_QUERY_ORDER_URL;
String trade_state=""; //交易状态
String total_fee = ""; //总金额
trade_state = new GetWxOrderno().getPayNo(queryOrderURL, xml, "trade_state");
if (trade_state.equals("SUCCESS")) {
total_fee = new GetWxOrderno().getPayNo(queryOrderURL, xml, "total_fee");
mapVal.put("trade_state", trade_state);
mapVal.put("total_fee", total_fee);
}else {
mapVal.put("trade_state", trade_state);
}
} catch (Exception e1) {
e1.printStackTrace();
}
return mapVal;
}
查询订单之后,微信会返回一个xml文件,如果查询订单成功,可以从xml文件中获取到订单金额,支付状态,付款银行等信息,比较订单金额,更新数据库,操作完成后,返回前端APP,告知付款成功。
签名生成规则代码:
/**
* 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
*/
public String createSign(SortedMap<String, String> packageParams) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + this.getKey());
System.out.println("md5 sb:" + sb+" key="+this.getKey());
String sign = MD5Util.getMD5String(sb.toString()).toUpperCase();
System.out.println("packge签名:" + sign);
return sign;
}