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

Java開發(fā)SSM框架微信支付的實現(xiàn)

 更新時間:2018年10月26日 09:50:11   作者:java架構(gòu)師1  
這篇文章主要介紹了Java開發(fā)SSM框架微信支付的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

微信小程序的Java支付開發(fā)一直是一塊坑,網(wǎng)上的教程也是琳瑯滿目。筆者六月的時候接觸到了微信的小程序開發(fā)摸到了微信支付方面的東西,騰訊的官方文檔也是一言難盡很多地方看不懂,而且官方也沒有提供Java的示范導(dǎo)致Java做微信支付不得不自己踩坑?,F(xiàn)在我把自己微信支付開發(fā)的步驟和代碼都在下面展示出來,希望有沒有做出來的朋友不要心急跟著我的步驟走就沒問題。

第一步:首先微信支付的話只能是企業(yè)的開發(fā)賬戶才能使用的如果你是個人開發(fā)者是無法開通微信支付的。我們首先拿到賬號,然后拿到微信支付相關(guān)的商戶號和商戶支付密鑰,這些東西公司都會提供。有了這些以后就可以進行開發(fā)了。

public class Configure {
  //商戶支付密鑰
  private static String key = "****************************";
  //小程序ID
  private static String appID = "***************";
  //商戶號
  private static String mch_id = "*********";
  //小程序密鑰
  private static String secret = "********************";

我把開發(fā)者賬號和商戶號都放在了一個工具類方便在后面的調(diào)用。

第二步:做支付要先獲取到用戶的openid這是一個很重要的參數(shù)你必須要拿到的東西不然就無法完成支付。下面是我獲取用戶的openid的代碼。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String code = request.getParameter("code");
    HttpGet httpGet = new HttpGet("https://api.weixin.qq.com/sns/jscode2session?appid="+Configure.getAppID()+"&secret="+Configure.getSecret()+"&js_code="+code+"&grant_type=authorization_code");
        //設(shè)置請求器的配置
    HttpClient httpClient = HttpClients.createDefault();
    HttpResponse res = httpClient.execute(httpGet);
    HttpEntity entity = res.getEntity();
    String result = EntityUtils.toString(entity, "UTF-8");
    response.getWriter().append(result);
  }

第三步:獲取到用戶的openid之后我們就要進行下單。簡單來說要把微信支付所需要的參數(shù)都準備好然后給到官方提供的api。這些東西在官方的文檔里面各位可以去查閱。下面是我傳遞參數(shù)的代碼:

      String openid = request.getParameter("openid");
      int totalFee=Integer.parseInt(request.getParameter("totalFee"));//獲取支付金額
      String out_trade_no=RandomStringGenerator.getRandomStringByLength(32);//商戶訂單號
      OrderInfo order = new OrderInfo();
      order.setAppid(Configure.getAppID());
      order.setMch_id(Configure.getMch_id());
      order.setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
      order.setBody("測試");
      order.setOut_trade_no(out_trade_no);
      order.setTotal_fee(totalFee);
      order.setSpbill_create_ip("***.***.***.**");
      order.setNotify_url("https://www.see-source.com/weixinpay/PayResult");
      order.setTrade_type("JSAPI");
      order.setOpenid(openid);
      order.setSign_type("MD5");

可以看到上面的傳遞的參數(shù)中有需要支付的金額、和隨機生成的32位商戶訂單號、以及開發(fā)者的appid和支付說明支付的ip地址這些參數(shù)我們想辦法都拿到之后是否就能丟給官方api呢?當然還不是,往下看第四步。

第四步:我們拿到了參數(shù)之后能否直接給到api呢?微信支付出于安全考慮參數(shù)需要進行加密之后發(fā)送給微信支付api。我們得把剛剛拿到的參數(shù)進行簽名加密,我這里用到的是MD5的加密方式,代碼如下:

try {
      String repay_id = request.getParameter("repay_id");
      SignInfo signInfo = new SignInfo();
      signInfo.setAppId(Configure.getAppID());
      long time = System.currentTimeMillis()/1000;
      signInfo.setTimeStamp(String.valueOf(time));
      signInfo.setNonceStr(RandomStringGenerator.getRandomStringByLength(32));
      signInfo.setRepay_id("prepay_id="+repay_id);
      signInfo.setSignType("MD5");
      //生成簽名
      String sign = Signature.getSign(signInfo);

      JSONObject json = new JSONObject();
      json.put("timeStamp", signInfo.getTimeStamp());
      json.put("nonceStr", signInfo.getNonceStr());
      json.put("package", signInfo.getRepay_id());
      json.put("signType", signInfo.getSignType());
      json.put("paySign", sign);
      L.info("-------再簽名:"+json.toJSONString());
      response.getWriter().append(json.toJSONString());
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      L.error("-------", e);
    }
