微信支付一 :公众号支付2 notify

    xiaoxiao2021-12-14  20

    /** * 该链接是通过【统一下单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; } }
    转载请注明原文地址: https://ju.6miu.com/read-962882.html

    最新回复(0)