Java后台生成微信小程序码并以流的形式返回给前端

后端代码

  1. 获取access_token
java 复制代码
import net.sf.json.JSONObject;

public class WeChatUtil {
    /**
     * 获取token
     */
    private static String ACCESSTOKENURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appId}&secret={appSecret}";

    /**
     * 获取登陆的token
     *
     * @param appId
     * @param appSecret
     * @return
     * @throws Exception
     */
    public static String getAccessToken(String appId, String appSecret) {
        String url = ACCESSTOKENURL.replace("{appId}", appId).replace("{appSecret}", appSecret);
        JSONObject jsonObject = CommonUtil.httpsRequest(url, "GET", null);
 
        if (null != jsonObject) {
            return  jsonObject.getString("access_token");
        }
        return null;
    }
}
  1. 生成图片流
java 复制代码
package com.ruoyi.common.utils;

import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import net.sf.json.JSONObject;

public class QrCodeUtils {

	/**
	 * 生成图片流
	 * @param url
	 * @param paraMap
	 * @return
	 * @throws Exception
	 */
	public static byte[] getminiqrQr(String url, Map<String, Object> paraMap) throws Exception {
		byte[] result = null;
		HttpPost httpPost = new HttpPost(url);
		httpPost.addHeader("Content-Type", "application/json");

		// 设置请求的参数
		JSONObject postData = new JSONObject();
		for (Map.Entry<String, Object> entry : paraMap.entrySet()) {
			postData.put(entry.getKey(), entry.getValue());
		}
		httpPost.setEntity(new StringEntity(postData.toString(), "UTF-8"));
		HttpClient httpClient = HttpClientBuilder.create().build();
		HttpResponse response = httpClient.execute(httpPost);
		HttpEntity entity = response.getEntity();
		result = EntityUtils.toByteArray(entity);
		return result;
	}
}
  1. 后台接口返回流到前端
java 复制代码
	import javax.servlet.http.HttpServletResponse;
	import java.io.OutputStream;
	import java.util.Map;
	import java.util.HashMap;

	@GetMapping("/getInviteCode")
	@ResponseBody
	public void getInviteCode(@RequestParam(value = "id") String id,
			HttpServletResponse response) {
		try {
			String accessToken = WeChatUtil.getAccessToken(appId, appSecret);
			byte[] qrCodeBytes = null;
			Map<String, Object> paraMap = new HashMap<String, Object>();
			String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="
					+ accessToken ;
			// 二维码携带参数 不超过32位 参数类型必须是字符串
			paraMap.put("scene", id); // 存入的参数
			paraMap.put("path", "pages/index/index");
			qrCodeBytes = QrCodeUtils.getminiqrQr(url, paraMap);
			response.setContentType("image/jpg");
			// 写入response的输出流中
			OutputStream stream = response.getOutputStream();
			stream.write(qrCodeBytes);
			stream.flush();
			stream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

前端代码

javascript 复制代码
	uni.request({
	    url: baseUrl+'getInviteCode?id='+that.id,
	    method: "GET",
	    responseType: 'arraybuffer',
	    success: function(res) {
	        uni.hideToast();
			let datas = res.data
			const arrayBuffer = new Uint8Array(datas)
			that.codeImg = "data:image/png;base64," + uni.arrayBufferToBase64(arrayBuffer) //这里需要添加前缀
		},
		fail(res) {
			console.log(res, '错误')
		}
	})
相关推荐
企业数字化笔记2 分钟前
多租户配额怎么控制?用量口径、并发预留与超额处理的实现方法
java·数据库·spring boot
IT_陈寒7 分钟前
React组件莫名重渲染?你可能忘了这个小细节
前端·人工智能·后端
鶴哥只手遮天18 分钟前
React 19.3.1 源码深度剖析-第 12 章(下)RSC 与 Flight 协议
前端·react.js·开源
deli00719 分钟前
TCP 三次握手到底发几个包?丢包重传动画实测一遍
前端
盟接之桥26 分钟前
盟接之桥谈线束数字化-按单入按单出:线束企业库存管理的破局之道
大数据·前端·网络·数据库·人工智能·制造
巴勒个啦30 分钟前
Prompt Engineering 实战:5 个让 AI 生成生产级业务代码的工程模式
java·前端
去伪存真31 分钟前
AI时代,古法编程的码农路在何方?
前端
计算机魔术师41 分钟前
从7月绕过沙盒到9月再曝违规,OpenAI的AI安全防线在漏什么
前端
我的div丢了肿么办1 小时前
element-plus表格使用:filter-method过滤导致出现无数据
前端·javascript·vue.js
倚楼听风语1 小时前
Kotlin 协程与 suspend 原理详解
java·算法·kotlin