java微信支付异步通知_java实现微信支付结果通知
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为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实现微信支付结果通知相关推荐
- java实现的小程序_Java实现 微信小程序 + 消息推送
实现效果: 下面要显示五个字段 接下来,参照官方文档,一步步实现: 一.官方给出请求示例.返回示例 二.根据上面编写实体类 (1)请求参数 @Data public class SendTemplat ...
- java微信支付异步通知_Java中微信支付退款异步通知解码
微信所有的支付结果都是加密处理的,他和订单支付成功的异步通知不一样. 他的基本返回是: SUCCESS 我们需要对req_info解码才能看到退款的明文 解码后会得到明文: 解密步骤如下: (1)对加 ...
- java与微信小程序通讯_java与微信小程序实现websocket长连接
本文实例为大家分享了java与微信小程序实现websocket长连接的具体代码,供大家参考,具体内容如下 背景: 需要在小程序实现地图固定坐标下实时查看消息 java环境 :tomcat7 jdk1. ...
- java 朋友圈分享接口_Java实现微信公众平台朋友圈分享功能详细代码
其实分享的方法在微信官网有较为详细的文档说明,现就其中一些比较绕的步骤进行总结,有问题随时交流哈. 首先微信其实已经自带分享到朋友圈,朋友,qq空间等功能,对于开发微信专门提供了一个接口,可以根据需要 ...
- java+自带excel导出_Java实现微信内置浏览器导出Excel表格功能
最近做项目的时候遇到了这样一个问题,微信内置的浏览器把下载这个功能屏蔽了.唉,,,折腾了一天,从网上各种找资料,但是给的解决方案都不是我想要的(也不知道谁复制的谁的,基本都一样). 在快下班的时候,我 ...
- java微信消息发送消息_JAVA模拟微信消息发送请求
JavaWeb模拟微信(网页版)发送消息到好友.PS:不是公众号,是好友之间,或者发送到群. 1.发送文字消息到好友,或群. 2.分析参数: 这里写图片描述 {\"BaseRequest\& ...
- java 微信定位到市_java 实现微信搜索附近人功能
最近给andorid做后台查询数据功能,有一个需求是模仿微信的查找附近人功能. 数据库中存储每个用户的经纬度信息及用户信息,通过当前用户传递过来的经纬度查询这个用户半径N公里以内的用户信息. 数据库表 ...
- java 微信多线程推送_Java实现 微信小程序 + 消息推送
实现效果: 下面要显示五个字段 接下来,参照官方文档,一步步实现: 一.官方给出请求示例.返回示例 二.根据上面编写实体类 (1)请求参数 @Data public class SendTemplat ...
- java同步和异步机制_JAVA学习过程中的知识——java多线程的同步和异步
1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是,多线程和异步操作还是有一些区别的.而 ...
- java 支付结果主动通知商户_java实现微信支付结果通知
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答. 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽 ...
最新文章
- 前端自动化构建工具webpack (二)之css和插件加载总结
- Java synchronized 中的 while 和 notifyAll
- Linux php安装fileinfo扩展
- chrome控制台如何把vw显示成px_你可能不知道的chrome调试技巧
- 如何制作一个塔防游戏 Cocos2d x 2 0 4
- window.showModalDialog乱码(完美)解决方案
- javascript 开发多种类型的应用(Electron 跨平台开发)
- 2021雪花飘新年倒计时源码
- 云桌面 瘦终端_云终端与瘦终端简介
- Vue运行环境及淘宝镜像(cnpm命令)安装
- 漏洞复现之CVE-2018-1273 Spring Data Commons 远程命令执行
- 如何系统地学习网络安全
- H5 VIDEO标签视频黑屏的原因及解决方法
- 大规模优化方法(一)
- 在地图上可视化地理空间数据的12种方法
- 简单的http抓包(微信公众网页登录模拟)
- MDA:两种MDAer
- 进程process和线程thread应用和区别——Python学习笔记12
- 计算机蓝屏 代码0000a,Win7系统出现蓝屏代码0x000000a的原因及解决方法
- 分布式主键生成设计策略