文章目录

  • 前言
    • 应用场景
    • 微信小程序官网
  • 1.RestTemplate方式
    • 核心代码
    • getAccessToken
  • 2. Unirest方式
    • Maven依赖
    • 核心代码
  • 3. okhttp3方式
    • Maven依赖
    • 核心代码
  • 4. Apache的HttpClient方式
    • Maven依赖
    • 核心代码
  • 5. JDK自带的URLConnection方式
    • 核心代码
  • 其它细节
    • 构建参数map
    • byte[]数组

前言

应用场景

先介绍一下项目场景,主要是通过微信小程序二维码裂变分享,每个账号有专属邀请二维码,分享出去,有新人扫码入驻,就可以得到现金奖励或红包奖励。当然,产品设计会更丰富,不止有裂变模式,还有渠道推广模式,还有各种奖励规则,但核心实现都是生成二维码。对于如何生成微信小程序二维码,本文一共列举了5种实现方式,其中第4、5种是网上常见的方式,第1、2、3种封装的更为优雅。

微信小程序官网

项目主要用的是微信官方提供的服务端能力,考虑到涉及secret和token等安全问题,所以从架构上设计的调用链路为:前端->后端API->微信API。裂变的场景决定要选择获取不限制的小程序码接口,永久有效,数量暂无限制,接口英文名:getUnlimitedQRCode。

官方地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html

1.RestTemplate方式

这也是我们项目实际使用的方式,使用Spring框架开发,还是强烈推荐使用Spring的RestTemplate,它是对于其它方式的高级封装,内部可以配置ClientHttpRequestFactory来指定底层请求方式:

  • 指定为SimpleClientHttpRequestFactory,则内部使用JDK自带的HttpURLConnection方式
  • 指定为HttpComponentsClientHttpRequestFactory,则内部使用Apache HttpClient方式
  • 指定为OkHttp3ClientHttpRequestFactory,则内部使用okhttp3方式

核心代码

public byte[] getWechatQrcodeByRestTemplate(String url, Map<String, Object> body) {return restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(body, null), byte[].class).getBody();
}

另外,RestTemplate在构造函数中默认增加了ByteArrayHttpMessageConverter,可以读取和写入字节数组的HttpMessageConverter的实现,默认情况下,此转换器支持所有媒体类型(media types)。

getAccessToken

这是接口调用凭证,用restTemplate调用也是非常简洁,核心代码如下:

private String wechatQrcodeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=";
private String appid = "替换成你的appid";
private String s = "替换成你的secret";public String getAccessToken() {String url = String.format(wechatAccessTokenUrl, appid, s);Map<String, String> responseBody = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<Map<String, String>>() {}).getBody();if (responseBody == null || responseBody.get("errcode") != null) {// 获取失败System.out.println("getAccessToken失败:" + (responseBody == null ? "null" : responseBody.toString()));return null;}return responseBody.get("access_token");
}

对于access_token,建议保存到redis,2小时过期后再获取

2. Unirest方式

Maven依赖

<dependency><groupId>com.konghq</groupId><artifactId>unirest-java</artifactId><version>3.11.11</version>
</dependency>

okhttp3方式其实不管是性能还是代码的链式调用,都已经非常优秀。但作为底层基于Apache HttpClient方式的unirest-java,提供了更为便捷、链式调用、功能强大的API用于http请求!核心代码如下(一行代码搞定,屌爆了!!!):

核心代码

public byte[] getWechatQrcodeByUnirest(String url, Map<String, Object> body) {return Unirest.post(url).body(JSONObject.toJSONString(body)).asBytes().getBody();
}

3. okhttp3方式

Maven依赖

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.2</version>
</dependency>

okhttp3是Square公司开发,用于替代 HttpUrlConnection和Apache HttpClient方式,优雅的 API 设计,且链式调用,让你顺滑到底!

核心代码

