java生成微信小程序二维码,前台扫描识别
生活随笔
收集整理的這篇文章主要介紹了
java生成微信小程序二维码,前台扫描识别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?微信小程序官方接口參考地址:wxacode.getUnlimited | 微信開放文檔
?1.OkHttpUtils?
package com.battle.platform.utils;import okhttp3.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import java.util.Map;@Component public class OkHttpUtils {private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");private static final MediaType XML = MediaType.parse("application/xml; charset=utf-8");@Autowiredprivate OkHttpClient okHttpClient;/*** get 請求* @param url 請求url地址* @return string* */public String doGet(String url) {return doGet(url, null, null);}/*** get 請求* @param url 請求url地址* @param params 請求參數 map* @return string* */public String doGet(String url, Map<String, String> params) {return doGet(url, params, null);}/*** get 請求* @param url 請求url地址* @param headers 請求頭字段 {k1, v1 k2, v2, ...}* @return string* */public String doGet(String url, String[] headers) {return doGet(url, null, headers);}/*** get 請求* @param url 請求url地址* @param params 請求參數 map* @param headers 請求頭字段 {k1, v1 k2, v2, ...}* @return string* */public String doGet(String url, Map<String, String> params, String[] headers) {StringBuilder sb = new StringBuilder(url);if (params != null && params.keySet().size() > 0) {boolean firstFlag = true;for (String key : params.keySet()) {if (firstFlag) {sb.append("?").append(key).append("=").append(params.get(key));firstFlag = false;} else {sb.append("&").append(key).append("=").append(params.get(key));}}}Request.Builder builder = new Request.Builder();if (headers != null && headers.length > 0) {if (headers.length % 2 == 0) {for (int i = 0; i < headers.length; i = i + 2) {builder.addHeader(headers[i], headers[i + 1]);}} else { // log.warn("headers's length[{}] is error.", headers.length);}}Request request = builder.url(sb.toString()).build(); // log.info("do get request and url[{}]", sb.toString());return execute(request);}/*** post 請求* @param url 請求url地址* @param params 請求參數 map* @return string*/public String doPost(String url, Map<String, String> params) {FormBody.Builder builder = new FormBody.Builder();if (params != null && params.keySet().size() > 0) {for (String key : params.keySet()) {builder.add(key, params.get(key));}}Request request = new Request.Builder().url(url).post(builder.build()).build(); // log.info("do post request and url[{}]", joinUrl(url));return execute(request);}/*** post 請求, 請求數據為 json 的字符串* @param url 請求url地址* @param json 請求數據, json 字符串* @return string*/public String doPostJson(String url, String json) { // log.info("do post request and url[{}]", joinUrl(url));return exectePost(url, json, JSON);}/*** post 請求, 請求數據為 xml 的字符串* @param url 請求url地址* @param xml 請求數據, xml 字符串* @return string*/public String doPostXml(String url, String xml) { // log.info("do post request and url[{}]", joinUrl(url));return exectePost(url, xml, XML);}private String exectePost(String url, String data, MediaType contentType) {RequestBody requestBody = RequestBody.create(contentType, data);Request request = new Request.Builder().url(url).post(requestBody).build();return execute(request);}private String execute(Request request) {Response response = null;try {response = okHttpClient.newCall(request).execute();if (response.isSuccessful()) {String responseBodyStr = response.body().string();System.out.println(responseBodyStr);return responseBodyStr;}} catch (Exception e) { // log.error(ExceptionUtils.getStackTrace(e));} finally {if (response != null) {response.close();}}return "";}/*** post 請求, 請求數據為 json 的字符串* @param url 請求url地址* @param json 請求數據, json 字符串* @return string*/public Response doPostJsonGetWxMiniAppQrCode(String url, String json) {RequestBody requestBody = RequestBody.create(JSON, json);Request request = new Request.Builder().url(url).post(requestBody).build();Response response = null;try {response = okHttpClient.newCall(request).execute();if (response.isSuccessful()) {return response;}} catch (Exception e) { // log.error(ExceptionUtils.getStackTrace(e));} finally {if (response != null) {response.close();}}return null;} }2. controller--Java代碼
@ApiOperation(value = "獲取微信小程序邀請二維碼圖片base64", notes = "獲取微信小程序邀請二維碼圖片base64", httpMethod = "GET")@GetMapping(path = "getWxMinappQrBase64")public PlatformResponse<String> getUnlimited() {Map<String, String> paramsAccessToken = new HashMap<>();paramsAccessToken.put("appid", "ddddddddddddd");paramsAccessToken.put("secret", "aaaaaaaaaaaaa");paramsAccessToken.put("grant_type", "client_credential");String responseAccessToken = null;Map<String, String> resultMapAccessToken = new HashMap<>();try {responseAccessToken = okHttpUtils.doGet("https://api.weixin.qq.com/cgi-bin/token", paramsAccessToken);resultMapAccessToken = (Map<String, String>) JsonUtils.decodeObject(responseAccessToken, Map.class);log.info(String.format("=========================小程序全局唯一后臺接口調用憑據access_token===================================="));if (resultMapAccessToken == null || resultMapAccessToken.size() <= 0) {log.info(String.format("=========================第一次失敗,重新獲取access_token===================================="));//如果失敗,則再次獲取responseAccessToken = okHttpUtils.doGet("https://api.weixin.qq.com/cgi-bin/token", paramsAccessToken);resultMapAccessToken = (Map<String, String>) JsonUtils.decodeObject(responseAccessToken, Map.class);if (resultMapAccessToken == null || resultMapAccessToken.size() <= 0) {log.info(String.format("=========================第二次失敗,重新獲取access_token===================================="));responseAccessToken = okHttpUtils.doGet("https://api.weixin.qq.com/cgi-bin/token", paramsAccessToken);resultMapAccessToken = (Map<String, String>) JsonUtils.decodeObject(responseAccessToken, Map.class);if (resultMapAccessToken == null || resultMapAccessToken.size() <= 0) {log.info(String.format("=========================第三次失敗,拋出異常access_token===================================="));return PlatformResponse.error(APIResponseStatus.U8993, APIResponseStatus.U8993.message());}}}} catch (Exception e) {log.info("============================================抓到了微信拋出的異常,捕獲后重新調用接口獲取============================================");responseAccessToken = okHttpUtils.doGet("https://api.weixin.qq.com/cgi-bin/token", paramsAccessToken);resultMapAccessToken = (Map<String, String>) JsonUtils.decodeObject(responseAccessToken, Map.class);if (resultMapAccessToken == null || resultMapAccessToken.size() <= 0) {log.info(String.format("=========================第三次失敗,拋出異常===================================="));return PlatformResponse.error(APIResponseStatus.U8993, APIResponseStatus.U8993.message());}}if (resultMapAccessToken.containsKey("access_token")) {String accessToken = resultMapAccessToken.get("access_token");//獲取當前登錄用戶邀請碼String userId = UserUtils.getCurrentUserId();User user = userService.getUserById(userId);//scene:自定義特殊入參--入參值格式為【變量=value】String scene = "inviteCode=" + user.getInviteCode();//page: 掃描二維碼后,跳轉至某個頁面String page = "pages/LiveRoom/LiveRoom/LiveRoom";//參考小程序開發文檔地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html//POST 參數需要轉成 JSON 字符串,不支持 form 表單提交。//接口只能生成已發布的小程序的二維碼//調用分鐘頻率受限(5000次/分鐘),如需大量小程序碼,建議預生成String urlStr = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;//使用restTemplate發送post請求RestTemplate restTemplate = new RestTemplate();JSONObject json = new JSONObject();json.put("page", page);json.put("scene", scene);byte[] resultBytes = null;try {resultBytes = restTemplate.postForObject(urlStr, json, byte[].class);log.info(String.format("=========================獲取二維碼===================================="));if (resultBytes == null || resultBytes.length == 0) {log.info(String.format("=========================第一次失敗,重新獲取二維碼===================================="));//如果失敗,則再次獲取resultBytes = restTemplate.postForObject(urlStr, json, byte[].class);if (resultBytes == null || resultBytes.length == 0) {log.info(String.format("=========================第二次失敗,重新獲取二維碼===================================="));resultBytes = restTemplate.postForObject(urlStr, json, byte[].class);if (resultBytes == null || resultBytes.length == 0) {log.info(String.format("=========================第三次失敗,拋出異常二維碼===================================="));return PlatformResponse.error(APIResponseStatus.U8994, APIResponseStatus.U8994.message());}}}} catch (Exception e) {log.info("============================================抓到了微信拋出的異常,捕獲后重新調用接口獲取============================================");resultBytes = restTemplate.postForObject(urlStr, json, byte[].class);if (resultBytes == null || resultBytes.length == 0) {log.info(String.format("=========================第三次失敗,拋出異常===================================="));return PlatformResponse.error(APIResponseStatus.U8994, APIResponseStatus.U8994.message());}}if (resultBytes != null && resultBytes.length > 0) {String resultImg = "data:image/png;base64," + Base64.getEncoder().encodeToString(resultBytes);return PlatformResponse.ok().resultData(resultImg);}}return PlatformResponse.error(APIResponseStatus.U8994, APIResponseStatus.U8994.message());}3.前端微信小程序代碼--解析微信掃碼小程序二維碼--解析入參:
if?(options.scene)?{?//通過邀請進來的let?scene?=?decodeURIComponent(options.scene);console.log(scene?);let?inviteCode?=?scene.slice(-4);console.log(inviteCode?);}總結
以上是生活随笔為你收集整理的java生成微信小程序二维码,前台扫描识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java内存模型_基础
- 下一篇: 单例模式,双重检查实现线程安全