最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)微信支付結(jié)果通知

 更新時(shí)間:2019年01月11日 08:37:50   作者:東邊的小山  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)微信支付結(jié)果通知,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

支付完成后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,商戶需要接收處理,并返回應(yīng)答。

對(duì)后臺(tái)通知交互時(shí),如果微信收到商戶的應(yīng)答不是成功或超時(shí),微信認(rèn)為通知失敗,微信會(huì)通過(guò)一定的策略定期重新發(fā)起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。 (通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)

注意:同樣的通知可能會(huì)多次發(fā)送給商戶系統(tǒng)。商戶系統(tǒng)必須能夠正確處理重復(fù)的通知。
推薦的做法是,當(dāng)收到通知進(jìn)行處理時(shí),首先檢查對(duì)應(yīng)業(yè)務(wù)數(shù)據(jù)的狀態(tài),判斷該通知是否已經(jīng)處理過(guò),如果沒(méi)有處理過(guò)再進(jìn)行處理,如果處理過(guò)直接返回結(jié)果成功。在對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行狀態(tài)檢查和處理之前,要采用數(shù)據(jù)鎖進(jìn)行并發(fā)控制,以避免函數(shù)重入造成的數(shù)據(jù)混亂。

特別提醒:商戶系統(tǒng)對(duì)于支付結(jié)果通知的內(nèi)容一定要做簽名驗(yàn)證,防止數(shù)據(jù)泄漏導(dǎo)致出現(xiàn)“假通知”,造成資金損失。

//支付結(jié)果通知接口

  @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("支付回調(diào)通知:"+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("遠(yuǎn)程接口完成訂單失敗");
              result=new WeixinNotifyResult("FAIL");
              result.setReturn_msg("遠(yuǎn)程接口完成訂單失敗");
            } else {
              result=new WeixinNotifyResult("SUCCESS");
              result.setReturn_msg("成功");
            }
          }else{
            result=new WeixinNotifyResult("FAIL");
            result.setReturn_msg("失敗");
          }
        }else{
          result=new WeixinNotifyResult("FAIL");
          result.setReturn_msg("解析參數(shù)格式失敗");
        }
      }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", "連接超時(shí)");
    } finally {
      if (out != null) {
        out.close();
      }
    }
  }

