【java】Java生成微信小程序二维码

article/2025/9/19 11:18:43

文章目录

  • 前言
    • 应用场景
    • 微信小程序官网
  • 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
❤️ 欢迎点赞👍 收藏 ⭐留言✏️ 如有错误敬请指正!
❤️ 本文由 逆流°只是风景 原创,首发于 CSDN博客🙉
❤️ 停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活


http://chatgpt.dhexx.cn/article/bIdGGKsn.shtml

相关文章

如何生成背景透明的微信小程序二维码

如何生成背景透明的微信小程序二维码 透明背景参数 透明背景参数 is_hyaline 是否需要透明底色&#xff0c; is_hyaline 为true时&#xff0c;生成透明底色的小程序码 public function getQRCodeB($scene,$page,$widthnull,$auto_colornull, $line_colornull){$url ApiUrl…

java创建微信小程序二维码

创建微信小程序二维码有两个接口需要 一个是获取tocken的接口 一个是生成二维码的接口 获取tocken接口 //**********填写你的小程序appid 和 secret public static String getAccessToken() throws IOException {//获取tokcen接口String url "https://api.weixin.qq.com…

带参数的微信小程序二维码生成

使用场景&#xff1a;扫描生成的小程序码&#xff0c;打开小程序并调整到指定页面并携带参数&#xff0c;比如购买商品详情页面。 使用方法&#xff1a;通过调用微信小程序二维码接口生成。 接口文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/qrcod…

springboot实现微信小程序二维码生成

一、微信小程序创建 先要去微信公众平台注册一个小程序,每个小程序都有相应的AppID(小程序ID)和AppSecret(小程序密钥),它们是获取ACCESS_TOKEN所需要的。微信公众平台地址: https://mp.weixin.qq.com/ 注册添加小程序后会取得AppID(小程序ID)和AppSecret(小程序密钥): 二…

微信小程序二维码生成工具,后端二维码生成工具类。

微信小程序开发二维码生成工具类 前言业务背景设计思路具体实现接下来我们进行工具的改造 前言 或许这是你搜寻的第n篇文章来解决你项目中的问题&#xff0c;虽然我不能去替你完全适配你的业务需求&#xff0c;但是我可以给你一个解决问题的思路&#xff01;或许 这是你第一次…

生成普通的微信小程序二维码

1.登录微信小程序后台传送门 开发管理->开发设置->扫普通链接二维码打开小程序 在这里开通此功能,然后按微信定义的规则配置具体的地址,等正式上线的时候再发布该规则 2.然后按照配置的二维码规则(上图第三项)去直接生成普通的二维码(可自行携带参数),然后微信扫一扫就…

JAVA微信小程序二维码生成,Base64格式输出。

调用接口必要条件&#xff0c;微信公众号的APPID&#xff0c;APPSECRET 微信公众平台小程序二维码文档 // 先获取AccessToken,不然无法请求调取小程序二维码/*** 获取微信小程序接口access_token凭证*/ public Map<String,String> getAccessToken() {String url "h…

微信小程序二维码生成器

微信小程序二维码生成器 项目介绍 项目是一个简单实用的二维码生成器。可以输入相关的网址&#xff0c;生成二维码图片&#xff0c;可保存分享。 项目展示 项目代码 index.wxml <!--pages/main/index.wxml--> <view class"container-box"><view …

微信小程序二维码生成

首先需要引入二维码生成工具weapp-qrcode.js或者直接安装npm install weapp-qrcode --save import QRCode from ../../utils/weapp-qrcode.js 页面使用cavas <canvas style"width:160rpx;height:160rpx" canvas-id"myQrcode"></canvas> 生…

微信小程序任意指定页面生成二维码

在日常微信小程序运营中&#xff0c;文章&#xff0c;和朋友圈海报内总会用到微信小程序特定页面二维码 第一步&#xff1a;登录微信公众平台https://mp.weixin.qq.com/ 第二步&#xff1a;点击右上角工具-》生成小程序码 第三步&#xff1a;将鼠标放置“获取更多页面路径”&a…

