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, '错误')
		}
	})
相关推荐
herogus丶7 分钟前
【Chrome】‘Good助手‘ 扩展程序使用介绍
前端·chrome
独立开阀者_FwtCoder11 分钟前
面试官:为什么在 Vue3 中 ref 变量要用 .value?
前端·javascript·vue.js
NetX行者13 分钟前
基于Vue 3的AI前端框架汇总及工具对比表
前端·vue.js·人工智能·前端框架·开源
独立开阀者_FwtCoder14 分钟前
手握两大前端框架,Vercel 再出手拿下 Nuxt.js,对前端有什么影响?
前端·javascript·vue.js
独立开阀者_FwtCoder14 分钟前
弃用 html2canvas!快 93 倍的截图神器!
前端·javascript·vue.js
weixin_3993806929 分钟前
TongWeb8.0.9.0.3部署后端应用,前端访问后端报405(by sy+lqw)
前端
伍哥的传说1 小时前
H3初识——入门介绍之常用中间件
前端·javascript·react.js·中间件·前端框架·node.js·ecmascript
Bruce_Json1 小时前
微信小程序ts+sassjlin-ui
微信小程序·小程序·sass
邓不利东1 小时前
Spring中过滤器和拦截器的区别及具体实现
java·后端·spring