模擬http請(qǐng)求工具類:

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
   * @內(nèi)容摘要: <發(fā)送統(tǒng)一下單請(qǐng)求>
   * @param body
   * @param outTradeNo
   * @param totalFee
   * @param spBillCreateIP
   * @return 
   * String
   * @exception 
   * @author:鹿偉偉
   * @創(chuàng)建日期:2016年2月19日-下午2:24:05
   */
  public String sendWxPayRequest(String body,String detail,String outTradeNo,int totalFee,String spBillCreateIP
      )
 
  {
    // 構(gòu)造HTTP請(qǐng)求
    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);
    // 發(fā)送請(qǐng)求
    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
   * @內(nèi)容摘要: <查詢訂單信息>
   * @param transaction_id 微信的訂單號(hào),優(yōu)先使用
   * @return 
   * String
   * @exception 
   * @author:鹿偉偉
   * @創(chuàng)建日期:2016年2月19日-下午2:44:11
   */
  public String orderQueryRequest(String transactionID, String outTradeNo
      )
 
  {
    // 構(gòu)造HTTP請(qǐng)求
    HttpClient httpclient = new HttpClient();
 
    PostMethod postMethod = new PostMethod(Configure.PAY_QUERY_API);
 
    PayQueryReqData wxdata = new PayQueryReqData(transactionID,outTradeNo);
 
    String requestStr="";
    requestStr=Util.ConvertObj2Xml(wxdata);
    // 發(fā)送請(qǐng)求
    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;
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • FeignClient如何脫離eureka自定義URL

    FeignClient如何脫離eureka自定義URL

    這篇文章主要介紹了FeignClient如何脫離eureka自定義URL,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Android token過(guò)期刷新處理的方法示例

    Android token過(guò)期刷新處理的方法示例

    這篇文章主要介紹了Android token過(guò)期刷新處理的方法示例,本文詳細(xì)的介紹了2種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式

    Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式

    本文主要介紹了HiveJDBC和ImpalaJDBC的使用方法,包括版本對(duì)應(yīng)、Maven安裝、主機(jī)名配置、端口開(kāi)通、JDBC連接和Kerberos認(rèn)證等
    2025-02-02
  • 學(xué)習(xí)Java的Date、Calendar日期操作

    學(xué)習(xí)Java的Date、Calendar日期操作

    Java開(kāi)發(fā)過(guò)程中避免不了日期相關(guān)操作,這篇文章總結(jié)了一些Date、Calendar的常用方法,需要的朋友可以參考下
    2015-07-07
  • Spring和MyBatis整合自動(dòng)生成代碼里面text類型遇到的坑

    Spring和MyBatis整合自動(dòng)生成代碼里面text類型遇到的坑

    Spring和MyBatis整合以后,使用自動(dòng)生成代碼工具生成dao和mapper配置文件。下面通過(guò)本文給大家介紹Spring和MyBatis整合自動(dòng)生成代碼里面text類型遇到的坑,需要的朋友參考下吧
    2018-01-01
  • 淺談springboot中tk.mapper代碼生成器的用法說(shuō)明

    淺談springboot中tk.mapper代碼生成器的用法說(shuō)明

    這篇文章主要介紹了淺談springboot中tk.mapper代碼生成器的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Eclipse git推送上傳錯(cuò)誤問(wèn)題解決方案

    Eclipse git推送上傳錯(cuò)誤問(wèn)題解決方案

    這篇文章主要介紹了Eclipse git推送上傳錯(cuò)誤問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java歐拉函數(shù)的計(jì)算代碼詳解

    Java歐拉函數(shù)的計(jì)算代碼詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)歐拉函數(shù)的計(jì)算,從歐拉函數(shù)引伸出來(lái)在環(huán)論方面的事實(shí)和拉格朗日定理構(gòu)成了歐拉定理的證明,本文通過(guò)實(shí)例代碼給大家介紹的很詳細(xì),需要的朋友可以參考下
    2021-05-05
  • Java實(shí)現(xiàn)簡(jiǎn)單猜拳游戲

    Java實(shí)現(xiàn)簡(jiǎn)單猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單猜拳游戲,輸入字符,不輸入數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Java把Map轉(zhuǎn)為對(duì)象的實(shí)現(xiàn)代碼

    Java把Map轉(zhuǎn)為對(duì)象的實(shí)現(xiàn)代碼

    在項(xiàng)目開(kāi)發(fā)中,經(jīng)常碰到map轉(zhuǎn)實(shí)體對(duì)象或者對(duì)象轉(zhuǎn)map的場(chǎng)景,工作中,很多時(shí)候我們可能比較喜歡使用第三方j(luò)ar包的API對(duì)他們進(jìn)行轉(zhuǎn)化,但這里,我想通過(guò)反射的方式對(duì)他們做轉(zhuǎn)化,感興趣的同學(xué)跟著小編來(lái)看看吧
    2023-08-08

最新評(píng)論

沾化县| 城固县| 博白县| 富源县| 雷波县| 拉孜县| 赣州市| 广宗县| 泗水县| 民丰县| 陆河县| 苏尼特右旗| 西青区| 吴忠市| 乌兰察布市| 长海县| 郴州市| 疏附县| 汉川市| 扶风县| 泸州市| 浪卡子县| 克山县| 蕉岭县| 南汇区| 新干县| 司法| 清流县| 宝兴县| 辽中县| 榆社县| 通许县| 农安县| 武强县| 额敏县| 泽库县| 成都市| 石台县| 武乡县| 巴东县| 徐汇区|