/**
* 该链接是通过【统一下单API】中提交的参数notify_url设置,如果链接无法访问,商户将无法接收到微信通知。
* 通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
*
* 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
* 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。
* (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
* 注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
* 推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
* 特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。
*
* @throws Exception
*
* @throws Exception
*
* @throws Exception
*/
public String PaySult() throws Exception {
String resXml = "";
Map<String, String> backxml = new HashMap<String, String>();
InputStream inStream;
try {
inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
logger.error("微信支付----付款成功----");
outSteam.close();
inStream.close();
String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息
logger.error("微信支付----result----=" + result);
Map<Object, Object> map = Xmlunit.xml2map(result, false);
if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {
logger.error("微信支付----返回成功");
if (verifyWeixinNotify(map)) {
// 订单处理 操作 orderconroller 的回写操作?
logger.error("微信支付----验证签名成功");
// backxml.put("return_code", "<![CDATA[SUCCESS]]>");
// backxml.put("return_msg", "<![CDATA[OK]]>");
// // 告诉微信服务器,我收到信息了,不要在调用回调action了
// strbackxml = pay.ArrayToXml(backxml);
// response.getWriter().write(strbackxml);
// logger.error("微信支付 ~~~~~~~~~~~~~~~~执行完毕?backxml=" +
// strbackxml);
// ====================================================================
// 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
// 处理业务 -修改订单支付状态
logger.error("微信支付回调:修改的订单=" + map.get("out_trade_no"));
int editres = Wechat_Order.execute("UPDATE wechat_order SET paystatus =? WHERE orderno=?",
new Object[] { EnumPayStatus.Paybackok.getValue(), map.get("out_trade_no") });
if (editres > 0) {
logger.error("微信支付回调:修改订单支付状态成功");
} else {
logger.error("微信支付回调:修改订单支付状态失败");
}
}
// ------------------------------
// 处理业务完毕
// ------------------------------
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
}
// else {
// logger.info("支付失败,错误信息:" + map.get("err_code"));
// resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
// + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
// }
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error("支付回调发布异常:" + e);
e.printStackTrace();
}
return resXml;
}
/**
* 验证签名
*
* @param map
* @return
*/
public boolean verifyWeixinNotify(Map<Object, Object> map) {
SortedMap<String, String> parameterMap = new TreeMap<String, String>();
String sign = (String) map.get("sign");
for (Object keyValue : map.keySet()) {
if (!keyValue.toString().equals("sign")) {
parameterMap.put(keyValue.toString(), map.get(keyValue).toString());
}
}
String createSign = pay.getSign(parameterMap);
if (createSign.equals(sign)) {
return true;
} else {
logger.error("微信支付 ~~~~~~~~~~~~~~~~验证签名失败");
return false;
}
}
微信支付一 :公众号支付2 notify_url 回调
最新推荐文章于 2024-07-26 00:17:24 发布