java实现微信支付结果通知

 更新时间:2019年01月11日 08:37:50   作者:东边的小山  
这篇文章主要为大家详细介绍了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;
  }
}

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

相关文章

  • FeignClient如何脱离eureka自定义URL

    FeignClient如何脱离eureka自定义URL

    这篇文章主要介绍了FeignClient如何脱离eureka自定义URL,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Android token过期刷新处理的方法示例

    Android token过期刷新处理的方法示例

    这篇文章主要介绍了Android token过期刷新处理的方法示例,本文详细的介绍了2种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Java JDBC连接Kerberos认证的HIVE和Impala方式

    Java JDBC连接Kerberos认证的HIVE和Impala方式

    本文主要介绍了HiveJDBC和ImpalaJDBC的使用方法,包括版本对应、Maven安装、主机名配置、端口开通、JDBC连接和Kerberos认证等
    2025-02-02
  • 学习Java的Date、Calendar日期操作

    学习Java的Date、Calendar日期操作

    Java开发过程中避免不了日期相关操作,这篇文章总结了一些Date、Calendar的常用方法,需要的朋友可以参考下
    2015-07-07
  • Spring和MyBatis整合自动生成代码里面text类型遇到的坑

    Spring和MyBatis整合自动生成代码里面text类型遇到的坑

    Spring和MyBatis整合以后,使用自动生成代码工具生成dao和mapper配置文件。下面通过本文给大家介绍Spring和MyBatis整合自动生成代码里面text类型遇到的坑,需要的朋友参考下吧
    2018-01-01
  • 浅谈springboot中tk.mapper代码生成器的用法说明

    浅谈springboot中tk.mapper代码生成器的用法说明

    这篇文章主要介绍了浅谈springboot中tk.mapper代码生成器的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Eclipse git推送上传错误问题解决方案

    Eclipse git推送上传错误问题解决方案

    这篇文章主要介绍了Eclipse git推送上传错误问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java欧拉函数的计算代码详解

    Java欧拉函数的计算代码详解

    这篇文章主要介绍了Java实现欧拉函数的计算,从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明,本文通过实例代码给大家介绍的很详细,需要的朋友可以参考下
    2021-05-05
  • Java实现简单猜拳游戏

    Java实现简单猜拳游戏

    这篇文章主要为大家详细介绍了Java实现简单猜拳游戏,输入字符,不输入数字,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Java把Map转为对象的实现代码

    Java把Map转为对象的实现代码

    在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,但这里,我想通过反射的方式对他们做转化,感兴趣的同学跟着小编来看看吧
    2023-08-08

最新评论