⽀付(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 = Reader();
String line = null;
while ((line = adLine()) != null) {
xmlStr.append(line);
}
//检查xml是否有效
boolean flag=Signature.String());
WeixinNotifyResult result=null;
if(flag){
NotifyResData wxData=(NotifyResData) String(),NotifyResData.class);
if(wxData !=null){
if(“SUCCESS”.Return_code())){
OrderPayInfo orderPayInfo = new OrderPayInfo();
orderPayInfo.Out_trade_no());
orderPayInfo.Transaction_id());
orderPayInfo.setPayPrice((Total_fee()/100+”“);
orderPayInfo.Openid());
orderPayInfo.Time_end());
orderPayInfo.setPayType(“2”);//1⽀付宝,2⽀付
OrderMessage returnMessage = orderProductServer
pleteProductOrder(orderPayInfo);
if (OrderStatus.FAIL.equals(returnMessage
.getOrderStatus())) {
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(“签名失败”);
}
} catch (Exception e) {
} finally {
if (out != null) {
out.close();
}
}
}
模拟http请求⼯具类:
HttpsRequestUtil.java
package com.qlwb.weixin.util;
import java.io.IOException;
import org.apachemons.httpclient.HttpClient;
import org.apachemons.httpclient.HttpException;
import org.hods.PostMethod;
import org.hods.RequestEntity;
import org.hods.StringRequestEntity;
import org.apache.log4j.Logger;
import com.qlwb.weixinmon.Configure;
import com.qlwb.weixinmon.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(
postMethod.setRequestEntity(entity);
strResponse = new ResponseBody(), "utf-8");
} catch (HttpException e) {
} catch (IOException e) {
log4j2版本Logger(getClass()).error("sendWxPayRequest", e);
} finally {
}
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(
postMethod.setRequestEntity(entity);
strResponse = new ResponseBody(), "utf-8");
} catch (HttpException e) {
} catch (IOException e) {
} finally {
}
return strResponse;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论