1. 程式人生 > >微信公眾平臺 生成帶引數的二維碼

微信公眾平臺 生成帶引數的二維碼

前言:最近一直在開發微信的東西,總結一下微信生成帶引數的二維碼。這個其實在參考文章的第一篇總結的非常詳細,大家可以參考一下。這裡總結一下微信生成帶引數二維碼的過程和主要開發程式碼。

注:本文使用RestTemplate提供遠端請求,RestTemplate是Spring提供的用於訪問Rest服務的客戶端,RestTemplate提供了多種便捷訪問遠端Http服務的方法。
參考文章:Spring提供的用於訪問Rest服務的客戶端:RestTemplate實踐

一、微信二維碼介紹

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

是無過期時間的,但數量較少(目前為最多10萬個)。永久二維碼主要用於適用於帳號繫結、使用者來源統計等場景。

二、建立二維碼

建立二維碼我們需要先獲取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建立二維碼圖片。

參考文章: