首先先扯一些题外话,本人是java行业的小白,因为是改行做的java,之前的工作就不提了。
之前写过几篇随便,刚看了下,觉得比较low,就都删了,所以也算是进入java行业的第一篇随笔,如果有表述上或者技术上说的不到位的地方,请大佬们多多包涵,先谢过。
讲一下小程序的二维码的原因,是因为这个业务确实困扰了我好几天,还有小程序最近还是蛮火的,后期等支付功能做完了,会把支付功能也简单的捋一下。
我们公司的业务都是前后端分离的,我负责的是后端java,所以主要还是针对java部分讲一下。
回归正题,描述一下业务,利用小程序前端传参给后端,后端生成二维码,保存到本地,前端调用本地二维码图片,显示,用户可以扫描二维码获取相应界面。后端获取二维码的流程:向服务器发送url+appid和secret以获取token,再向服务器发送token和scene参数获取二维码参数,参数保存为图片格式。贴上主要代码:
//controller中处理主要业务
public R createRoomCode(int roomId) throws IOException { //获取token_access String params=grant_type_code+"&appid="+app_id+"&secret="+secret; String sr = HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/token?grant_type", params); JSONObject json=JSONObject.fromObject(sr); String token_access=sr.substring(sr.indexOf(":")+2,sr.indexOf(",")-1); String sceneStr=""+roomId; HttpUtil.getminiqrQr(sceneStr,token_access); return R.ok("succ");}
//getminiqrQr类处理返回的二维码参数保存图片
public class HttpUtil { public static Map getminiqrQr(String sceneStr, String accessToken) { RestTemplate rest = new RestTemplate(); InputStream inputStream = null; OutputStream outputStream = null; try { String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken; Map<String,Object> param = new HashMap<>(); param.put("scene", sceneStr); param.put("path", "pages/bookinglist/bookinglist"); param.put("width", 300); 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); System.out.println("调用生成微信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]); System.out.println("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody()); byte[] result = entity.getBody(); inputStream = new ByteArrayInputStream(result); File file = new File("D:/workSpace/wechat2.0/03-Source/java2.0/room/pic/1.png"); if (!file.exists()){ file.createNewFile(); } outputStream = new FileOutputStream(file); int len = 0; byte[] buf = new byte[1024]; while ((len = inputStream.read(buf, 0, 1024)) != -1) { outputStream.write(buf, 0, len); } outputStream.flush(); } catch (Exception e) { System.out.println("调用小程序生成微信永久小程序码URL接口异常"); } finally { if(inputStream != null){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(outputStream != null){ try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; }}下面的坑就是经验不足了,我启动后端服务器后,前端无法访问我上面指定图片保存的路径,后来问了大佬,在ieda项目resources文件夹下新建一个static文件夹,将图片放入其中,然后就可以在网页上请求路径格式如https://域名:端口号/项目名称/图片名称.png就可以访问了前端直接访问这个路径就可以预览二维码。参考网页找不到了,不过谢谢网上的大佬和公司的大佬。