微信小程序生成二微码(JAVA)

article/2025/6/26 4:21:47

前段时间在项目中,写了一个生成微信二微码的功能,之所以会开发这个功能,是因为我们做的小程序要进行推广让用户扫我们做的小程序的二微码进行去体验,功能实现的场景大概是: 后台生成小程序二微码,返回到后台页面进行展示,然后在点击下载二微码图片,下载到本地进行保存,业务场景就是这样,好了现在我们来看看微信小程序生成二微码。

微信开发文档

首先我先看微信开发文档的API,和接口描述,其实微信开发很简单只要我们花时间去看文档的一些介绍和接口的规则和一些常见会放的错误,这样就可以很好完成所有的微信开发,主要是能看懂开发文档和会看文档
首先进入微信开发文档的框架这里 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html
在这里插入图片描述
这里是获取二微码的一些场景和一些注意事项大家仔细的去看一下,我这里只需要接口B的场景,生成个数不受限制,大家要根据自己的业务场景去选择相对的接口去实现,不要随意去调用接口,接口是有请求的限制的
看完规则我们就来看一下API接口描述:
https://developers.weixin.qq.com/miniprogram/dev/api/createWXAQRCode.html

在这里插入图片描述
这里是不受限制获取二微码的接口,看上面的图我们就能看出来,调用这个接口:
1.接口请求必须是POST请求方式
2.调用接口需要先获取到接口凭证,这就是说前面还需要在调用一个接口(接口凭证接口请看)https://blog.csdn.net/qq_41971087/article/details/82559144
3.参数 scene 这个是调用接口参数,请看说明进行处理,我们这里是放入是景区id
4.参数page 这个是小程序的路径,就是生成二微码后用户扫描进入的首页是哪个页面的意思

返回值:
在这里插入图片描述
这里要注意了返回值如果是json数据格式就是错误的,如果是图片二进制的就是调用成功了,这样我们就用流的方式(字节流)把数据读到了我们的图片中然后在页面中展示进行下载就可以了