微信小程序实现输入内容生成二维码(canvas)

1.封装好的QRcode的js文件 !function() {function r(r, o) {var f;r > o && (f r, r o, o f), f o, f * o, f o, f >> 1, p[f r] 1;}function o(o, f) {var e;for (F[o l * f] 1, e -2; e < 2; e) F[o e l * (f - 2)] 1, F[o - 2 l * (f e…

二、业务数据采集平台

第1章 电商业务简介 1.1 电商业务流程 电商的业务流程可以以一个普通用户的浏览足迹为例进行说明&#xff0c;用户点开电商首页开始浏览&#xff0c;可能会通过分类查询也可能通过全文搜索寻找自己中意的商品&#xff0c;这些商品无疑都是存储在后台的管理系统中的。 当用户寻找…

从0到1搭建大数据平台之数据采集系统

关于从0到1搭建大数据平台&#xff0c;之前的一篇博文《如何从0到1搭建大数据平台》已经给大家介绍过了&#xff0c;接下来我们会分步讲解搭建大数据平台的具体注意事项。 一、“大”数据 海量的数据 当你需要搭建大数据平台的时候一定是传统的关系型数据库无法满足业务的存储计…

大数据之数据采集

本篇主要介绍目前网站数据采集的主流方式&#xff0c;之后篇章会介绍客户端数据采集目前主流的实现方式。 目前有很多数据采集云平台&#xff0c;如Google anylytics&#xff0c;百度统计&#xff0c;腾讯统计等等&#xff0c;还有一些平台也非常不错&#xff1a; 一.友盟&…

3. 业务数据采集平台概述

3. 业务数据采集平台概述 电商业务简介电商业务流程电商常识SKU和SPU平台属性和销售属性 电商业务数据电商系统表结构活动信息表&#xff08;activity_info&#xff09;活动规则表&#xff08;activity_rule&#xff09;活动商品关联表&#xff08;activity_sku&#xff09;平台…

测量数据采集分析平台

青创智通科技测量数据采集分析平台&#xff0c;改变传统纸张方式&#xff0c;快速实现生产质量管理的数字化、智能化、平台化。 产品优势&#xff1a; 1、检测智联与精益生产&#xff1a;实现产品制造过程各部位的尺寸测量、测量信息采集、实时传输及数据分析。 2、与各种智…

数据运营平台-数据采集

目录 行为数据采集 业务数据采集与转换 第三方系统API对接 用户数据关联 人工数据采集 数据输出 行为数据采集 1.埋点采集 ①跨平台打通 确定性方法识别 利用用户帐号体系中&#xff0c;可以是系统生成的 UserID&#xff0c;可以是手机号&#xff0c;也可以是邮箱&am…

大数据采集概述

文章目录 大数据采集概述1.互联网大数据与采集1.1互联网大数据来源1.社交媒体2.社交网络3.百科知识库4.新闻网站5.评论信息6.位置型信息 1.2 互联网大数据的特征1.大数据类型和语义更加丰富2.数据的规范化程度弱3.数据的流动性更大4.数据的开放性更好5.数据的来源更加丰富6.互联…

大数据项目离线数仓(全 )一(数据采集平台)

搭建用户行为数据采集平台、搭建业务数据采集平台、搭建数据仓库系统、制作可视化报表 本篇博客包括搭建用户行为数据采集平台、搭建业务数据采集平台 搭建数据仓库系统在大数据项目离线数仓&#xff08;全 &#xff09;二 制作可视化报表在大数据项目离线数仓&#xff08;全…

采集平台-大数据平台数据采集系统

随着社会的发展。人们也是越来越离不开互联网&#xff0c;今天小编就给大家盘点一下免费的采集平台&#xff0c;只需要点几下鼠标就能轻松爬取数据&#xff0c;不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四&#xff01; 企业人员 通过爬取动态网页数…