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

java微信開(kāi)發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證

 更新時(shí)間:2016年06月28日 16:03:22   作者:wgyscsf  
這篇文章主要為大家詳細(xì)介紹了java微信開(kāi)發(fā)API第二步,微信獲取以及保存接口調(diào)用憑證,感興趣的小伙伴們可以參考一下

微信如何獲取以及保存接口調(diào)用憑證,下面就為大家進(jìn)行介紹

一、說(shuō)明
*詳細(xì)說(shuō)明請(qǐng)參考前兩篇文章。
*本文分為三部分:
    接口調(diào)用憑證access_token的作用以及解釋
    如何獲取接口調(diào)用憑證access_token
    如何實(shí)現(xiàn)微信文檔所說(shuō)的“中控服務(wù)器”的實(shí)現(xiàn)以保存access_token
* 本文結(jié)束會(huì)給出包括本文前三篇文章的所有演示源碼

 為什么要獲取和保存接口調(diào)用憑證access_token
 •開(kāi)始開(kāi)發(fā)-獲取接口調(diào)用憑據(jù)
◦文檔地址:http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html

 •官網(wǎng)文檔給出這樣解釋?zhuān)?br /> ◦access_token是公眾號(hào)的全局唯一票據(jù),公眾號(hào)調(diào)用各接口時(shí)都需使用access_token。開(kāi)發(fā)者需要進(jìn)行妥善保存。access_token的存儲(chǔ)至少要保留512個(gè)字符空間。access_token的有效期目前為2個(gè)小時(shí),需定時(shí)刷新,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。

 •理解:
◦我們簡(jiǎn)單翻閱文檔可以發(fā)現(xiàn),許多高級(jí)功能,例如:自定義菜單、素材管理、用戶(hù)管理、賬號(hào)管理等各種高級(jí)功能請(qǐng)求的鏈接中都有“?access_token=TOKEN”這個(gè)參數(shù),這是全局調(diào)用參數(shù),微信后臺(tái)需要根據(jù)這個(gè)參數(shù)確定身份,保證我們的微信公眾號(hào)的安全。
 ◦為了防止公眾號(hào)的程序錯(cuò)誤而引發(fā)微信服務(wù)器負(fù)載異常,默認(rèn)情況下,每個(gè)公眾號(hào)調(diào)用接口都不能超過(guò)一定限制,這里微信限制每天2000次。所以,如果我們想要頻繁調(diào)用這個(gè)參數(shù),需要我們開(kāi)發(fā)者手動(dòng)保存,每個(gè)access_token有效期是2個(gè)小時(shí)。

獲取接口調(diào)用憑證access_token
•官網(wǎng)文檔給出這樣解釋?zhuān)?br /> ◦接口調(diào)用請(qǐng)求說(shuō)明

http請(qǐng)求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
■返回說(shuō)明

正常情況下,微信會(huì)返回下述JSON數(shù)據(jù)包給公眾號(hào):
{“access_token”:”ACCESS_TOKEN”,”expires_in”:7200}

錯(cuò)誤時(shí)微信會(huì)返回錯(cuò)誤碼等信息,JSON數(shù)據(jù)包示例如下(該示例為AppID無(wú)效錯(cuò)誤):
{“errcode”:40013,”errmsg”:”invalid appid”}

