java实现微信支付结果通知
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。
//支付结果通知接口
@RequestMapping("/qlydweixinotify.do")
publicvoidweixinotify(HttpServletRequestrequest,
HttpServletResponseresponse){
PrintWriterout=null;
StringBufferxmlStr=newStringBuffer();
try{
BufferedReaderreader=request.getReader();
Stringline=null;
while((line=reader.readLine())!=null){
xmlStr.append(line);
}
Logger.getLogger(getClass()).debug("支付回调通知:"+xmlStr.toString());
//检查xml是否有效
booleanflag=Signature.checkIsSignValidFromResponseString(xmlStr.toString());
WeixinNotifyResultresult=null;
if(flag){
NotifyResDatawxData=(NotifyResData)Util.getObjectFromXML(xmlStr.toString(),NotifyResData.class);
if(wxData!=null){
if("SUCCESS".equals(wxData.getReturn_code())&&"SUCCESS".equals(wxData.getResult_code())){
OrderPayInfoorderPayInfo=newOrderPayInfo();
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微信支付
OrderMessagereturnMessage=orderProductServer
.completeProductOrder(orderPayInfo);
if(OrderStatus.FAIL.equals(returnMessage
.getOrderStatus())){
Logger.getLogger(getClass()).error("远程接口完成订单失败");
result=newWeixinNotifyResult("FAIL");
result.setReturn_msg("远程接口完成订单失败");
}else{
result=newWeixinNotifyResult("SUCCESS");
result.setReturn_msg("成功");
}
}else{
result=newWeixinNotifyResult("FAIL");
result.setReturn_msg("失败");
}
}else{
result=newWeixinNotifyResult("FAIL");
result.setReturn_msg("解析参数格式失败");
}
}else{
result=newWeixinNotifyResult("FAIL");
result.setReturn_msg("签名失败");
}
response.getWriter().write(result.toString());
}catch(Exceptione){
Logger.getLogger(getClass()).error("qlydweixinotify.do",e);
ResponeDeal.getInstance().sendResponseStr(response,"404","连接超时");
}finally{
if(out!=null){
out.close();
}
}
}
模拟http请求工具类:
HttpsRequestUtil.java
packagecom.qlwb.weixin.util;
importjava.io.IOException;
importorg.apache.commons.httpclient.HttpClient;
importorg.apache.commons.httpclient.HttpException;
importorg.apache.commons.httpclient.methods.PostMethod;
importorg.apache.commons.httpclient.methods.RequestEntity;
importorg.apache.commons.httpclient.methods.StringRequestEntity;
importorg.apache.log4j.Logger;
importcom.qlwb.weixin.common.Configure;
importcom.qlwb.weixin.common.Util;
importcom.qlwb.weixin.protocol.pay_protocol.WxPayReqData;
importcom.qlwb.weixin.protocol.payquery_protocol.PayQueryReqData;
publicclassHttpsRequestUtil{
/**
*
*@方法名称:sendWxPayRequest
*@内容摘要:<发送统一下单请求>
*@parambody
*@paramoutTradeNo
*@paramtotalFee
*@paramspBillCreateIP
*@return
*String
*@exception
*@author:鹿伟伟
*@创建日期:2016年2月19日-下午2:24:05
*/
publicStringsendWxPayRequest(Stringbody,Stringdetail,StringoutTradeNo,inttotalFee,StringspBillCreateIP
)
{
//构造HTTP请求
HttpClienthttpclient=newHttpClient();
PostMethodpostMethod=newPostMethod(Configure.PAY_API);
WxPayReqDatawxdata=newWxPayReqData(body,detail,outTradeNo,totalFee,spBillCreateIP);
StringrequestStr="";
requestStr=Util.ConvertObj2Xml(wxdata);
//发送请求
StringstrResponse=null;
try{
RequestEntityentity=newStringRequestEntity(
requestStr.toString(),"text/xml","UTF-8");
postMethod.setRequestEntity(entity);
httpclient.executeMethod(postMethod);
strResponse=newString(postMethod.getResponseBody(),"utf-8");
Logger.getLogger(getClass()).debug(strResponse);
}catch(HttpExceptione){
Logger.getLogger(getClass()).error("sendWxPayRequest",e);
}catch(IOExceptione){
Logger.getLogger(getClass()).error("sendWxPayRequest",e);
}finally{
postMethod.releaseConnection();
}
returnstrResponse;
}
/**
*
*@方法名称:orderQueryRequest
*@内容摘要:<查询订单信息>
*@paramtransaction_id微信的订单号,优先使用
*@return
*String
*@exception
*@author:鹿伟伟
*@创建日期:2016年2月19日-下午2:44:11
*/
publicStringorderQueryRequest(StringtransactionID,StringoutTradeNo
)
{
//构造HTTP请求
HttpClienthttpclient=newHttpClient();
PostMethodpostMethod=newPostMethod(Configure.PAY_QUERY_API);
PayQueryReqDatawxdata=newPayQueryReqData(transactionID,outTradeNo);
StringrequestStr="";
requestStr=Util.ConvertObj2Xml(wxdata);
//发送请求
StringstrResponse=null;
try{
RequestEntityentity=newStringRequestEntity(
requestStr.toString(),"text/xml","UTF-8");
postMethod.setRequestEntity(entity);
httpclient.executeMethod(postMethod);
strResponse=newString(postMethod.getResponseBody(),"utf-8");
}catch(HttpExceptione){
Logger.getLogger(getClass()).error("orderQueryRequest",e);
}catch(IOExceptione){
Logger.getLogger(getClass()).error("orderQueryRequest",e);
}finally{
postMethod.releaseConnection();
}
returnstrResponse;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。