public static String getSign(Object o) throws IllegalAccessException {
    ArrayList<String> list = new ArrayList<String>();
    @SuppressWarnings("rawtypes")
    Class cls = o.getClass();
    Field[] fields = cls.getDeclaredFields();
    for (Field f : fields) {
      f.setAccessible(true);
      if (f.get(o) != null && f.get(o) != "") {
        String name = f.getName();
        XStreamAlias anno = f.getAnnotation(XStreamAlias.class);
        if(anno != null)
          name = anno.value();
        list.add(name + "=" + f.get(o) + "&");
      }
    }
    int size = list.size();
    String [] arrayToSort = list.toArray(new String[size]);
    Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < size; i ++) {
      sb.append(arrayToSort[i]);
    }
    String result = sb.toString();
    result += "key=" + Configure.getKey();
    System.out.println("簽名數(shù)據(jù):"+result);
    result = MD5Util.MD5Encode(result,"utf-8").toUpperCase();
    return result;
  }

到這一步就已經(jīng)支付完成了。



通過官方api返回的回調(diào)類型來判斷支付是否成功。

只要大家按照步驟來就可以實現(xiàn),以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中LambdaQueryWrapper設(shè)置自定義排序代碼示例

    Java中LambdaQueryWrapper設(shè)置自定義排序代碼示例

    這篇文章主要給大家介紹了關(guān)于Java中LambdaQueryWrapper設(shè)置自定義排序的相關(guān)資料,lambdaquerywrapper是MyBatis-Plus框架中的一個查詢條件構(gòu)造器,它可以用于構(gòu)建自定義的查詢條件,需要的朋友可以參考下
    2023-12-12
  • eclipse配置tomcat10的詳細步驟總結(jié)

    eclipse配置tomcat10的詳細步驟總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著eclipse配置tomcat10的詳細步驟展開,文中有非常詳細的介紹及圖文示例,需要的朋友可以參考下
    2021-06-06
  • java數(shù)字和中文算數(shù)驗證碼的實現(xiàn)

    java數(shù)字和中文算數(shù)驗證碼的實現(xiàn)

    這篇文章主要介紹了java數(shù)字和中文算數(shù)驗證碼的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java NIO實例UDP發(fā)送接收數(shù)據(jù)代碼分享

    Java NIO實例UDP發(fā)送接收數(shù)據(jù)代碼分享

    這篇文章主要介紹了Java NIO實例UDP發(fā)送接收數(shù)據(jù)代碼分享,分享了客戶端和服務(wù)端完整代碼,小編覺得還是挺不錯的,共需要的朋友參考。
    2017-11-11
  • SpringBoot與JWT整合方式

    SpringBoot與JWT整合方式

    文章介紹了如何在Spring?Boot項目中整合JWT(JSON?Web?Token),包括JWT的結(jié)構(gòu)、使用方法、測試以及配置,主要內(nèi)容涵蓋了依賴配置、數(shù)據(jù)庫表設(shè)計、實體類、數(shù)據(jù)訪問層、服務(wù)層、JWT工具類、攔截器配置和控制器測試等多個方面
    2024-11-11
  • Java下界通配符(? super Type)的使用

    Java下界通配符(? super Type)的使用

    在Java中,? super Type是一個下界通配符,本文主要介紹了Java下界通配符(? super Type)的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot集成flink全過程

    SpringBoot集成flink全過程

    文章介紹了Flink作為批處理和流處理結(jié)合的統(tǒng)一計算框架,特別是其強大的流處理能力,文章還詳細描述了如何在本地和集群環(huán)境中搭建Flink,并通過Netcat工具生成一個無界流測試,文章最后提供了啟動socket流的步驟和示例代碼,希望對讀者有所幫助
    2025-01-01
  • 15個頂級Java多線程面試題(附答案)

    15個頂級Java多線程面試題(附答案)

    這篇文章主要為大家分享了15個頂級Java多線程面試題,考察面試者是否有足夠的Java線程與并發(fā)知識,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java?OkHttp框架源碼超詳細解析

    Java?OkHttp框架源碼超詳細解析

    okhttp是一個第三方類庫,用于android中請求網(wǎng)絡(luò)。這是一個開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary)?。用于替代HttpUrlConnection和Apache?HttpClient
    2022-11-11
  • Java并發(fā)編程之原子變量與非阻塞同步機制

    Java并發(fā)編程之原子變量與非阻塞同步機制

    這篇文章主要介紹了Java并發(fā)編程之原子變量與非阻塞同步機制,本文講解了非阻塞算法、悲觀技術(shù)、樂觀技術(shù)、CAS操作、原子變量、性能比較:鎖與原子變量等內(nèi)容,需要的朋友可以參考下
    2015-04-04

最新評論

盐源县| 肇州县| 垦利县| 兴国县| 三门峡市| 怀远县| 日照市| 乌什县| 手游| 徐州市| 青岛市| 宁波市| 齐齐哈尔市| 庄浪县| 黄山市| 德阳市| 翁牛特旗| 惠东县| 乐业县| 山东| 天长市| 万载县| 高雄县| 大田县| 丰都县| 芷江| 万荣县| 巨野县| 阳谷县| 固阳县| 南汇区| 宁波市| 准格尔旗| 长岭县| 双鸭山市| 临海市| 双城市| 东海县| 大宁县| 香河县| 峨边|