1. 程式人生 > >微信小程序二維碼開發總結

微信小程序二維碼開發總結

gety chan path 開始 rep 發生 ack 公司 mit

小程序二維碼功能總結:
因為公司小程序通過二維碼分享功能業務場景比較多,二維碼功能開發過程中遇到的問題也比較多,
所以做個總結,有不妥之處希望大家指正。


微信提供生成的小程序二維碼接口有三個分別是:
createWXAQRCode(普通的二維碼-方形)
getWXACode (小程序二維碼-圓形)
getWXACodeUnlimit(小程序二維碼-圓形)

這三個接口,調用的邏輯其實是一樣,區別應該在於傳參不同,使用場景不同,具體詳情可以看官方文檔:
https://developers.weixin.qq.com/miniprogram/dev/api-backend/createWXAQRCode.html

其中需要註意的地方,容易犯錯的地方:

a、 調用的時候url都需要先去獲取小程序對應的token,token獲取正確是第一步。
b、 二維碼接口參數設置這個地方坑很多。
1、比如參數path,這個參數設置的路徑必須是小程序發布過的路徑,沒有發布過的路徑就會報錯,測試可以使用主頁pages/index/index
2、參數width,設置二維碼寬度,設置時註意它是String類型,這樣寫width="430" 而不是width=430。
c、通過什麽方式調用這三個接口是比較重要,因為方式不同,接口返回的數據形式就不同,比如,
一種方式通過文件IO流把二維碼是生成圖片到本地了,但是怎麽傳給頁面就是問題。
我更傾向於使用生成字節流的方式,這種數據形式容易被ImageIO圖片io流獲取,傳送到oss或者直接
字節流形式返給前臺比較方便。兩種方式,我都會列舉。具體可以看代碼。


獲取token的java代碼:

    /** 
     * access_token是公眾號的全局唯一接口調用憑據
     * */
    public String getAccessToken(){
        String accessToken = "";
        String grantType = "client_credential";// 獲取access_token填寫client_credential
        String appId ="xxxxxxxxxxxxx";//
第三方用戶唯一憑證 String secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";// 第三方用戶唯一憑證密鑰,即appsecret // 這個url鏈接地址和參數皆不能變 String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grantType + "&appid=" + appId + "&secret="+ secret; try { URL urlGet = new URL(url); HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); http.setRequestMethod("GET"); // 必須是get方式請求 http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); http.setDoOutput(true); http.setDoInput(true); System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 連接超時30秒 System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 讀取超時30秒 http.connect(); InputStream is = http.getInputStream(); int size = is.available(); byte[] jsonBytes = new byte[size]; is.read(jsonBytes); String message = new String(jsonBytes, "UTF-8"); // System.out.println("獲取access_token返回的message:"+message); JsonObject demoJson = JsonUtil.parseJson(message); String jsonElement = demoJson.get("access_token").toString(); // System.out.println("獲取access_token返回的json:"+demoJson); accessToken=jsonElement; accessToken = accessToken.replace("\"", ""); // System.out.println("新獲取的access_token:"+accessToken); is.close(); return accessToken; }catch (Exception e){ e.printStackTrace(); System.out.println("獲取access_token發生異常"); return null; }


請求微信接口生成二維碼的java代碼:
拿getwxacodeunlimit舉的例子,另外兩個接口,套進去同樣適用。

    /**
     * 獲取小程序二維碼
     * @param AppID
     * @param AppSecret
     * @return
     */
    public Map<String, Object> getMiniCode(String sceneStr) {
        Map<String, Object> map = new HashMap<>();
        
        try
        {
            //獲取token
            String accessToken = getAccessToken();            
            if(null==accessToken && accessToken.isEmpty()) {
                map.put("resultCode", BossResultCode.DATANOEXIST);
                map.put("resultDesc", RunnarBossConstant.resultCode.get(BossResultCode.GETTOKENCODEFAIL));
                return map;
            }
            RestTemplate rest = new RestTemplate();
            InputStream inputStream = null;
            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken;
            Map<String,Object> param = new HashMap<>();
            if(null==sceneStr) {
                sceneStr="a=runnar567";
            }
            param.put("scene", sceneStr);
            //param.put("page", "pages/index/index");//跳轉主頁
            param.put("page", "web/pages/wishListShare/wishListShare");//此路徑必須是發布成功的
            param.put("width", 430);
            param.put("auto_color", false);
            Map<String,Object> line_color = new HashMap<>();
            line_color.put("r", 0);
            line_color.put("g", 0);
            line_color.put("b", 0);
            param.put("line_color", line_color);
//            LoggerUtil.DebugLogger.info("調用生成微信URL接口傳參:" + param);
            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
            HttpEntity requestEntity = new HttpEntity(param, headers);
            ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
//            LoggerUtil.DebugLogger.info("調用小程序生成微信永久小程序碼URL接口返回結果:" + entity.getBody());
            byte[] result = entity.getBody();
//            LoggerUtil.DebugLogger.info(Base64.encodeBase64String(result));
            inputStream = new ByteArrayInputStream(result);
            
              //開始獲取數據-寫本地
//            BufferedInputStream bis = new BufferedInputStream(inputStream);
//            OutputStream os = new FileOutputStream(new File("C:/Users/xuxiaomu/Desktop/abc.png"));//生成到本地路徑
//            int len;
//            byte[] arr = new byte[1024];
//            while ((len = bis.read(arr)) != -1)
//            {
//                os.write(arr, 0, len);
//               os.flush();
//            }
//            os.close();
               
              // 根據時間產生路徑
              long ymdhms = DateUtil.getYYYYMMDDHHmmssByLong(new Date());
              String ext = "png";
              String userCertificateJPGName = sceneStr + "_" + ymdhms + "."+ext; // 用戶的證書存放目錄+文件名   
            String filePath =RunnarBossConstant.userMiniCodeDir+userCertificateJPGName;//根據工具類設置上傳oss的路徑
            
            BufferedImage bufferedImage = ImageIO.read(inputStream);
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, ext, os);
            InputStream is = new ByteArrayInputStream(os.toByteArray());
            
            //下面這個方法是我根據公司需要把圖片二進制流寫到oss服務上了,返回訪問的路徑。前端直接訪問oss存的圖片路徑就可以看到二維碼。
            //具體情況具體分析,拿到的是圖片的字節類型輸入流,大家可以自行處理,比如上傳到項目的靜態文件夾下。然後通過https://域名:端口號/項目名稱/圖片名稱.png就可以訪問了

            String miniCodeUrl = OssOperUtil.ossUploadInputStreamWithoutDomain(is, filePath);
            map.put("miniCodeUrl", miniCodeUrl);
            map.put("resultCode", BossResultCode.SUCCESS);
            map.put("resultDesc", RunnarBossConstant.resultCode.get(BossResultCode.SUCCESS));
            return map;            
        }
        catch (Exception e)
        {
            e.printStackTrace();
            LoggerUtil.DebugLogger.info("二維碼上傳oss失敗:"+e.getMessage());          
            return null;            
        }

    }

微信小程序二維碼開發總結