public byte[] getWechatQrcodeByOkhttp3(String url, Map<String, Object> body) {OkHttpClient client = new OkHttpClient().newBuilder().build();okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");RequestBody requestBody = RequestBody.create(mediaType, JSONObject.toJSONString(body));Request request = new Request.Builder().url(url).method("POST", requestBody).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {return response.body().bytes();}} catch (IOException e) {e.printStackTrace();}return null;
}

4. Apache的HttpClient方式

Maven依赖

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.12</version>
</dependency>

HttpClient 相比于 JDK 自带的 URLConnection方式,代码做了封装,可读性和简洁度都显著提升!核心代码如下:

核心代码

public byte[] getWechatQrcodeByHttpClient(String url, Map<String, Object> body) {CloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpPost httpPost = new HttpPost(url);try {StringEntity entity = new StringEntity(JSONObject.toJSONString(body));entity.setContentType("image/png");httpPost.setEntity(entity);HttpResponse response = httpClient.execute(httpPost);try (InputStream inputStream = response.getEntity().getContent();ByteArrayOutputStream out = new ByteArrayOutputStream()) {byte[] buffer = new byte[1024];int len = -1;while ((len = inputStream.read(buffer)) != -1) {out.write(buffer, 0, len);}return out.toByteArray();}} catch (Exception e) {e.printStackTrace();}return null;
}

5. JDK自带的URLConnection方式

在网上常见的方式,这是从 JDK1.1 开始就自带的Http请求方式,核心代码如下:

核心代码