•理解:
◦GET請(qǐng)求,該方式直接在本地就可以實(shí)現(xiàn)。因?yàn)橹皇且粋€(gè)普通的GET請(qǐng)求,類(lèi)似于訪(fǎng)問(wèn)網(wǎng)址。所以,不需要上傳該部分代碼到服務(wù)器就可以直接操作。
 ◦http請(qǐng)求協(xié)議是GET請(qǐng)求,說(shuō)明我們需要通過(guò)GET請(qǐng)求獲取返回流,返回流是json形式。調(diào)用時(shí)我們需要攜帶三個(gè)參數(shù):grant_type、appid、secret。其中appid和secret是我們微信公眾號(hào)關(guān)鍵的參數(shù),在前文已經(jīng)闡述。返回結(jié)果分為正確和錯(cuò)誤兩種結(jié)果?!景俣龋簀son】
 ◦其實(shí),我們可以直接在地址欄輸入文檔給的示例:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,我們會(huì)看到這樣的信息:“{“errcode”:40013,”errmsg”:”invalid appid hint: [pQKl0120ic11]”}”,因?yàn)檫@是一個(gè)無(wú)效的請(qǐng)求,返回的是錯(cuò)誤的結(jié)果。
 ◦當(dāng)我們把自己的測(cè)試號(hào)APPID和APPSECRET替換上面的那兩個(gè)參數(shù),會(huì)看到這樣的信息:“{“access_token”:”XrllR3fNf…bADAMIO”,”expires_in”:7200}”,代表獲取成功。
 ◦現(xiàn)在我們通過(guò)java 代碼獲取返回流,拿取access_token。

 •實(shí)現(xiàn)

private static final long MAX_TIME = 7200 * 1000;// 微信允許最長(zhǎng)Access_token有效時(shí)間(ms)
private static final String TAG = "WeixinApiTest";// TAG
private static final String APPID = "wx889b****b3666b0b8";// APPID
private static final String SECERT = "6da7676***f0a9f15fbf06027856bb";// 秘鑰

/*
 * 該測(cè)試用例演示了如何獲取access_token。
 * access_token是公眾號(hào)的全局唯一票據(jù),公眾號(hào)調(diào)用各接口時(shí)都需使用access_token。
 */
@Test
public void getAccess_token() throws IOException {
  // 拼接api要求的httpsurl鏈接
  String urlString = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
      + APPID + "&secret=" + SECERT;
  // 創(chuàng)建一個(gè)url
  URL reqURL = new URL(urlString);
  // 拿取鏈接
  HttpsURLConnection httpsConn = (HttpsURLConnection) reqURL
      .openConnection();
  // 取得該連接的輸入流,以讀取響應(yīng)內(nèi)容
  InputStreamReader isr = new InputStreamReader(
      httpsConn.getInputStream());
  // 讀取服務(wù)器的響應(yīng)內(nèi)容并顯示
  char[] chars = new char[1024];
  String reslut = "";
  int len;
  while ((len = isr.read(chars)) != -1) {
    reslut += new String(chars, 0, len);
  }
  isr.close();
  /*
   * 轉(zhuǎn)化json成javabean。引入了第三方j(luò)ar:GSON
   */
  Gson gson = new Gson();// 將獲取的json轉(zhuǎn)化為java中的bean
  // 注意:Access_token access_token是一個(gè)自己創(chuàng)建的javabean
  Access_token access_token = gson.fromJson(reslut,
      new Access_token().getClass());
  if (access_token.getAccess_token() != null) {
    System.out.println("獲取的access_token是:"
        + access_token.getAccess_token());
    System.out.println("該access_token的有效時(shí)間是:"
        + access_token.getExpires_in() + "s");
  } else {
    System.out.println(TAG + "獲取access_token失敗,請(qǐng)檢查");

  }

}

保存接口調(diào)用憑證access_token
 •思路

