1. 程式人生 > >Java微信公眾平臺開發之生成帶參二維碼

Java微信公眾平臺開發之生成帶參二維碼

微信官方提供的生成二維碼介面得到的是當前公眾號的二維碼。

目前有2種類型的二維碼:
1、臨時二維碼,是有過期時間的,最長可以設定為在二維碼生成後的30天(即2592000秒)後過期,但能夠生成較多數量,主要用於帳號繫結等不要求二維碼永久儲存的業務場景
2、永久二維碼,是無過期時間的,但數量較少(目前為最多10萬個),主要用於適用於帳號繫結、使用者來源統計等場景

參考文件詳見https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542&token=&lang=zh_CN

獲取帶引數的二維碼的過程包括兩步,首先建立二維碼ticket,然後憑藉ticket到指定URL換取二維碼,但是得到ticket之前首先獲取到access_token。

1.建立access_token的bean

可以不寫,因為我是每小時定時獲取一次token儲存到資料庫或者直接存到application

[java] view plain copy  print?
  1. publicclass AccessToken {    
  2.     // 獲取到的憑證  
  3.     private String token;    
  4.     // 憑證有效時間,單位:秒  
  5.     privateint expiresIn;  
  6.     public String getToken() {  
  7.         return
     token;  
  8.     }  
  9.     publicvoid setToken(String token) {  
  10.         this.token = token;  
  11.     }  
  12.     publicint getExpiresIn() {  
  13.         return expiresIn;  
  14.     }  
  15.     publicvoid setExpiresIn(int expiresIn) {  
  16.         this.expiresIn = expiresIn;  
  17.     }  
  18. }  

2.建立獲取accessToken的方法

呼叫介面時,請登入“微信公眾平臺-開發-基本配置”提前將伺服器IP地址新增到IP白名單中,否則將無法呼叫成功

[java] view plain copy  print?
  1. /** 
  2.  * 獲取access_token 
  3.  * @param appid 憑證 
  4.  * @param appsecret 金鑰 
  5.  * @return 
  6.  */
  7. publicstatic String getAccessToken(String appid, String appsecret) {  
  8.     String result = HttpRequestUtil.getAccessToken(appid,appsecret);  
  9.     JSONObject jsonObject = JSONObject.fromObject(result);  
  10.     if (null != jsonObject) {  
  11.         try {  
  12.             result = jsonObject.getString("access_token");  
  13.         } catch (JSONException e) {  
  14.            logger.info("獲取token失敗 errcode:"+jsonObject.getInt("errcode") +",errmsg:"+ jsonObject.getString("errmsg"));                
  15.         }  
  16.     }  
  17.     return result;  
  18. }  

3.獲取二維碼的Ticket

[java] view plain copy  print?
  1. // 臨時二維碼
  2. privatefinalstatic String QR_SCENE = "QR_SCENE";  
  3. // 永久二維碼
  4. privatefinalstatic String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";  
  5. // 永久二維碼(字串)
  6. privatefinalstatic String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";   
  7. // 建立二維碼
  8. private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create";  
  9. // 通過ticket換取二維碼
  10. private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode";  
  11. /** 
  12.  * 建立臨時帶引數二維碼 
  13.  * @param accessToken 
  14.  * @expireSeconds 該二維碼有效時間,以秒為單位。 最大不超過2592000(即30天),此欄位如果不填,則預設有效期為30秒。 
  15.  * @param sceneId 場景Id 
  16.  * @return 
  17.  */
  18. public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {  
  19.     WeiXinQRCode wxQRCode = null;  
  20.     TreeMap<String,String> params = new TreeMap<String,String>();  
  21.     params.put("access_token", accessToken);  
  22.     Map<String,Integer> intMap = new HashMap<String,Integer>();  
  23.     intMap.put("scene_id",sceneId);  
  24.     Map<String,Map<String,Integer>> mapMap = new HashMap<String,Map<String,Integer>>();  
  25.     mapMap.put("scene", intMap);  
  26.     //
  27.     Map<String,Object> paramsMap = new HashMap<String,Object>();  
  28.     paramsMap.put("expire_seconds", expireSeconds);  
  29.     paramsMap.put("action_name", QR_SCENE);  
  30.     paramsMap.put("action_info", mapMap);  
  31.     String data = new Gson().toJson(paramsMap);  
  32.     data = HttpRequestUtil.HttpsDefaultExecute(HttpRequestUtil.POST_METHOD,create_ticket_path,params,data);  
  33.     try {  
  34.         wxQRCode = new Gson().fromJson(data, WeiXinQRCode.class);  
  35.     } catch (JsonSyntaxException e) {  
  36.         wxQRCode = null;  
  37.         e.printStackTrace();  
  38.     }  
  39.     return wxQRCode==null?null:wxQRCode.getTicket();  
  40. }  
  41. /** 
  42.  * 建立永久二維碼(數字) 
  43.  * @param accessToken 
  44.  * @param sceneId 場景Id 
  45.  * @return 
  46.  */
  47. public String createForeverTicket(String accessToken, int sceneId) {  
  48.     TreeMap<String,String> params = new TreeMap<String,String>();