java 微信支付成功后一直重复执行回调函数

Tokyo_not_too_hot 2017-07-31 11:13:40
java 微信支付成功后一直重复执行回调函数 代码如下 回调函数已经进来了我也是按照微信文档发了报文出去 结果一直重复回调 是我写的代码有问题吗


@RequestMapping("/backResponse.do")
public void backResponse(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
LogUtil.writeLog("BackRcvResponse接收后台通知开始");
// 获取微信通知服务器发送的后台通知参数
//读取参数
InputStream inputStream ;
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
String s ;
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
while ((s = in.readLine()) != null){
sb.append(s);
}
in.close();
inputStream.close();



Map<String, String> valideData = WXPayUtil.xmlToMap(sb.toString());
Map<String,String> map=new HashMap<>();
//重要!验证签名前不要修改reqParam中的键值对的内容,否则会验签不过
if (!WXPayUtil.isSignatureValid(sb.toString(), config.getKey())) {
LogUtil.writeLog("验证签名结果[失败].");
//验签失败,需解决验签问题
} else {
LogUtil.writeLog("验证签名结果[成功].");
//【注:为了安全验签成功才应该写商户的成功处理逻辑】交易成功,更新商户订单状态

MoneyRespValue value=new MoneyRespValue();
value.firm_id = Long.parseLong(valideData.get("mch_id").toString());
value.sign_code = "000000";
value.b_money = new BigDecimal(Double.valueOf(valideData.get("total_fee").toString())/100);
value.m_money = new BigDecimal(Double.valueOf(valideData.get("total_fee").toString())/100);
value.m_flow_code = valideData.get("out_trade_no").toString();
value.b_flow_code = valideData.get("transaction_id").toString();
value.status = 0;
value.type = 1;
value.bank_id = "999";
value.marketId = Integer.parseInt(valideData.get("mch_id").toString());
value.bank_time = new Date(TimeFunc.strToDate(valideData.get("time_end").toString()).getTime());
value.result = 0l;
value.remark = "微信后台返回成功";
String sign = valideData.get("sign").toString();
map=service.outMoneyCheck(value);
Map<String,String> resMap = new HashMap<>();
String resXml = null;
if(map.get("respCode").toString().equals("0")){
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>"
+ "</xml> ";

}else {
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
}
BufferedOutputStream out = new BufferedOutputStream(
response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
...全文
5290 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianchazuzhang 2020-04-09
  • 打赏
  • 举报
回复
引用 19 楼 weixin_peng 的回复:
response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"); 折磨了一天,发现是这样的?不是直接返回字符串,腾讯的文档真是够了,希望帮到更多的人
谢谢老哥 已解决
朱海涛的博客 2019-07-25
  • 打赏
  • 举报
回复
引用 19 楼 weixin_peng 的回复:
response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");
折磨了一天,发现是这样的?不是直接返回字符串,腾讯的文档真是够了,希望帮到更多的人
感谢,正解!!!
小白的大白 2018-11-29
  • 打赏
  • 举报
回复 1
按照正常返回xml值,这个文档中有,记住,千万不要打断点,可以通过控制台输出做验证,一定一定不要打断点测
weixin_peng 2018-09-30
  • 打赏
  • 举报
回复
response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");
折磨了一天,发现是这样的?不是直接返回字符串,腾讯的文档真是够了,希望帮到更多的人
cap_jack_sp 2018-02-23
  • 打赏
  • 举报
回复
String msg = "success"; response.setContentType("text/xml"); response.getWriter().println(msg); 这样做有效。
kk872182090 2017-11-22
  • 打赏
  • 举报
回复
resXml = "<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>"; 别加断点,返回这种形势,OK了!
kk872182090 2017-11-22
  • 打赏
  • 举报
回复
我也是一样,微信老回调!!不知怎么解决
uk8692 2017-11-01
  • 打赏
  • 举报
回复
引用 13 楼 aa24741 的回复:
哥们,你的好使了么,我也是已经按照格式返回xml了,还继续回调啊
我用的PrintStream来返回的,

String content = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg></return_msg>"
                    + "</xml>";
PrintStream out = new PrintStream(response.getOutputStream());
out.print(content);
out.flush();
aa24741 2017-10-17
  • 打赏
  • 举报
回复
是不是 响应头还是 编码有问题啊
aa24741 2017-10-17
  • 打赏
  • 举报
回复
哥们,你的好使了么,我也是已经按照格式返回xml了,还继续回调啊
Tokyo_not_too_hot 2017-07-31
  • 打赏
  • 举报
回复
引用 5 楼 dong648629778 的回复:
成功,就调用
writeMessageToResponse(response, "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");
失败,就调用
writeMessageToResponse(response, "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");
protected void writeMessageToResponse(HttpServletResponse response, String message) {
		PrintWriter writer = null;
		try {
			response.setCharacterEncoding(StandardCharsets.UTF_8.name());
			writer = response.getWriter();
			writer.write(message);
			writer.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (writer != null)
				writer.close();
		}
	}
按照你的方法写了 还是又回调了1····
Tokyo_not_too_hot 2017-07-31
  • 打赏
  • 举报
回复
@
引用 6 楼 dong648629778 的回复:
不需要sign
sign是我后来测试用了一次 其他都没有sign
Tokyo_not_too_hot 2017-07-31
  • 打赏
  • 举报
回复
if(map.get("respCode").toString().equals("0")){ resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "</xml> "; }else { resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> "; } BufferedOutputStream out = new BufferedOutputStream( response.getOutputStream()); out.write(resXml.getBytes()); out.flush(); out.close(); 第五次修改, 返回报文只返回成功的XML ,还是不行 绝望了我快····
dong648629778 2017-07-31
  • 打赏
  • 举报
回复
不需要sign
dong648629778 2017-07-31
  • 打赏
  • 举报
回复
成功,就调用
writeMessageToResponse(response, "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");
失败,就调用
writeMessageToResponse(response, "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");
protected void writeMessageToResponse(HttpServletResponse response, String message) {
		PrintWriter writer = null;
		try {
			response.setCharacterEncoding(StandardCharsets.UTF_8.name());
			writer = response.getWriter();
			writer.write(message);
			writer.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (writer != null)
				writer.close();
		}
	}
吃货时代 2017-07-31
  • 打赏
  • 举报
回复
你这肯定是没有返回微信需要的成功参数,才会一直被回调的。自己测试一下,请求这个回调,接收到的到底是什么参数
Tokyo_not_too_hot 2017-07-31
  • 打赏
  • 举报
回复
if(map.get("respCode").toString().equals("0")){ resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "<sign><!["+sign+"]></sign>" + "</xml> "; }else { resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> "; } BufferedOutputStream out = new BufferedOutputStream( response.getOutputStream()); out.write(resXml.getBytes()); out.flush(); out.close(); 第四次修改,在返回报文里面 加上了sign签名
Tokyo_not_too_hot 2017-07-31
  • 打赏
  • 举报
回复
if(map.get("respCode").toString().equals("0")){ resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> "; }else { resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> "; } response.getWriter().write(resXml ); response.getWriter().flush(); response.getWriter().close(); 第三次修改·····
Tokyo_not_too_hot 2017-07-31
  • 打赏
  • 举报
回复
if(map.get("respCode").toString().equals("0")){ resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> "; }else { resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> "; } String msg = "SUCCESS"; response.getWriter().write(msg); response.getWriter().flush(); response.getWriter().close(); 这个是我第二次修改之后的,仍然重复回调
dong648629778 2017-07-31
  • 打赏
  • 举报
回复
一般情况下 你返回一次success微信那边就不会继续调用的。
加载更多回复(2)

81,116

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