下面看代码:
Controller层:

	 /*** 获取小程序码,适用于需要的码数量极多的业务场景* @param spotid 这里是接口参数  scene  (我这里是景区id)* @param path 这里是接口参数 pages/index/index (主页的意思)* @return*/@RequestMapping("/getwxacodeunlimit.do")@ResponseBodypublic Object getwxacodeunlimit(String spotid,String path,HttpServletRequest request) {//这里是我的service层的代码,我从后台页面传入 spotid 景区id 和path 二微码主页 和 request 传到service中进行业务处理//request 传入的原因是我需要获取到当前项目的路径HttpRequestResult getwxacode = theMicrocodeServiceImpl.getwxacodeunlimit(spotid,path,request);Map<String,Object> map = new HashMap<String,Object>();map.put("image", getwxacode.getContent()); //接口调用成功 把图片返回到页面中map.put("success", getwxacode.isSuccess());//是否成功 true falsereturn map; }

Service层:

	//获取小程序二维码,适用于需要的码数量较少的业务场景 接口private final String CREATEWXAQRCODE= "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=";//获取接口凭证private final String GRANT_TYPE="https://api.weixin.qq.com/cgi-bin/token";/*** 获取小程序码,适用于需要的码数量极多的业务场景 * scene 景区id* path 主页*/@Overridepublic HttpRequestResult getwxacodeunlimit(String scene,String path,HttpServletRequest request) {//这里要说一下 这个代码的意思是我要调用接口获取接口凭证 //adminAppConfig.getWxLiteAppid()  appid   adminAppConfig.getWxLiteAppSecret(); secret 这个都是后台给的填上就好了String  param="grant_type=client_credential&appid="+adminAppConfig.getWxLiteAppid()+"&secret="+adminAppConfig.getWxLiteAppSecret();HttpRequestResult doPost =null;//发送请求  获取接口凭证String setGet = HttpUtils.setGet(GRANT_TYPE, param);//json转换成对象JSONObject json = JSONObject.parseObject(setGet);   //获取接口凭证String access_token = json.get("access_token").toString();HttpRequest httpRequest = new HttpRequest();//拼接接口 获取二微码String url=API_GETWXACODEUNLIMIT+access_token;//参数Map<String, String> params = new HashMap<String, String>();params.put("scene",scene);params.put("path", path);HttpRequestParams httpRequestParams = httpRequest.new HttpRequestParams(url,params);//获取当前路径String realPath = request.getSession().getServletContext().getRealPath("/");//判断当前目录是否存在 不存在就创建File file = new File(realPath);if (!file.getParentFile().exists()) {boolean result = file.getParentFile().mkdirs();if (!result) {doPost.setSuccess(false);return doPost;}}String uuid = UUID.randomUUID().toString().replaceAll("-","");String filename="/qrcode/"+uuid+"."+"png";realPath=realPath+filename;//给工具类进行操作//httpRequestParams 接口和参数//realPath 路径 成功后把流写入到这个.png图片中doPost = httpRequest.doPosts(httpRequestParams,true,realPath);doPost.setContent(filename);return doPost;}

工具类:

	public HttpRequestResult doPosts(HttpRequestParams requestParams,boolean postJson,String file) {PrintWriter out = null;BufferedReader ins = null;BufferedInputStream in =null;StringBuffer result = new StringBuffer("");HttpRequestResult httpResult = new HttpRequestResult();try {// 打开和URL之间的连接HttpURLConnection conn = getHttpURLConnection(requestParams.getUrl(), requestParams.getProxy());// 设置通用的请求属性if (TIMEOUT_IN_MILLIONS > 0) {conn.setReadTimeout(TIMEOUT_IN_MILLIONS);conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);}// cookie设置if (KEEP_COOKIE)conn.setRequestProperty("Cookie", getCookieStr());// 请求头设置Map<String, String> headers = new HashMap<String, String>();headers.putAll(defaultHeaders);headers.putAll(requestParams.getHeaders());if (headers != null && headers.size() > 0) {for (Map.Entry<String, String> entry : headers.entrySet()) {conn.addRequestProperty(entry.getKey(), entry.getValue());}}conn.setUseCaches(false);// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);conn.setInstanceFollowRedirects(true);if(postJson) {// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(JSON.toJSONString(requestParams.getParams()));// flush输出流的缓冲out.flush();}else {String paramStr = requestParams.getParams() == null ? null : prepareParam(requestParams.getParams());if (paramStr != null && !paramStr.trim().equals("")) {// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(paramStr);// flush输出流的缓冲out.flush();}}// conn.setRequestProperty("Content-type", "application/json"); //	String requestProperty = conn.getRequestProperty("Content-Type");String headerField = conn.getHeaderField("Content-Type");System.out.println(headerField+"-------------------------" +JSON.toJSONString(conn.getHeaderFields()));if(headerField.equals("application/json")) {httpResult.setStatus(conn.getResponseCode());// 定义BufferedReader输入流来读取URL的响应if (conn.getResponseCode() == 200) {ins = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));String line;while ((line = ins.readLine()) != null) {result.append(line);}httpResult.setSuccess(false);httpResult.setContent(result.toString());} else {throw new Exception("request is not 200");}}httpResult.setStatus(conn.getResponseCode());// 定义BufferedReader输入流来读取URL的响应if (conn.getResponseCode() == 200) {in = new BufferedInputStream(conn.getInputStream());//C:/Program Files/Desktop/3.pngFileOutputStream fileOut = new FileOutputStream(file);DataOutputStream dataOut = new DataOutputStream(fileOut);String line;int temp;while ((temp = in.read()) != -1) {dataOut.write(temp);}dataOut.flush();dataOut.close();httpResult.setSuccess(true);httpResult.setContent(result.toString());} else {throw new Exception("request is not 200");}if (KEEP_COOKIE)storeCookie(conn);} catch (Exception e) {e.printStackTrace();httpResult.setError(e);}// 使用finally块来关闭输出流、输入流finally {try {if (out != null)out.close();if (in != null)in.close();} catch (IOException ex) {}}return httpResult;}

好了大概就是这样了这只是一个实例,大家看我上面的描述自己都可以去手写了,我的代码可能有些工具类没有,很麻烦就不写上去了,代码大概就是这样了,有什么问题就在下方评论我会一一回复


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

相关文章

联想SR850系列微码升级

1. 通过服务器管理口&#xff08;X-clarity controller&#xff09;收集日志.方法是使用直连线(此网口可自适应 连接方式)将此网口连接于一台终端机(笔记本或台式机). 2. .将笔记本的网卡 IP 设置为与“192.168.70.125”处于同网段的 IP&#xff08;如&#xff1a; 192.168.70.…

IBM V7000存储升级微码

一、前期准备 目前使用的V7000型号为2076-124,没有扩展柜,当前版本为6.4.1.4,比较老旧,需要升级到相对新的版本。 1.确定当前机器可升级的最高版本 打开网页 http://www-01.ibm.com/support/docview.wss?rs=591&uid=ssg1S1003850 ,可以看到下表,可以看到2076-124这个…

hpux-hp superdome 9000 升级微码

新加入cell板&#xff0c;查看、升级CELL板微码。 一.查看主机微码 升级xyy主机&#xff0c;用Lan console连接到MP卡中&#xff0c;进入Command Menu菜单中&#xff0c;执行命令sysrev检查当前所插的CELL板微码 可以看出&#xff0c;当前5块CELL板安装在0、2、3、4、6槽位&am…

linux下查看硬盘微码,什么是固件或微码,以及如何更新我的硬件?

固件是一种运行在硬件设备上的软件&#xff0c;用于执行低级任务。 例如&#xff0c;从电视遥控器到电脑硬盘驱动器到空中Drone的所有内容都运行自己的固件。 微码基本上是你的CPU的固件。 什么是固件&#xff1f; 软件是指在设备上运行的程序&#xff0c;应用程序和其他计算机…

linux查看cpu微码命令,下载 Linux * 处理器微码数据文件

适用于 Linux * 的英特尔处理器微套件软件包 CPU 微码是一种更正现有系统中的特定勘误表的机制。 应用微代码更新的一般首选方法是使用系统 BIOS,但对于英特尔处理器的一部分,这可以在运行时完成 使用操作系统。此软件包包含的处理器 支持对微码更新进行操作系统加载。 此软件…

uni-app 开发华为 微码小程序

uni-app 开发华为 微码小程序 文章目录 uni-app 开发华为 微码小程序背景通过uni-app生成一个h5应用通过微码开发者工具新建一个微码应用进阶官方解决方案 背景 之前一直使用uni-app开发小程序、H5应用。近期公司有意向使用华为的welink产品作为移动OA。正好近期项目不是特别忙…

linux查看cpu微码命令,如何在Linux上安装/更新Intel微码固件

如果你是一个 Linux 系统管理方面的新手,如何在 Linux 上使用命令行方式去安装或者更新 Intel/AMD CPU 的微码固件呢? 微码microcode就是由 Intel/AMD 提供的 CPU 固件。Linux 的内核可以在引导时更新 CPU 固件,而无需 BIOS 更新。处理器的微码保存在内存中,在每次启动系统…

Brocade 交换机微码升级方法大全

1 通过Brocade交换机自带U盘升级 1.1准备微码 将交换机微码解压缩后放到U盘的firmware目录下&#xff0c;注意firmware目录下只能包含一层目录&#xff0c;例如&#xff1a;brocade/firmware/v6.4.2b。 1.2用单网线通过IE升级 将微码复制到U盘的firmware路径下&#xff0c;并…

CPU微码介绍

微码作用 微码是指令和实现电路之间的隔离。 指令对不同的CPU可以是相同的&#xff0c;但是微码确是对于特定的电路结构而言的&#xff0c;不同电路结构对应的微码不一样&#xff0c;是特定设计的CPU的一部分。 微码可以保存在ROM中&#xff0c;也可以保存在内存中。 微码的加…

固件和微码到底啥区别

固件和微码到底啥区别 话说微码这个词&#xff0c;真是高格调。冬瓜哥刚入行的时候&#xff0c;经常听到I系工程师们的口头禅“升级微码”。当时觉得真是牛啊&#xff0c;啥叫微码&#xff1f;微码和固件又是啥关系&#xff1f;别说&#xff0c;冬瓜哥当年还真请教过这些现在已…

微码micrcode/ucode

目录 1.微码和汇编语言的区别 2.汇编程序的编译过程 3.编译的过程 高级语言为什么不直接编译成机器码,而编译成汇编代码? Microcode是什么&#xff1f;它为什么能修正CPU硬件错误&#xff1f; Microcode如何打补丁 1.微码和汇编语言的区别 微码&#xff1a;micrcode/uc…

一般纳税人有限公司可以享受的税收优惠政策有哪些?

本文作者&#xff1a;财税小喇叭 《财税小喇叭》专注于园区招商&#xff0c;利用地方性税收优惠政策助力企业减税降费&#xff01; 前言&#xff1a;一般纳税人有限公司主要涉及四大税种&#xff0c;增值税、企业所得税、附加税、分红税。增值税一般是3%、6%、9%、13%&#xff…

2021年重庆园区税收政策,帮助企业解决进项少税负高的问题

本文作者&#xff1a;财税小喇叭 《财税小喇叭》专注于园区招商&#xff0c;利用地方性税收优惠政策助力企业减税降费&#xff01; 最让企业头疼的问题之一就是企业进项少&#xff0c;进项少会出现什么问题呢&#xff1f;直观的就是导致企业多缴税税负高。 像一些商贸公司就普遍…

增值税怎样进行税收筹划可节税?奖励扶持比例最高80%

增值税怎样进行税收筹划可节税?奖励扶持比例最高80% 本文作者&#xff1a;财税小喇叭 《财税小喇叭》专注于园区招商&#xff0c;利用地方性税收优惠政策助力企业减税降费&#xff01; 前言&#xff1a;除税法规定外&#xff0c;增值税的免税、减税项目由国务院规定&#xff0…

一般纳税人,可以享受哪些税收优惠政策?

《财税小喇叭》专注于园区招商&#xff0c;利用地方性税收优惠政策助力企业减税降费&#xff01; 本文转自微信公众号【财税小喇叭】 众所周知&#xff0c;国家为了助力中小企业发展&#xff0c;对于小规模纳税人推出了一系列税收优惠政策&#xff1b;两会召开后&#xff0c;小…

税负压力大怎么办?享受税收优惠政策进行合理税务筹划

本文作者&#xff1a;财税小喇叭 《财税小喇叭》专注于园区招商&#xff0c;利用地方性税收优惠政策助力企业减税降费&#xff01; 提起税负压力应该是每个企业负责人都有所共鸣的&#xff0c;所以遇到税负压力大的问题很多的企业负责人会搜索相关的政策以此来降低所得税&…

股东分红税高达20%,该怎么节税?

股东分红税高达20%&#xff0c;该怎么节税&#xff1f; 别吃大亏了!股东分红个税高达20%&#xff0c;这样做节税很实在&#xff01; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 企业成立的初衷就是为了赚钱&#xff0c;以盈利为…

如何解决企业税务压力?这些企业税收优惠政策您要了解

作为如今的企业来说,不得不说税务的压力都是十分巨大的。不少气企业在这方面都差不多。那么如何解 决企业税务压力?这些企业税收优惠政策您要了解! 首先:企业缺少进项,增值税高 想要解决增值税压力,可以选择有限公司税收奖励扶持政策,通过在总部经济招商园区成立一家有…

算算新税率比老费率少扣多少钱 --- 2018年10月1日 新的税收费率改革

2018年10月开始使用新个税计算方法&#xff0c;起征整由原来的3500变成了5000&#xff0c;这个月发的工资&#xff0c;算一算扣了多少税! 工资个税的计算公式为&#xff1a;应纳税额(工资薪金所得 -“五险一金”-扣除数)适用税率-速算扣除数 新的个税免征额是5000&#xff0c;使…

新形势下个体税收征管工作探析

国家税务征收实质上就是对个人财产的一种再分配过程。税制改革是我国新时期财税体制改革的重点任务之一&#xff0c;在此&#xff0c;个人所得税改革又是税制改革中迫在眉睫的重要部分。 1个人所得税发展历程 我国个人税的征收历史由来已久&#xff0c;古代时期国家财政就大部…