支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。

特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。

//支付结果通知接口

@RequestMapping("/qlydweixinotify.do")

public void weixinotify(HttpServletRequest request,

HttpServletResponse response) {

PrintWriter out = null;

StringBuffer xmlStr = new StringBuffer();

try {

BufferedReader reader = request.getReader();

String line = null;

while ((line = reader.readLine()) != null) {

xmlStr.append(line);

}

Logger.getLogger(getClass()).debug("支付回调通知:"+xmlStr.toString());

//检查xml是否有效

boolean flag=Signature.checkIsSignValidFromResponseString(xmlStr.toString());

WeixinNotifyResult result=null;

if(flag){

NotifyResData wxData=(NotifyResData) Util.getObjectFromXML(xmlStr.toString(),NotifyResData.class);

if(wxData !=null){

if("SUCCESS".equals(wxData.getReturn_code())&&"SUCCESS".equals(wxData.getResult_code())){

OrderPayInfo orderPayInfo = new OrderPayInfo();

orderPayInfo.setOrderNum(wxData.getOut_trade_no());

orderPayInfo.setPayNum(wxData.getTransaction_id());

orderPayInfo.setPayPrice((double)wxData.getTotal_fee()/100+"");

orderPayInfo.setPaySource(wxData.getOpenid());

orderPayInfo.setPayTime(wxData.getTime_end());

orderPayInfo.setPayType("2");//1支付宝,2微信支付

OrderMessage returnMessage = orderProductServer

.completeProductOrder(orderPayInfo);

if (OrderStatus.FAIL.equals(returnMessage

.getOrderStatus())) {

Logger.getLogger(getClass()).error("远程接口完成订单失败");

result=new WeixinNotifyResult("FAIL");

result.setReturn_msg("远程接口完成订单失败");

} else {

result=new WeixinNotifyResult("SUCCESS");

result.setReturn_msg("成功");

}

}else{

result=new WeixinNotifyResult("FAIL");

result.setReturn_msg("失败");

}

}else{

result=new WeixinNotifyResult("FAIL");

result.setReturn_msg("解析参数格式失败");

}

}else{

result=new WeixinNotifyResult("FAIL");

result.setReturn_msg("签名失败");

}

response.getWriter().write(result.toString());

} catch (Exception e) {

Logger.getLogger(getClass()).error("qlydweixinotify.do", e);

ResponeDeal.getInstance().sendResponseStr(response, "404", "连接超时");

} finally {

if (out != null) {

out.close();

}

}

}

模拟http请求工具类:

HttpsRequestUtil.java

package com.qlwb.weixin.util;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.HttpException;

import org.apache.commons.httpclient.methods.PostMethod;

import org.apache.commons.httpclient.methods.RequestEntity;

import org.apache.commons.httpclient.methods.StringRequestEntity;

import org.apache.log4j.Logger;

import com.qlwb.weixin.common.Configure;

import com.qlwb.weixin.common.Util;

import com.qlwb.weixin.protocol.pay_protocol.WxPayReqData;

import com.qlwb.weixin.protocol.payquery_protocol.PayQueryReqData;

