微信公眾平臺 生成帶引數的二維碼
阿新 • • 發佈:2019-01-03
前言:最近一直在開發微信的東西,總結一下微信生成帶引數的二維碼。這個其實在參考文章的第一篇總結的非常詳細,大家可以參考一下。這裡總結一下微信生成帶引數二維碼的過程和主要開發程式碼。
注:本文使用RestTemplate提供遠端請求,RestTemplate是Spring提供的用於訪問Rest服務的客戶端,RestTemplate提供了多種便捷訪問遠端Http服務的方法。
參考文章:Spring提供的用於訪問Rest服務的客戶端:RestTemplate實踐
一、微信二維碼介紹
目前有2種類型的二維碼:
1、臨時二維碼:是有過期時間的,最長可以設定為在二維碼生成後的30天(即2592000秒)後過期,但能夠生成較多數量。臨時二維碼主要用於帳號繫結等不要求二維碼永久儲存的業務場景
2、永久二維碼:
二、建立二維碼
建立二維碼我們需要先獲取access_token,再傳入引數,獲取ticket或者url得到二維碼。
1:獲取access_token
2:建立二維碼請求說明
2.1 臨時二維碼請求說明
http請求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKENPOST資料格式:json
POST資料例子:{"expire_seconds": 604800, "action_name" : "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
2.2 永久二維碼請求說明
http請求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKENPOST資料格式:json
POST資料例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
或者也可以使用以下POST資料建立字串形式的二維碼引數:
{"action_name" : "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "123"}}}
2.3 引數說明
引數 | 說明 |
---|---|
expire_seconds | 該二維碼有效時間,以秒為單位。 最大不超過2592000(即30天),此欄位如果不填,則預設有效期為30秒。 |
action_name | 二維碼型別,QR_SCENE為臨時,QR_LIMIT_SCENE為永久,QR_LIMIT_STR_SCENE為永久的字串引數值 |
action_info | 二維碼詳細資訊 |
scene_id | 場景值ID,臨時二維碼時為32位非0整型,永久二維碼時最大值為100000(目前引數只支援1–100000) |
scene_str | 場景值ID(字串形式的ID),字串型別,長度限制為1到64,僅永久二維碼支援此欄位 |
3:java介面開發
3.1 常量
// 臨時二維碼
private final static String QR_SCENE = "QR_SCENE";
// 永久二維碼
private final static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";
// 永久二維碼(字串)
private final static 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";
3.2 建立臨時帶引數二維碼
/**
* 建立臨時帶引數二維碼
* @param accessToken
* @expireSeconds 該二維碼有效時間,以秒為單位。 最大不超過2592000(即30天),此欄位如果不填,則預設有效期為30秒。
* @param sceneId 場景Id
* @return
*/
public String createTempQr(String accessToken, String expireSeconds, int sceneId) {
RestTemplate rest = new RestTemplate();
String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken ;
// 引數:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
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);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
HttpEntity requestEntity = new HttpEntity(paramsMap, headers);
Map result = null;
try {
ResponseEntity<Map> entity = rest.exchange(url, HttpMethod.POST, requestEntity,Map.class, new Object[0]);
LOG.info("呼叫生成微信臨時二維碼URL介面返回結果:" + entity.getBody());
result = (Map) entity.getBody();
} catch (Exception e) {
LOG.error("呼叫生成微信臨時二維碼URL介面異常",e);
}
if(!BlankUtil.isBlank(result)){
return result;
}
return null;
}
3.3 建立永久二維碼(數字)
/**
* 建立永久二維碼(字串)
* @param sceneId 場景id
* @param accessToken
* @return
*/
public Map createForeverQr(Integer sceneId,String accessToken ) {
RestTemplate rest = new RestTemplate();
String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken ;
// 引數:{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": sceneStr}}}
Map<String,Object> param = new HashMap<>();
param.put("action_name", "QR_LIMIT_STR_SCENE");
Map<String,Object> action = new HashMap<>();
Map<String,Object> scene = new HashMap<>();
scene.put("scene_id", sceneId);
action.put("scene", scene);
param.put("action_info", action);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
HttpEntity requestEntity = new HttpEntity(param, headers);
Map result = null;
try {
ResponseEntity<Map> entity = rest.exchange(url, HttpMethod.POST, requestEntity,Map.class, new Object[0]);
LOG.info("呼叫生成微信永久二維碼URL介面返回結果:" + entity.getBody());
result = (Map) entity.getBody();
} catch (Exception e) {
LOG.error("呼叫生成微信永久二維碼URL介面異常",e);
}
if(!BlankUtil.isBlank(result)){
return result;
}
return null;
}
3.4 建立永久二維碼(字串)
/**
* 建立永久二維碼(字串)
* @param sceneStr 場景值
* @param accessToken
* @return
*/
public Map createForeverStrQr(String sceneStr,String accessToken ) {
RestTemplate rest = new RestTemplate();
String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken ;
// 引數:{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": sceneStr}}}
Map<String,Object> param = new HashMap<>();
param.put("action_name", "QR_LIMIT_STR_SCENE");
Map<String,Object> action = new HashMap<>();
Map<String,Object> scene = new HashMap<>();
scene.put("scene_str", sceneStr);
action.put("scene", scene);
param.put("action_info", action);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
HttpEntity requestEntity = new HttpEntity(param, headers);
Map result = null;
try {
ResponseEntity<Map> entity = rest.exchange(url, HttpMethod.POST, requestEntity,Map.class, new Object[0]);
LOG.info("呼叫生成微信永久二維碼URL介面返回結果:" + entity.getBody());
result = (Map) entity.getBody();
} catch (Exception e) {
LOG.error("呼叫生成微信永久二維碼URL介面異常",e);
}
if(!BlankUtil.isBlank(result)){
return result;
}
return null;
}
4:返回引數
4.1 返回說明
正確的Json返回結果:
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}
4.2 引數說明
引數 | 說明 |
---|---|
ticket | 獲取的二維碼ticket,憑藉此ticket可以在有效時間內換取二維碼。 |
expire_seconds | 該二維碼有效時間,以秒為單位。 最大不超過2592000(即30天)。 |
url | 二維碼圖片解析後的地址,開發者可根據該地址自行生成需要的二維碼圖片 |
三、獲取二維碼圖片
1:通過ticket換取二維碼
獲取二維碼ticket後,開發者可用ticket換取二維碼圖片。請注意,本介面無須登入態即可呼叫。
1.1 請求說明
HTTP GET請求(請使用https協議)
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
提醒:TICKET記得進行UrlEncode
2:通過url換取二維碼
生成的微信二維碼還包含一個圖片解析後的地址url。
例項:
http://weixin.qq.com/q/02gxxGBN2HbaT10000w07E
我們開始使用草料二維碼生成工具,或者根據url建立二維碼圖片。