小程序二維碼的生成有三個不一樣的接口,針對不一樣的場景需求
下文介紹的是第二種,也是用的最多的一種:適用於須要的碼數量極多,或僅臨時使用的業務場景
接口地址:https://api.weixin.qq.com/wxa...java
注意:經過該接口生成的小程序碼,永久有效,數量暫無限制。用戶掃描該碼進入小程序後,開發者需在對應頁面獲取的碼中 scene 字段的值,再作處理邏輯。使用以下代碼能夠獲取到二維碼中的 scene 字段的值。調試階段可使用開發工具的條件編譯自定義參數 scene=xxxx 進行模擬,開發工具模擬時的 scene 的參數值須要進行 urlencodejson
// 這是首頁的 js
Page({
onLoad: function(options) {
// options 中的 scene 須要使用 decodeURIComponent 才能獲取到生成二維碼時傳入的 scene
var scene = decodeURIComponent(options.scene)
}
})小程序
以下內容爲調用微信小程序二維碼接口,生成小程序二維碼圖片的Java實現【構造post請求,調用微信接口】微信小程序
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
//參數說明,QRCreateBean對象中傳入自個須要的值。最主要的包括微信的accessToken以及小程序碼要存儲的內容
//要存儲的內容放到了scene參數中,掃碼後小程序要跳轉的頁面路徑page參數對應api
public static String createPoster(QRCreateBean qrCreateBean) throws Exception { log.info("======生成微信小程序碼開始====="); String qrcodeName = "qr_" + qrCreateBean.getSerialNo(); long nowTime = System.currentTimeMillis(); //二維碼圖片 URL getCodeUrl = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + qrCreateBean.getAccessToken()); HttpURLConnection httpURLConnection = (HttpURLConnection) getCodeUrl.openConnection(); httpURLConnection.setRequestMethod("POST");// 提交模式 httpURLConnection.setDoOutput(true); httpURLConnection.setDoInput(true); PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream()); JSONObject paramJson = new JSONObject(); //在上線以前測試的版本中,頁面不能跳轉,跳轉頁面的參數名定義爲path,可在模擬器上進行測試 //paramJson.accumulate("scene", qrCreateBean.getSerialNo()).accumulate("path", "pages/goods/goods"); //上線後,跳轉頁面的參數需定義爲page,不然會找不到跳轉頁面 paramJson.accumulate("scene", qrCreateBean.getSerialNo()).accumulate("page", "pages/goods/goods"); paramJson.put("auto_color", false); JSONObject lineColor = new JSONObject(); lineColor.put("r", 0); lineColor.put("g", 0); lineColor.put("b", 0); paramJson.put("line_color", lineColor); printWriter.write(paramJson.toString()); printWriter.flush(); String contentType = httpURLConnection.getContentType(); if (contentType.contains("json")) { log.info("調用微信小程序生成接口出錯,token失效"); return "1"; } else { BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream()); //小程序碼圖片寫出存儲的路徑 File file = new File("src\\main\\resources\\image\\" + qrcodeName + ".png"); OutputStream ost = new FileOutputStream(file); int len; byte[] arr = new byte[1024]; while ((len = bis.read(arr)) != -1) { ost.write(arr, 0, len); ost.flush(); } ost.close(); log.info("========生成微信小程序碼結束===========");
}微信
注意:
對於accessToken有一個坑
openId:是表示用戶在你的當前應用中的惟一標示,好比小程序,微信公衆號等,這些都算是一個應用,若是你有多個應用,同一個用戶的openId可能並不相同
unionid:借用微信官方文檔中的話來講,若是開發者擁有多個移動應用、網站應用、和公衆賬號(包括小程序),可經過 UnionID 來區分用戶的惟一性,由於只要是同一個微信開放平臺賬號下的移動應用、網站應用和公衆賬號(包括小程序),用戶的 UnionID 是惟一的。換句話說,同一用戶,對同一個微信開放平臺下的不一樣應用,unionid是相同的app
對於accessToken,微信程序碼openId在同一時間用來掉用小程序碼生成接口【使用appid以及secret調用生成(一個應用只有一個祕鑰secret)】,只有一個有效,且有效期是5分鐘。當有其餘操做再獲取accessToken時,以前的token會失效。因此每次在生成小程序二維碼以前都要從新獲取一下token。
若是用失效的accessToken去調用小程序碼生成接口,返回內容爲json格式的一個錯誤提示。若正常返回小程序碼圖片,返回內容的type爲image/jepg。如在上文的代碼中,須要對調用接口後返回的內容進行判斷!工具