欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现微信支付结果通知

程序员文章站 2024-02-24 14:18:33
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信...

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

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

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