在获取二维码之前我们首先要获取到access_token。

1.获取access_token

官方接口:https://api.weixin.qq.com/cgi-bin/token?appid= ‘’&secret=’’ ;
appid和secret就是小程序的appid和密钥,可以在微信公众号平台上面查看自己的小程序信息。

2.生成详情页面的二维码,可以传递参数的那种

在这里我使用的官方接口:
https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + access_token
还需要传递两个参数二维码生成的页面,和二维码的宽度
注意这两个参数的传递格式是json格式的:

data:{
"path":"pages/index/index?query=' ' ",
"width":120
}

这两个接口在前端也可以直接使用生成二维码,但是发布在线上的小程序就不能生成二维码了,因为接口请求的不能是https://api.weixin.qq.com
这里我们需要在后端处理生成二维码接口,具体后端代码如下图所示:

    @SuppressWarnings("resource")@ApiOperation(value = "生成二维码", notes = "发送到前端")@ApiImplicitParam(name = "id", value = "id", paramType = "query", required = true, dataType = "Long")@RequestMapping("/getCode")private void getCode(@RequestParam Long id, HttpServletResponse response) throws IOException {response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);String grant_type = "client_credential";String appid = " "; //你的appidString secret = " ";  //你的密钥String param = "grant_type=" + grant_type + "&appid=" + appid + "&secret=" + secret;String ft = HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/token", param);// 解析相应内容(转换成json对象)JSONObject json = JSON.parseObject(ft);// 拿到accesstokenString access_token = (String) json.get("access_token");String path = "pages/index/index?id=" + id;int width = 110;String params = "{\"path\":\"" + path + "\",\"width\":" + width + "}";params = JSON.parseObject(params).toJSONString();BufferedImage image = HttpRequest.postWechatImage("https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + access_token, params);ImageIO.write(image, "JPEG", response.getOutputStream());}

这里此接口返回给前端的直接就是二维码的图片。
postWechatImage方法的实现如下:

