中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信公眾平臺開發使用Java如何實現獲取token

發布時間:2020-11-17 16:14:55 來源:億速云 閱讀:225 作者:Leah 欄目:編程語言

微信公眾平臺開發使用Java如何實現獲取token?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

(一)token的介紹

引用:access_token是公眾號的全局唯一票據,公眾號調用各接口時都需使用access_token。開發者需要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的access_token失效!

(二)token的獲取參考文檔

獲取的流程我們完全可以參考微信官方文檔:http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html 如圖:

微信公眾平臺開發使用Java如何實現獲取token

(三)token獲取流程分析

從公眾平臺獲取賬號的AppID和AppSecret;
token獲取并解析存儲執行體;
采用任務調度每隔兩小時執行一次token獲取執行體;

(四)token的獲取流程的具體實現
①獲取appid和appsecret

在微信公眾平臺【開發】——>【基本配置】中可以查看到我們需要的兩個參數:

微信公眾平臺開發使用Java如何實現獲取token

這里我們將他們定義到我們的配置文件【wechat.properties】中,大致代碼為:

#獲取到的appid
appid=wx7e32765bc24XXXX 
#獲取到的AppSecret
AppSecret=d58051564fe9d86093f9XXXXX

②token獲取并解析存儲執行體的代碼編寫

由于在這里我們需要通過http的get請求向微信服務器獲取時效性為7200秒的token,所以我在這里寫了一個http請求的工具類,以方便我們的使用,如下:

package com.cuiyongzhi.wechat.util;
 
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.GZIPInputStream;
 
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
 
/**
 * ClassName: HttpUtils
 * 
 * @Description: http請求工具類
 * @author dapengniao
 * @date 2016年3月10日 下午3:57:14
 */
@SuppressWarnings("deprecation")
public class HttpUtils {
 
 /**
  * @Description: http get請求共用方法
  * @param @param reqUrl
  * @param @param params
  * @param @return
  * @param @throws Exception
  * @author dapengniao
  * @date 2016年3月10日 下午3:57:39
  */
 @SuppressWarnings("resource")
 public static String sendGet(String reqUrl, Map<String, String> params)
   throws Exception {
  InputStream inputStream = null;
  HttpGet request = new HttpGet();
  try {
   String url = buildUrl(reqUrl, params);
   HttpClient client = new DefaultHttpClient();
 
   request.setHeader("Accept-Encoding", "gzip");
   request.setURI(new URI(url));
 
   HttpResponse response = client.execute(request);
 
   inputStream = response.getEntity().getContent();
   String result = getJsonStringFromGZIP(inputStream);
   return result;
  } finally {
   if (inputStream != null) {
    inputStream.close();
   }
   request.releaseConnection();
  }
 
 }
 
 /**
  * @Description: http post請求共用方法
  * @param @param reqUrl
  * @param @param params
  * @param @return
  * @param @throws Exception
  * @author dapengniao
  * @date 2016年3月10日 下午3:57:53
  */
 @SuppressWarnings("resource")
 public static String sendPost(String reqUrl, Map<String, String> params)
   throws Exception {
  try {
   Set<String> set = params.keySet();
   List<NameValuePair> list = new ArrayList<NameValuePair>();
   for (String key : set) {
    list.add(new BasicNameValuePair(key, params.get(key)));
   }
   if (list.size() > 0) {
    try {
     HttpClient client = new DefaultHttpClient();
     HttpPost request = new HttpPost(reqUrl);
 
     request.setHeader("Accept-Encoding", "gzip");
     request.setEntity(new UrlEncodedFormEntity(list, HTTP.UTF_8));
 
     HttpResponse response = client.execute(request);
 
     InputStream inputStream = response.getEntity().getContent();
     try {
      String result = getJsonStringFromGZIP(inputStream);
 
      return result;
     } finally {
      inputStream.close();
     }
    } catch (Exception ex) {
     ex.printStackTrace();
     throw new Exception("網絡連接失敗,請連接網絡后再試");
    }
   } else {
    throw new Exception("參數不全,請稍后重試");
   }
  } catch (Exception ex) {
   ex.printStackTrace();
   throw new Exception("發送未知異常");
  }
 }
 
 /**
  * @Description: http post請求json數據
  * @param @param urls
  * @param @param params
  * @param @return
  * @param @throws ClientProtocolException
  * @param @throws IOException
  * @author dapengniao
  * @date 2016年3月10日 下午3:58:15
  */
 public static String sendPostBuffer(String urls, String params)
   throws ClientProtocolException, IOException {
  HttpPost request = new HttpPost(urls);
 
  StringEntity se = new StringEntity(params, HTTP.UTF_8);
  request.setEntity(se);
  // 發送請求
  @SuppressWarnings("resource")
  HttpResponse httpResponse = new DefaultHttpClient().execute(request);
  // 得到應答的字符串,這也是一個 JSON 格式保存的數據
  String retSrc = EntityUtils.toString(httpResponse.getEntity());
  request.releaseConnection();
  return retSrc;
 
 }
 