將獲取到的Access_token和當(dāng)前時(shí)間存儲(chǔ)到file里, 取出時(shí)判斷當(dāng)前時(shí)間和存儲(chǔ)里面的記錄的時(shí)間的時(shí)間差,如果大于MAX_TIME,重新獲取,并且將獲取到的存儲(chǔ)到file替換原來(lái)的內(nèi)容,如果小于MAX_TIME,直接獲取。

 •實(shí)現(xiàn)

  /*
   * 該方法實(shí)現(xiàn)獲取Access_token、保存并且只保存2小時(shí)Access_token。如果超過(guò)兩個(gè)小時(shí)重新獲取;如果沒(méi)有超過(guò)兩個(gè)小時(shí),直接獲取。該方法依賴(lài)
   * :public static String getAccessToken();
   * 
   * 思路:將獲取到的Access_token和當(dāng)前時(shí)間存儲(chǔ)到file里,
   * 取出時(shí)判斷當(dāng)前時(shí)間和存儲(chǔ)里面的記錄的時(shí)間的時(shí)間差,如果大于MAX_TIME,重新獲取,并且將獲取到的存儲(chǔ)到file替換原來(lái)的內(nèi)容
   * ,如果小于MAX_TIME,直接獲取。
   */
  @Test
  public void getSavedAccess_token() throws IOException {
    Gson gson = new Gson();
    String mAccess_token = null;// 需要獲取的Access_token;
    File file = new File("temp_access_token.temp");// Access_token保存的位置
    // 如果文件不存在,創(chuàng)建
    if (!file.exists())
      file.createNewFile();
    // 如果文件大小等于0,說(shuō)明第一次使用,存入Access_token
    if (file.length() == 0) {
      mAccess_token = getAccessToken();
      FileOutputStream fos = new FileOutputStream(file, false);// 不允許追加
      Access_token at = new Access_token();
      at.setAccess_token(mAccess_token);
      at.setExpires_in(System.currentTimeMillis() + "");
      String json = gson.toJson(at);
      fos.write((json).getBytes());
      fos.close();
    } else {
      // 讀取文件內(nèi)容
      FileInputStream fis = new FileInputStream(file);
      byte[] b = new byte[2048];
      int len = fis.read(b);
      String mJsonAccess_token = new String(b, 0, len);// 讀取到的文件內(nèi)容
      Access_token access_token = gson.fromJson(mJsonAccess_token,
          new Access_token().getClass());
      if (access_token.getExpires_in() != null) {
        long saveTime = Long.parseLong(access_token.getExpires_in());
        long nowTime = System.currentTimeMillis();
        long remianTime = nowTime - saveTime;
        // System.out.println(TAG + "時(shí)間差:" + remianTime);
        if (remianTime < MAX_TIME) {
          Access_token at = gson.fromJson(mJsonAccess_token,
              new Access_token().getClass());
          mAccess_token = at.getAccess_token();
        } else {
          mAccess_token = getAccessToken();
          FileOutputStream fos = new FileOutputStream(file, false);// 不允許追加
          Access_token at = new Access_token();
          at.setAccess_token(mAccess_token);
          at.setExpires_in(System.currentTimeMillis() + "");
          String json = gson.toJson(at);
          fos.write((json).getBytes());
          fos.close();
        }

      }
    }

    System.out.println("獲取到的Access_token是:" + mAccess_token);
  }

  /*
   * 獲取微信服務(wù)器AccessToken。該部分和getAccess_token() 一致,不再加注釋
   */
  public static String getAccessToken() {
    String urlString = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
        + APPID + "&secret=" + SECERT;
    String reslut = null;
    try {
      URL reqURL = new URL(urlString);
      HttpsURLConnection httpsConn = (HttpsURLConnection) reqURL
          .openConnection();
      InputStreamReader isr = new InputStreamReader(
          httpsConn.getInputStream());
      char[] chars = new char[1024];
      reslut = "";
      int len;
      while ((len = isr.read(chars)) != -1) {
        reslut += new String(chars, 0, len);
      }
      isr.close();
    } catch (IOException e) {

      e.printStackTrace();
    }
    Gson gson = new Gson();
    Access_token access_token = gson.fromJson(reslut,
        new Access_token().getClass());
    if (access_token.getAccess_token() != null) {
      return access_token.getAccess_token();
    } else {
      return null;
    }
  }

 前三篇文章演示源碼:http://xiazai.jb51.net/201606/yuanma/WeixinApiDemo(jb51.net).rar

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

