在微信App支付(一)里,app端已经调起微信支付,微信会通过我们签名时提交的回调接口返回支付信息。
以下为回调接口代码:
/**
* 微信支付回调
*
* @param
* @param
* @param
* @param
* @return
*/
@RequestMapping("backtracks")
@ResponseBody
public void weixinNotifyUrl(HttpServletRequest request, HttpServletResponse response) {
try {
BufferedReader reader = request.getReader();
String line = "";
StringBuffer inputString = new StringBuffer();
PrintWriter writer = response.getWriter();
while ((line = reader.readLine()) != null) {
inputString.append(line);
}
if (reader != null) {
reader.close();
}
System.out.println("----[微信回调]接收到的报文---" + inputString.toString());
if (!StringUtils.isEmpty(inputString.toString())) {
// WXPayResult wxPayResult =
// JdomParseXmlUtils.getWXPayResult(inputString.toString());
Map<String, String> map1 = new HashMap<String, String>();
map1 = ParseXMLUtils.jdomParseXml(inputString.toString());
if ("SUCCESS".equalsIgnoreCase(map1.get("return_code"))) {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("appid", map1.get("appid"));
//parameters.put("attach", map1.get("attach"));
parameters.put("bank_type", map1.get("bank_type"));
parameters.put("cash_fee", map1.get("cash_fee"));
parameters.put("fee_type", map1.get("fee_type"));
parameters.put("is_subscribe", map1.get("is_subscribe"));
parameters.put("mch_id", map1.get("mch_id"));
parameters.put("nonce_str", map1.get("nonce_str"));
parameters.put("openid", map1.get("openid"));
parameters.put("out_trade_no", map1.get("out_trade_no"));
parameters.put("result_code", map1.get("result_code"));
parameters.put("return_code", map1.get("return_code"));
parameters.put("time_end", map1.get("time_end"));
parameters.put("total_fee", map1.get("total_fee"));
parameters.put("trade_type", map1.get("trade_type"));
parameters.put("transaction_id", map1.get("transaction_id"));
String sign = map1.get("sign");
String out_trade_no = map1.get("out_trade_no");
String total_amount = map1.get("total_fee");
String time_end = map1.get("time_end");
String return_code = weixinBack.urlBack(parameters, out_trade_no, total_amount, time_end, sign);
String return_msg = return_code.equals("SUCCESS") ? "OK" : "验签失败";
writer.write(HttpXmlUtils.backWeixin(return_code, return_msg));
} else {
writer.write(HttpXmlUtils.backWeixin("FAIL", "验签失败"));
}
} else {
writer.write(HttpXmlUtils.backWeixin("FAIL", "验签失败"));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String return_code = weixinBack.urlBack(parameters, out_trade_no, total_amount, time_end, sign);
weixinBack这个接口里面主要是验证签名和业务逻辑,验证签名只需要把微信传回来的参数按照之前签名方法签名和微信返回的sign进行比对就可以了。签名正确后,执行业务逻辑,然后返回给微信是否成功。
/**返回给微信的消息
*
* @param return_code
* @param return_msg
* @param output
* @return
*/
/*<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>*/
public static String backWeixin(String return_code, String return_msg) {
StringBuffer bf = new StringBuffer();
bf.append("<xml>");
bf.append("<return_code><![CDATA[");
bf.append(return_code);
bf.append("]]></return_code>");
bf.append("<return_msg><![CDATA[");
bf.append(return_msg);
bf.append("]]></return_msg>");
bf.append("</xml>");
return bf.toString();
}