 /**
  * @Description: http請求發送xml內容
  * @param @param urlStr
  * @param @param xmlInfo
  * @param @return
  * @author dapengniao
  * @date 2016年3月10日 下午3:58:32
  */
 public static String sendXmlPost(String urlStr, String xmlInfo) {
  // xmlInfo xml具體字符串
 
  try {
   URL url = new URL(urlStr);
   URLConnection con = url.openConnection();
   con.setDoOutput(true);
   con.setRequestProperty("Pragma:", "no-cache");
   con.setRequestProperty("Cache-Control", "no-cache");
   con.setRequestProperty("Content-Type", "text/xml");
   OutputStreamWriter out = new OutputStreamWriter(
     con.getOutputStream());
   out.write(new String(xmlInfo.getBytes("utf-8")));
   out.flush();
   out.close();
   BufferedReader br = new BufferedReader(new InputStreamReader(
     con.getInputStream()));
   String lines = "";
   for (String line = br.readLine(); line != null; line = br
     .readLine()) {
    lines = lines + line;
   }
   return lines; // 返回請求結果
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return "fail";
 }
 
 private static String getJsonStringFromGZIP(InputStream is) {
  String jsonString = null;
  try {
   BufferedInputStream bis = new BufferedInputStream(is);
   bis.mark(2);
   // 取前兩個字節
   byte[] header = new byte[2];
   int result = bis.read(header);
   // reset輸入流到開始位置
   bis.reset();
   // 判斷是否是GZIP格式
   int headerData = getShort(header);
   // Gzip 流 的前兩個字節是 0x1f8b
   if (result != -1 && headerData == 0x1f8b) {
    // LogUtil.i("HttpTask", " use GZIPInputStream ");
    is = new GZIPInputStream(bis);
   } else {
    // LogUtil.d("HttpTask", " not use GZIPInputStream");
    is = bis;
   }
   InputStreamReader reader = new InputStreamReader(is, "utf-8");
   char[] data = new char[100];
   int readSize;
   StringBuffer sb = new StringBuffer();
   while ((readSize = reader.read(data)) > 0) {
    sb.append(data, 0, readSize);
   }
   jsonString = sb.toString();
   bis.close();
   reader.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 
  return jsonString;
 }
 
 private static int getShort(byte[] data) {
  return (data[0] << 8) | data[1] & 0xFF;
 }
 
 /**
  * 構建get方式的url
  * 
  * @param reqUrl
  *   基礎的url地址
  * @param params
  *   查詢參數
  * @return 構建好的url
  */
 public static String buildUrl(String reqUrl, Map<String, String> params) {
  StringBuilder query = new StringBuilder();
  Set<String> set = params.keySet();
  for (String key : set) {
   query.append(String.format("%s=%s&", key, params.get(key)));
  }
  return reqUrl + "&#63;" + query.toString();
 }
 
}

我們在做http請求的時候需要目標服務器的url,這里在項目中為了方便對url的管理我們在資源目錄下建立了interface_url.properties用于存放目標url,這里我們將請求token的url存入:

#獲取token的url
tokenUrl=https://api.weixin.qq.com/cgi-bin/token

我們需要將我們配置的配置文件在項目初始化后能得到啟動,所以我在這里加入一個項目初始化的代碼實現,用于項目啟動初始化interface_url.properties和wechat.properties中的配置:

package com.cuiyongzhi.web.start;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
 
/**
 * ClassName: InterfaceUrlIntiServlet
 * @Description: 項目啟動初始化servlet
 * @author dapengniao
 * @date 2016年3月10日 下午4:08:43
 */
public class InterfaceUrlIntiServlet extends HttpServlet {
 
 private static final long serialVersionUID = 1L;
 
 @Override
 public void init(ServletConfig config) throws ServletException {
  InterfaceUrlInti.init();
 }
 
}

初始化的具體實現,將初始化過后的方法都存入到GlobalConstants中方便項目中隨意調用,如下:

package com.cuiyongzhi.web.start;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
 
import com.cuiyongzhi.web.util.GlobalConstants;
 
/**
 * ClassName: InterfaceUrlInti
 * @Description: 項目啟動初始化方法
 * @author dapengniao
 * @date 2016年3月10日 下午4:08:21
 */
public class InterfaceUrlInti {
 
 public synchronized static void init(){
  ClassLoader cl = Thread.currentThread().getContextClassLoader();
  Properties props = new Properties();
  if(GlobalConstants.interfaceUrlProperties==null){
   GlobalConstants.interfaceUrlProperties = new Properties();
  }
  InputStream in = null;
  try {
   in = cl.getResourceAsStream("interface_url.properties");
   props.load(in);
   for(Object key : props.keySet()){
    GlobalConstants.interfaceUrlProperties.put(key, props.get(key));
   }
    
   props = new Properties();
   in = cl.getResourceAsStream("wechat.properties");
   props.load(in);
   for(Object key : props.keySet()){
    GlobalConstants.interfaceUrlProperties.put(key, props.get(key));
   }
    
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   if(in!=null){
    try {
     in.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return;
 }
 
}

當我們把所有的準備工作都做好了之后我們可以開始真正的去獲取token了,這里我們將獲取到的token解析之后依然存儲到GlobalConstants中方便使用,簡單代碼如下:

package com.cuiyongzhi.wechat.common;
 
import java.util.HashMap;
import java.util.Map;
 
import net.sf.json.JSONObject;
 
import com.cuiyongzhi.web.util.GlobalConstants;
import com.cuiyongzhi.wechat.util.HttpUtils;
 
/**
 * ClassName: WeChatTask
 * @Description: 微信兩小時定時任務體
 * @author dapengniao
 * @date 2016年3月10日 下午1:42:29
 */
public class WeChatTask {
 /**
  * @Description: 任務執行體
  * @param @throws Exception
  * @author dapengniao
  * @date 2016年3月10日 下午2:04:37
  */
 public void getToken_getTicket() throws Exception {
  Map<String, String> params = new HashMap<String, String>();
  params.put("grant_type", "client_credential");
  params.put("appid", GlobalConstants.getInterfaceUrl("appid"));
  params.put("secret", GlobalConstants.getInterfaceUrl("AppSecret"));
  String jstoken = HttpUtils.sendGet(
    GlobalConstants.getInterfaceUrl("tokenUrl"), params);
  String access_token = JSONObject.fromObject(jstoken).getString(
    "access_token"); // 獲取到token并賦值保存
  GlobalConstants.interfaceUrlProperties.put("access_token", access_token);
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"token為=============================="+access_token);
 }
 
}

(三)采用任務調度每隔兩小時執行一次token獲取執行體

我們閱讀過微信的文檔會發現我們的token獲取的接口每天是有調用次數限制的,為了防止我們業務量比較大的情況下token的直接調用的接口次數不夠用,所以我們需要根據token的時效性(7200s)在自己的業務服務器上做到token的緩存并定時獲取,我這里用到的任務調度的方式是采用quartz,有關quartz的使用可以參考文章 http://cuiyongzhi.com/&#63;tags=%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1 ,下面具體代碼的實現:

package com.cuiyongzhi.wechat.quartz;
 
import org.apache.log4j.Logger;
 
import com.cuiyongzhi.wechat.common.WeChatTask;
 
public class QuartzJob{
  private static Logger logger = Logger.getLogger(QuartzJob.class);
  /**
   * @Description: 任務執行獲取token
   * @param  
   * @author dapengniao
   * @date 2016年3月10日 下午4:34:26
   */
  public void workForToken() {
    try {
      WeChatTask timer = new WeChatTask();
      timer.getToken_getTicket();
    } catch (Exception e) {
      logger.error(e, e);
    }
  }
 
 
}

這里新建配置文件spring-quartz.xml以方便quartz任務的管理和啟用,這里將我們需要用到的workForToken()加入到執行任務中:

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 
<beans>
 <!-- 要調用的工作類 -->
 <bean id="quartzJob" class="com.cuiyongzhi.wechat.quartz.QuartzJob"></bean>
  
 <!-- 定義調用對象和調用對象的方法 -->
 <bean id="jobtaskForToken"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <!-- 調用的類 -->
  <property name="targetObject">
   <ref bean="quartzJob" />
  </property>
  <!-- 調用類中的方法 -->
  <property name="targetMethod">
   <value>workForToken</value>
  </property>
 
 </bean>
 <!-- 定義觸發時間 -->
 <bean id="doTimeForToken" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail">
   <ref bean="jobtaskForToken" />
  </property>
  <!-- cron表達式 -->
  <property name="cronExpression">
   <value>0 0/1 * * * &#63;</value>
  </property>
 </bean>
 
 
 <!-- 總管理類 如果將lazy-init='false'那么容器啟動就會執行調度程序 -->
 <bean id="startQuertz" lazy-init="false" autowire="no"
  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="doTimeForToken" />
   </list>
  </property>
 </bean>
 
</beans>

這里我為了測試將執行間隔時間設置成了1分鐘一次,根據需要可以自行修改執行時間;最后我們需要在我們的web.xml啟動項中開啟quartz的使用:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring.xml,classpath:spring-mybatis.xml,classpath:spring-quartz.xml</param-value>
  <!-- ,classpath:spring-quartz.xml 用于做任務調度 任務定時都可以 -->
 </context-param>

當這一切都準備完畢之后我們啟動項目,會發現每間隔一分鐘就會有token獲取到,這里我是將其存儲在項目變量中,但是如果需要考慮到項目橫向擴展這里建議將token存儲到緩存中;運行結果如下:

微信公眾平臺開發使用Java如何實現獲取token

關于微信公眾平臺開發使用Java如何實現獲取token問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扬州市| 竹山县| 白城市| 元阳县| 江山市| 玉龙| 新安县| 武胜县| 上饶县| 磴口县| 唐河县| 余江县| 南京市| 泸州市| 轮台县| 临城县| 沾化县| 鲁山县| 扬州市| 永州市| 汝阳县| 黄山市| 桦川县| 容城县| 阿瓦提县| 叙永县| 赤壁市| 南汇区| 滦平县| 瑞丽市| 开封市| 扎赉特旗| 金塔县| 古丈县| 鄂尔多斯市| 五华县| 五原县| 光山县| 工布江达县| 通州市| 肇庆市|