public byte[] getWechatQrcodeByHttpURL(String url, Map<String, Object> body) {HttpURLConnection httpURLConnection = null;try {httpURLConnection = (HttpURLConnection) new URL(url).openConnection();httpURLConnection.setRequestMethod("POST");// 发送POST请求必须设置如下两行httpURLConnection.setDoOutput(true);httpURLConnection.setDoInput(true);// 获取URLConnection对象对应的输出流PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());// 发送请求参数printWriter.write(JSONObject.toJSONString(body));// flush输出流的缓冲printWriter.flush();//开始获取数据try (InputStream inputStream = httpURLConnection.getInputStream();ByteArrayOutputStream out = new ByteArrayOutputStream()) {byte[] buffer = new byte[1024];int len = -1;while ((len = inputStream.read(buffer)) != -1) {out.write(buffer, 0, len);}return out.toByteArray();}} catch (Exception e) {e.printStackTrace();} finally {if (httpURLConnection != null) {httpURLConnection.disconnect();}}return null;
}

JDK自带的方式,功能虽然可以实现,但代码看上去确实跟不上时代发展了!

其它细节

构建参数map

body 就是参数Map,需要根据实际情况自行设定:

Map<String,Object> body = new HashMap<>();
// 场景码,与前端约定,最终是需要前端解析
body.put("scene", scene);
// 正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
body.put("env_version", envVersion);
// 透明,根据你的场景自行设置body参数
body.put("is_hyaline", true);

byte[]数组

为什么要先得到byte[]数组?,因为我们需要先判断返回结果是否包含errcode,如果不包含,才是图片Buffer!

如果不包含errorCode,那么byte[]数组不管是保存本地,还是转成Base64,或者上传到OSS,都非常湿滑了!

  • 保存本地
private void saveQrCodeToLocal(byte[] bytes) {try {InputStream inputStream = new ByteArrayInputStream(bytes);FileOutputStream out = new FileOutputStream("d:\\test.png");byte[] buffer = new byte[8192];int bytesRead = 0;while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {out.write(buffer, 0, bytesRead);}out.flush();inputStream.close();out.close();} catch (IOException e) {e.printStackTrace();}
}
  • Base64
Base64.getEncoder().encodeToString(bytes);
  • 上传OSS
    这是我们项目使用的, 底层做了封装,直接传byte[]即可,非常方便!

❤️ 博客主页:https://blog.csdn.net/u011397981
❤️ 欢迎点赞

【java】Java生成微信小程序二维码相关推荐

  1. Java生成微信小程序二维码

    Java生成微信小程序二维码 import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.Byt ...

  2. Java生成微信小程序二维码,5种实现方式,一个比一个简单

    文章目录 前言 先看官网 一.JDK自带的URLConnection方式 二.Apache的HttpClient方式 三.okhttp3方式 四.Unirest方式 五.RestTemplate方式 ...

  3. 生成微信小程序二维码(携带参数跳转指定页面)

    需求:生成微信小程序二维码并携带参数,扫码跳转指定页面 获取WxMaService对象 WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl ...

  4. Java生成微信小程序二维码、上传至阿里云OSS

    依赖 <!-- 阿里云oss依赖 --><dependency><groupId>com.aliyun.oss</groupId><artifac ...

  5. c# 生成微信小程序二维码

    二维码生成 CreateWxCode("id=117", "pages/bookcheck/bookchecktime/bookchecktime", &quo ...

  6. 如何生成微信小程序二维码,小程序内页二维码

    你自己得有个微信公众号,只需要知道小程序的名字就可以了 生成小程序二维码 第一步编辑素材 第二步搜索小程序名字,然后回车,下一步 第三步选小程序码 小程序内页二维码 第一步编辑素材 第二步搜索小程序名 ...

  7. django --生成微信小程序二维码

    官文: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimit ...

  8. java生成微信小程序二维码(自定义带参)

    准备工作: 1:获取微信小程序apiKey 2:获取微信小程序密钥 3:获取微信小程序页面链接 pom依赖: <dependency><groupId>com.alibaba& ...

  9. 生成微信小程序二维码,可跳转到小程序指定页面。

    1.登录微信公众平台 2.登录成功后点击,工具-生成小程序码 3.根据小程序各种信息搜索到已上线的小程序,点击下一步 4.根据自己二维码要跳转的页面填写对应路径 5.保存二维码,扫码即可使用

最新文章

  1. confluence 编辑器这次没有加载_玩转爱普生打印机自带的任务编辑器Lite版
  2. 关于 HeartBleed 安全漏洞的 2 张漫画
  3. xp系统桌面计算机不见了怎么办,XP系统的垃圾箱在桌面上不见了!怎么处理?
  4. 【BZOJ3611】【HeOI2014】—大工程(虚树+dp)
  5. 【Java网络编程(二)】UDP案例——在线咨询
  6. 牛客网暑期ACM多校训练营(第一场)
  7. 工作260:js判断一个数组是否包含一个指定的值
  8. byte数组添加数据_C#基于S7协议实现对PLC中DB块字节数据的获取及自定义textbox实现数据解析...
  9. AD转换中参考电压的作用 .
  10. ADI芯片的通用SPI接口设计
  11. 条令考试小程序辅助器_应知应会|条令纲要学习微课堂(六)
  12. 【Java从0到架构师】项目实战 - 驾考(旧)- Freemarker、MyBatis-Plus
  13. 二维码----百度百科
  14. 神奇的分形艺术(一):无限长的曲线可能围住一块有限的面积
  15. 解决显示“此图片来自微信公众平台未经允许不可引用”错误图片
  16. PC微信端浏览器js点击失效
  17. jmeter分布式操作之远程启动功能
  18. MySQL-表连接的几种方式
  19. 公众号运营该如何快速找到内容方向定位?
  20. 梁辉老师.狼性营销实战训练专家

热门文章

  1. V-Calendar 日历demo组件使用
  2. 如何在 iPhone 和 iPad 上关闭照片的地理标记
  3. 按关键字搜索淘宝商品 API 返回值说明
  4. GIS数据漫谈(五)— 地理坐标系统
  5. 职业女性确实处于劣势吗?记一次不甚严谨的考据 -- 向胡适之先生的遥远致敬
  6. [源码]跳转MIUI神隐模式列表以及具体设置界面
  7. MacBook OS Air密码忘了,苹果电脑密码忘了怎么办,密码恢复
  8. 给新手准备的一些常用冷门知识点
  9. 打印设置自定义表尾_Excel2013打印时怎么固定表头及表尾让打印后的每页都可以看得到...
  10. 字符串176、寻找字符串