java微信支付通知接口_java实现微信支付结果通知

news/2024/11/7 23:36:42/

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

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为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;

}

}

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


http://www.ppmy.cn/news/764522.html

相关文章

使用企业微信做微信消息通知

前言:有时候运行脚本的时候希望定期或者触发某个事件的时候往我微信推送通知,这个时候可以选择企业微信推送,原理是创建一个企业然后把要通知的账号都加进去。 一.前期准备 1.扫码进入企业微信后台,获取企业id https://work.weix…

微信服务通知消息找回_微信鲜为人知的4个冷知识,小技巧却有大用处

微信发展到现在已经走过了快9个年头,大版本已经升级到了7.0,陆陆续续推出的各种功能可以用“不计其数”来形容。在微信拥有的超过10亿用户当中,很多用户除了常用的聊天、朋友圈、微信支付等,可能很少用到微信的其他功能&#xff0…

微信小程序——服务通知,发送订阅消息

一、什么是消息推送 二、整体效果 三、实现步骤 1 小程序开通订阅消息 2 postApi测试效果 三、uniapp配置 这里有个需要特别注意的点,我们要给用户发送消息,就必须引导用户授权,如下 因为用户不点击允许,你是没有办法给用户推送…

服务器发送 微信通知,方糖,使用微信通知的小接口

最近碰到一个好玩的通知接口,可以使用接口来触发微信通知,特别适合一些需要触发通知的任务。 比如说最近很多服务器都被墙了,什么时候解封是个问题,总不能每天去看一下吧……这个时候就可以在国内的没被强的服务器上定时一个脚本&…

java实现微信订阅消息(服务通知)

1. 首先定义自己小程序中APPID以及SECRET public static final String APPID "自己的appid"; public static final String SECRET "自己的secret"; 2. 获得session_key public static String getAccessToken() throws Exception {String accessTokenUr…

服务器推送微信订阅消息,微信小程序-订阅消息服务通知

微信小程序目前支持一次性订阅模板消息,也就是首先在微信客户端用户允许订阅消息后,服务端可以按照指定模板推送消息给微信客服端,具体会在微信客户端的 服务通知 通知用户,可以快速跳转至微信小程序页面 在我之前文章 微信小程序-活动抽奖 中也有这种场景,用户使用抽奖小…

微信小程序服务通知模板的实现

小程序服务通知对应的技术实现是模板消息,是需要做技术开发的,对于工程师们来说,看一下官方文档就能上手。 下面直接上代码: wxml: <form namepushMsgFm report-submit bindsubmitform><button form-type"submit">submit</button> </form>…

【服务通知】微信小程序服务通知

根据小程序开放平台配置的相关信息 private String appId "";private String secret "";private String openid "";// 消息模板private String templateId ""; 1、获取到access_token,这个access_token一般是2个小时 public Stri…