相關(guān)文章

  • Scala異常處理的方法深入分析

    Scala異常處理的方法深入分析

    Scala是一種多范式的編程語(yǔ)言,支持面向?qū)ο蠛秃瘮?shù)式編程。Scala也支持異常處理,即在程序運(yùn)行過(guò)程中發(fā)生意外或錯(cuò)誤時(shí),采取相應(yīng)的措施
    2023-04-04
  • Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作實(shí)現(xiàn)代碼

    Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java 數(shù)據(jù)結(jié)構(gòu)鏈表操作的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下
    2016-10-10
  • Spring Boot Log4j2的配置使用詳解

    Spring Boot Log4j2的配置使用詳解

    本篇文章主要介紹了Spring Boot Log4j2的配置使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java的Character類(lèi)詳解

    Java的Character類(lèi)詳解

    在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到需要使用對(duì)象,而不是內(nèi)置數(shù)據(jù)類(lèi)型的情況。為了解決這個(gè)問(wèn)題,Java語(yǔ)言為內(nèi)置數(shù)據(jù)類(lèi)型char提供了包裝類(lèi)Character類(lèi)。本文詳細(xì)介紹了Java的Character類(lèi),感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • SpringBoot基本web開(kāi)發(fā)demo過(guò)程解析

    SpringBoot基本web開(kāi)發(fā)demo過(guò)程解析

    這篇文章主要介紹了SpringBoot基本web開(kāi)發(fā)demo過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring Data JPA 如何使用QueryDsl查詢(xún)并分頁(yè)

    Spring Data JPA 如何使用QueryDsl查詢(xún)并分頁(yè)

    這篇文章主要介紹了Spring Data JPA 如何使用QueryDsl查詢(xún)并分頁(yè),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java多線(xiàn)程(單例模式,阻塞隊(duì)列,定時(shí)器,線(xiàn)程池)詳解

    Java多線(xiàn)程(單例模式,阻塞隊(duì)列,定時(shí)器,線(xiàn)程池)詳解

    本文是多線(xiàn)程初級(jí)入門(mén),主要介紹了多線(xiàn)程單例模式、阻塞隊(duì)列、定時(shí)器、線(xiàn)程池、多線(xiàn)程面試考點(diǎn),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • 在Java中使用Moshi?JSON庫(kù)的方法詳解

    在Java中使用Moshi?JSON庫(kù)的方法詳解

    Moshi?是一個(gè)可用于?Java?與?Kotlin?的?JSON?序列化與反序列化庫(kù),其主要使用?Kotlin?編寫(xiě),本文以樣例代碼的方式來(lái)演示該庫(kù)在?Java?中的使用,需要的朋友可以參考下
    2024-04-04
  • springboot如何使用AOP做訪(fǎng)問(wèn)請(qǐng)求日志

    springboot如何使用AOP做訪(fǎng)問(wèn)請(qǐng)求日志

    這篇文章主要介紹了springboot如何使用AOP做訪(fǎng)問(wèn)請(qǐng)求日志,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 關(guān)于Netty--Http請(qǐng)求處理方式

    關(guān)于Netty--Http請(qǐng)求處理方式

    這篇文章主要介紹了關(guān)于Netty--Http請(qǐng)求處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論

北京市| 中牟县| 罗甸县| 绍兴市| 家居| 苍溪县| 吴江市| 三都| 凤翔县| 卢龙县| 乡宁县| 高阳县| 海兴县| 翁源县| 化德县| 博兴县| 康平县| 竹溪县| 冕宁县| 宣汉县| 辰溪县| 巨野县| 朝阳区| 习水县| 高碑店市| 晋宁县| 富民县| 兴宁市| 西平县| 云和县| 郧西县| 时尚| 教育| 永吉县| 绵阳市| 建德市| 寻乌县| 襄汾县| 纳雍县| 广平县| 张家界市|