/*** 请求微信二维码图片 返回BufferedImage* * @param url   发送请求的 URL* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return BufferedImage*/public static BufferedImage postWechatImage(String url, String param) {PrintWriter out = null;InputStream inputStream = null;BufferedImage image = null;try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();inputStream = conn.getInputStream();image = ImageIO.read(inputStream);} catch (Exception e) {System.out.println("发送 POST 请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输出流、输入流finally {try {if (out != null) {out.close();}} catch (Exception ex) {ex.printStackTrace();}}return image;}

2.前端实现过程:

 // 生成页面的二维码uni.request({url: "https://wx.zzsnqyjxh.org/test/app/user/getCode?id=" + that.id,// url: 'http://192.168.1.166:9001/test/app/user/getCode?id=' + that.id,method: "POST",success(res) {that.qrcode ='https://wx.zzsnqyjxh.org/test/app/user/getCode?id='+ that.id; //这个接口就是图片地址// 转化成base64为保存that.codeTobase64(that.qrcode);}});}

转化为base64是用于绘制画布,绘制画布时不能是在线图片地址
绘制画布保存二维码的代码如下:

//先对图片进行处理
// 转化二维码// 绘制网略图片var codePath = wx.env.USER_DATA_PATH + '/goods' + 'invite' + '.png'; //创建名为invite的本地文件var codeData = this.codetoBase64Url.replace(/^data:image\/\w+;base64,/, ""); //清除base64前缀var ft = wx.getFileSystemManager(); //获得文件系统管理器  用于操作临时文件

完整的小程序保存二维码的代码如下:

//小程序端保存图片saveImage() {uni.showLoading({title: '图片绘制中...',})// 转化二维码// 绘制网略图片var codePath = wx.env.USER_DATA_PATH + '/goods' + 'invite' + '.png'; //创建名为invite的本地文件var codeData = this.codetoBase64Url.replace(/^data:image\/\w+;base64,/, ""); //清除base64前缀var ft = wx.getFileSystemManager(); //获得文件系统管理器  用于操作临时文件 const context = uni.createCanvasContext('myCanvas')context.setFillStyle('#FFFFFF')context.setFillStyle('#1E1E1E') //文字颜色:默认黑色context.setFontSize(16); //设置字体大小,默认10context.textAlign = 'center' // 设置位置context.font = 'normal bold 12px sans-serif'; // 字体样式context.fillText(this.goodsName, 100, 265, 200, 20);context.setFillStyle('#FF0060');context.fillText('抢购价:' + '¥' + this.price, 50, 290, 200, 20);context.drawImage("../../static/discount.png",100,270,120,24);context.setFillStyle('#FFFFFF');context.fillText("再享最高6折优惠",160, 285,132,24);ft.writeFileSync(codePath, codeData, "base64"); //文件路径  存入内容  编码格式 可以直接使用imgPath来进行操作context.drawImage(codePath, 100, 300, 106, 106); //二维码// 绘制网略图片var goodsPath = wx.env.USER_DATA_PATH + '/goods' + 'dalaba' + '.png'; //创建名为invite的本地文件var imgData = this.toBase64Url.replace(/^data:image\/\w+;base64,/, ""); //清除base64前缀var fst = wx.getFileSystemManager(); //获得文件系统管理器  用于操作临时文件 fst.writeFileSync(goodsPath, imgData, "base64"); //文件路径  存入内容  编码格式 可以直接使用imgPath来进行操作context.drawImage(goodsPath, 20, 0, 250, 250); //图片//重点:这边本来保存图片是写在draw之后,但第一次保存时空白,第二次才生效,写在draw回调里面就OK了。context.draw(false, function() {uni.canvasToTempFilePath({canvasId: 'myCanvas',success: function(res) {uni.hideLoading()// console.log(res.tempFilePath)uni.saveImageToPhotosAlbum({filePath: res.tempFilePath,success: function(res) {uni.showToast({title: '图片已保存'})}})}})})},

3.将图片转化为base64为的代码如下:

urlTobase64(url) {var toBase64Url;uni.request({url: url,method: 'GET',responseType: 'arraybuffer',success: async res => {let base64 = wx.arrayBufferToBase64(res.data); //把arraybuffer转成base64toBase64Url = 'data:image/jpeg;base64,' + base64; //不加上这串字符,在页面无法显示}});},

微信小程序生成详情页面二维码相关推荐

  1. 微信小程序生成自定义参数二维码

    微信小程序生成自定义参数二维码 前言 实现 尾巴 前言 最近项目中要用到二维码分享功能,需要封装一些自定义的参数通过二维码分享.查看官方文档,发现系统提供了生成二维码的功能,但是细看才发现官方提供的接 ...

  2. uni-app微信小程序生成自定义参数二维码,跳转小程序指定页面,获取参数;uni-app微信小程序获取二维码自定义参数;微信小程序生成动态参数二维码;uni-app微信小程序获取动态参数二维码;

    一.场景需求: 在小程序个人名片页面A页面,生成用户的个人名片二维码(该二维码携带用户的唯一标识id):微信扫一扫或长按图片识别这个二维码,可以跳转到小程序的B页面,并且在B页面拿到二维码上的唯一标识 ...

  3. 微信小程序生成海报带二维码功能

    wxml文件 <view><text class='shareText'>生成海报分享至</text><view class='imgBox'>< ...

  4. uniapp微信小程序获取页面二维码(带有参数)

    1. 生成页面二维码(后端生成,前端需要将二维码写入文件管理器) // 获取带参数的小程序码async function getCodeImage() {let param = { id: 12345 ...

  5. 微信小程序生成跳转二维码

    官方三种方式,当前我们用第二种 微信二维码官方文档: wxacode.get | 微信开放文档 (qq.com) 工具接口代码: import com.alibaba.fastjson.JSON; i ...

  6. uniapp微信小程序生成带个人二维码的海报

    1:Sansnn-uQRCode 导入插件(生成二维码)(插件市场)(源码和结果如下) 2:弹窗展示海报内容 3:createCanvasImage绘制canvas海报 4:canvasToTempF ...

  7. 生成微信小程序指定页面二维码

    首先官方开发文档参考:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.cre ...

  8. 微信小程序生成带logo二维码

    先上图,看看是不是你想要的!!! 引入js直接用 页面就一个画布就行,标上id,宽高 qrcodejs下载地址链接:https://pan.baidu.com/s/1pqpTQxMxguAf0lMcg ...

  9. 小程序指定页面二维码生成

    小程序生成指定页面二维码 小程序生成海报分享传播,需要生成分享页面的二维码,用户扫描这个二维码即可进入分享的这个小程序页面,对于分享者更具有指向性:也可生成"太阳码"参阅太阳码生成 ...

最新文章

  1. 【古法炮制】最原始的解决JAVA接口跨域的问题
  2. P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】
  3. SPOJ1812 LCS2
  4. javascript与php与python的函数写法区别与联系
  5. 数学入门题——《算法竞赛入门经典-训练指南》
  6. 关于进程资源限制的getrlimit和setrlimit函数(epoll、服务器经常用)
  7. 计算机辅助齿轮图标注,机械CAD齿轮画法
  8. python赋值运算符难理解_零基础学 Python(8)运算符 — 算术、比较、赋值、逻辑...
  9. junit5 入门系列教程-14-junit5 重复测试(@RepeatedTest)
  10. 联通微服务怎么还款_重磅!中国联通推出微信签约代扣新功能
  11. 什么是Mirai僵尸网络
  12. Xilinx 7系列FPGA架构之时钟资源(一)
  13. 万维网、因特网和互联网的区别
  14. 一个彷b站醒目留言的控件
  15. MySQL-mysql安装步骤
  16. npm ERR! code EINTEGRITY 错误原因记录
  17. 【工作感悟】大专学java真的找不到工作吗
  18. metaRTC实现安卓webrtc推流直播
  19. DSP音频软件与算法开发
  20. CTF MISC图片隐写简单题学习思路总结(持续更新)

热门文章

  1. Day09.面向对象进阶
  2. 小米智能互联电脑版总是弹出_小米智能互联PC版-小米智能互联下载v1.1.0.453-IE浏览器中文网站...
  3. 网易传媒基础架构演进之路
  4. Spring Cloud 学习总结
  5. 万物互联来袭 你准备好迎接5G新时代了吗?
  6. CodeForces 13A - Numbers
  7. 四川省食品药品学校计算机考试,【四川省食品药品学校】学费标准|分数线|招办电话|学校地址 - 高铁职业学校...
  8. 都 2021 年了,你还在用 Kafka?快试试这个全新平台吧
  9. 开源中国(OSChina)源码解析(1)——源码导入
  10. 实现交互式shell的几种方式:python pty 方式、升级nc、socat、script获取pty