Java微信公眾平臺開發之生成帶參二維碼
阿新 • • 發佈:2019-01-08
微信官方提供的生成二維碼介面得到的是當前公眾號的二維碼。
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
- publicclass AccessToken {
- // 獲取到的憑證
- private String token;
- // 憑證有效時間,單位:秒
- privateint expiresIn;
- public String getToken() {
-
return
- }
- publicvoid setToken(String token) {
- this.token = token;
- }
- publicint getExpiresIn() {
- return expiresIn;
- }
- publicvoid setExpiresIn(int expiresIn) {
- this.expiresIn = expiresIn;
- }
- }
2.建立獲取accessToken的方法
呼叫介面時,請登入“微信公眾平臺-開發-基本配置”提前將伺服器IP地址新增到IP白名單中,否則將無法呼叫成功
[java] view plain copy print?- /**
- * 獲取access_token
- * @param appid 憑證
- * @param appsecret 金鑰
- * @return
- */
- publicstatic String getAccessToken(String appid, String appsecret) {
- String result = HttpRequestUtil.getAccessToken(appid,appsecret);
- JSONObject jsonObject = JSONObject.fromObject(result);
- if (null != jsonObject) {
- try {
- result = jsonObject.getString("access_token");
- } catch (JSONException e) {
- logger.info("獲取token失敗 errcode:"+jsonObject.getInt("errcode") +",errmsg:"+ jsonObject.getString("errmsg"));
- }
- }
- return result;
- }
3.獲取二維碼的Ticket
[java] view plain copy print?- // 臨時二維碼
- privatefinalstatic String QR_SCENE = "QR_SCENE";
- // 永久二維碼
- privatefinalstatic String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";
- // 永久二維碼(字串)
- privatefinalstatic String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";
- // 建立二維碼
- private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create";
- // 通過ticket換取二維碼
- private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode";
- /**
- * 建立臨時帶引數二維碼
- * @param accessToken
- * @expireSeconds 該二維碼有效時間,以秒為單位。 最大不超過2592000(即30天),此欄位如果不填,則預設有效期為30秒。
- * @param sceneId 場景Id
- * @return
- */
- public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {
- WeiXinQRCode wxQRCode = null;
- TreeMap<String,String> params = new TreeMap<String,String>();
- params.put("access_token", accessToken);
- Map<String,Integer> intMap = new HashMap<String,Integer>();
- intMap.put("scene_id",sceneId);
- Map<String,Map<String,Integer>> mapMap = new HashMap<String,Map<String,Integer>>();
- mapMap.put("scene", intMap);
- //
- Map<String,Object> paramsMap = new HashMap<String,Object>();
- paramsMap.put("expire_seconds", expireSeconds);
- paramsMap.put("action_name", QR_SCENE);
- paramsMap.put("action_info", mapMap);
- String data = new Gson().toJson(paramsMap);
- data = HttpRequestUtil.HttpsDefaultExecute(HttpRequestUtil.POST_METHOD,create_ticket_path,params,data);
- try {
- wxQRCode = new Gson().fromJson(data, WeiXinQRCode.class);
- } catch (JsonSyntaxException e) {
- wxQRCode = null;
- e.printStackTrace();
- }
- return wxQRCode==null?null:wxQRCode.getTicket();
- }
- /**
- * 建立永久二維碼(數字)
- * @param accessToken
- * @param sceneId 場景Id
- * @return
- */
- public String createForeverTicket(String accessToken, int sceneId) {
- TreeMap<String,String> params = new TreeMap<String,String>();