public class HttpsRequestUtil {

/**

*

* @方法名称:sendWxPayRequest

* @内容摘要: <发送统一下单请求>

* @param body

* @param outTradeNo

* @param totalFee

* @param spBillCreateIP

* @return

* String

* @exception

* @author:鹿伟伟

* @创建日期:2016年2月19日-下午2:24:05

*/

public String sendWxPayRequest(String body,String detail,String outTradeNo,int totalFee,String spBillCreateIP

)

{

// 构造HTTP请求

HttpClient httpclient = new HttpClient();

PostMethod postMethod = new PostMethod(Configure.PAY_API);

WxPayReqData wxdata = new WxPayReqData(body,detail,outTradeNo,totalFee,spBillCreateIP);

String requestStr="";

requestStr=Util.ConvertObj2Xml(wxdata);

// 发送请求

String strResponse = null;

try {

RequestEntity entity = new StringRequestEntity(

requestStr.toString(), "text/xml", "UTF-8");

postMethod.setRequestEntity(entity);

httpclient.executeMethod(postMethod);

strResponse = new String(postMethod.getResponseBody(), "utf-8");

Logger.getLogger(getClass()).debug(strResponse);

} catch (HttpException e) {

Logger.getLogger(getClass()).error("sendWxPayRequest", e);

} catch (IOException e) {

Logger.getLogger(getClass()).error("sendWxPayRequest", e);

} finally {

postMethod.releaseConnection();

}

return strResponse;

}

/**

*

* @方法名称:orderQueryRequest

* @内容摘要: <查询订单信息>

* @param transaction_id 微信的订单号,优先使用

* @return

* String

* @exception

* @author:鹿伟伟

* @创建日期:2016年2月19日-下午2:44:11

*/

public String orderQueryRequest(String transactionID, String outTradeNo

)

{

// 构造HTTP请求

HttpClient httpclient = new HttpClient();

PostMethod postMethod = new PostMethod(Configure.PAY_QUERY_API);

PayQueryReqData wxdata = new PayQueryReqData(transactionID,outTradeNo);

String requestStr="";

requestStr=Util.ConvertObj2Xml(wxdata);

// 发送请求

String strResponse = null;

try {

RequestEntity entity = new StringRequestEntity(

requestStr.toString(), "text/xml", "UTF-8");

postMethod.setRequestEntity(entity);

httpclient.executeMethod(postMethod);

strResponse = new String(postMethod.getResponseBody(), "utf-8");

} catch (HttpException e) {

Logger.getLogger(getClass()).error("orderQueryRequest", e);

} catch (IOException e) {

Logger.getLogger(getClass()).error("orderQueryRequest", e);

} finally {

postMethod.releaseConnection();

}

return strResponse;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java微信支付异步通知_java实现微信支付结果通知相关推荐

  1. java实现的小程序_Java实现 微信小程序 + 消息推送

    实现效果: 下面要显示五个字段 接下来,参照官方文档,一步步实现: 一.官方给出请求示例.返回示例 二.根据上面编写实体类 (1)请求参数 @Data public class SendTemplat ...

  2. java微信支付异步通知_Java中微信支付退款异步通知解码

    微信所有的支付结果都是加密处理的,他和订单支付成功的异步通知不一样. 他的基本返回是: SUCCESS 我们需要对req_info解码才能看到退款的明文 解码后会得到明文: 解密步骤如下: (1)对加 ...

  3. java与微信小程序通讯_java与微信小程序实现websocket长连接

    本文实例为大家分享了java与微信小程序实现websocket长连接的具体代码,供大家参考,具体内容如下 背景: 需要在小程序实现地图固定坐标下实时查看消息 java环境 :tomcat7 jdk1. ...

  4. java 朋友圈分享接口_Java实现微信公众平台朋友圈分享功能详细代码

    其实分享的方法在微信官网有较为详细的文档说明,现就其中一些比较绕的步骤进行总结,有问题随时交流哈. 首先微信其实已经自带分享到朋友圈,朋友,qq空间等功能,对于开发微信专门提供了一个接口,可以根据需要 ...

  5. java+自带excel导出_Java实现微信内置浏览器导出Excel表格功能

    最近做项目的时候遇到了这样一个问题,微信内置的浏览器把下载这个功能屏蔽了.唉,,,折腾了一天,从网上各种找资料,但是给的解决方案都不是我想要的(也不知道谁复制的谁的,基本都一样). 在快下班的时候,我 ...

  6. java微信消息发送消息_JAVA模拟微信消息发送请求

    JavaWeb模拟微信(网页版)发送消息到好友.PS:不是公众号,是好友之间,或者发送到群. 1.发送文字消息到好友,或群. 2.分析参数: 这里写图片描述 {\"BaseRequest\& ...

  7. java 微信定位到市_java 实现微信搜索附近人功能

    最近给andorid做后台查询数据功能,有一个需求是模仿微信的查找附近人功能. 数据库中存储每个用户的经纬度信息及用户信息,通过当前用户传递过来的经纬度查询这个用户半径N公里以内的用户信息. 数据库表 ...

  8. java 微信多线程推送_Java实现 微信小程序 + 消息推送

    实现效果: 下面要显示五个字段 接下来,参照官方文档,一步步实现: 一.官方给出请求示例.返回示例 二.根据上面编写实体类 (1)请求参数 @Data public class SendTemplat ...

  9. java同步和异步机制_JAVA学习过程中的知识——java多线程的同步和异步

    1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是,多线程和异步操作还是有一些区别的.而 ...

  10. java 支付结果主动通知商户_java实现微信支付结果通知

    支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答. 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽 ...

最新文章

  1. 前端自动化构建工具webpack (二)之css和插件加载总结
  2. Java synchronized 中的 while 和 notifyAll
  3. Linux php安装fileinfo扩展
  4. chrome控制台如何把vw显示成px_你可能不知道的chrome调试技巧
  5. 如何制作一个塔防游戏 Cocos2d x 2 0 4
  6. window.showModalDialog乱码(完美)解决方案
  7. javascript 开发多种类型的应用(Electron 跨平台开发)
  8. 2021雪花飘新年倒计时源码
  9. 云桌面 瘦终端_云终端与瘦终端简介
  10. Vue运行环境及淘宝镜像(cnpm命令)安装
  11. 漏洞复现之CVE-2018-1273 Spring Data Commons 远程命令执行
  12. 如何系统地学习网络安全
  13. H5 VIDEO标签视频黑屏的原因及解决方法
  14. 大规模优化方法(一)
  15. 在地图上可视化地理空间数据的12种方法
  16. 简单的http抓包(微信公众网页登录模拟)
  17. MDA:两种MDAer
  18. 进程process和线程thread应用和区别——Python学习笔记12
  19. 计算机蓝屏 代码0000a,Win7系统出现蓝屏代码0x000000a的原因及解决方法
  20. 分布式主键生成设计策略

热门文章

  1. 潜水减压多普勒超声气泡信号识别方法
  2. 20150118-我知道
  3. 活在当下告别过去暂存未来
  4. Android 炫动滑动 卡片层叠布局,仿探探、人人影视订阅界面 简单优雅:LayoutManager+ItemTouchHelper
  5. 曾经有个能帮我修电脑的程序员,我没有好好珍惜
  6. 模拟滤波器matlab程序,巴特沃兹模拟滤波器的MATLAB实现
  7. liigo:在PC电脑屏幕上模拟显示移动设备屏幕的物理尺寸示意图
  8. 《心术》看高度专业化职业的命运
  9. 实验5——JAVA常用类
  10. ThinkPHP搭建手机版网站