微信小程序二維碼開發總結
阿新 • • 發佈:2019-03-25
gety chan path 開始 rep 發生 ack 公司 mit a、 調用的時候url都需要先去獲取小程序對應的token,token獲取正確是第一步。
b、 二維碼接口參數設置這個地方坑很多。
1、比如參數path,這個參數設置的路徑必須是小程序發布過的路徑,沒有發布過的路徑就會報錯,測試可以使用主頁pages/index/index
2、參數width,設置二維碼寬度,設置時註意它是String類型,這樣寫width="430" 而不是width=430。
c、通過什麽方式調用這三個接口是比較重要,因為方式不同,接口返回的數據形式就不同,比如,
一種方式通過文件IO流把二維碼是生成圖片到本地了,但是怎麽傳給頁面就是問題。
我更傾向於使用生成字節流的方式,這種數據形式容易被ImageIO圖片io流獲取,傳送到oss或者直接
字節流形式返給前臺比較方便。兩種方式,我都會列舉。具體可以看代碼。
小程序二維碼功能總結:
因為公司小程序通過二維碼分享功能業務場景比較多,二維碼功能開發過程中遇到的問題也比較多,
所以做個總結,有不妥之處希望大家指正。
微信提供生成的小程序二維碼接口有三個分別是:
createWXAQRCode(普通的二維碼-方形)
getWXACode (小程序二維碼-圓形)
getWXACodeUnlimit(小程序二維碼-圓形)
這三個接口,調用的邏輯其實是一樣,區別應該在於傳參不同,使用場景不同,具體詳情可以看官方文檔:
https://developers.weixin.qq.com/miniprogram/dev/api-backend/createWXAQRCode.html
其中需要註意的地方,容易犯錯的地方:
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; } }
微信小程序二維碼開發總結