最近涉及到微信小程序分享到朋友圈,不知道微信为什么不直接接口分享,咱也不敢佛,咱也不敢问,只能百度问度娘,看官方文档,网上的一些分享五花八门,每一个重点的,所以整理了一下到底怎样生成二维码分享图片才是正确的,做了如下总结

说实话踩了很多坑,最大的坑就是把获取微信小程序二维码的事情在前端做了,人家明确说了不要在前端做,可是没好好看官方文档。

1,获取带参数二维码

2.将二维码传到前端

3 将二维码及其他信息画到canvas上

4 保存到相册

5 开开心心分享朋友圈

一步一步来

1,获取带参二维码

微信提供了三个接口

链接如下:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html

一定要好好看文档,这个接口是后台调用的,后台,后台,后台,重要的事情说三遍

上服务器代码(注意:access_token是有过期时间的。获取时要注意哦)

func getWXcode(id int64, accessToken string) []byte {
path := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken
client := &http.Client{}
params := `{"scene":"calendarId=` + strconv.FormatInt(id, 10) + `", "page": "pages/ClassSchedule"}`
reqBody := bytes.NewBuffer([]byte(params))
request, _ := http.NewRequest("POST", path, reqBody)
request.Header.Set("Content-type", "application/json")
response, _ := client.Do(request)
if response.StatusCode == {
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Logger.Debug("fail to get QRCode", zap.Error(err))
}
return body
}
return nil
}

注意返回的是图片的字节,利用gin框架返回图片

2.将二维码传到前端

func (api *ScheduleAPI) WxCode(c *gin.Context) {
id, err := api.ValidateInt64Id(c)
if err != nil {
api.BadRequest(c) }
accessToken, err := RequestToken(AppId, AppSecret)
if err != nil {
api.BadRequest(c)
return
}
c.Writer.Header().Set("Content-Type", "image/png")
_, err = c.Writer.Write(getWXcode(id, accessToken)) if err != nil {
log.Logger.Debug("fail to write QRCode", zap.Error(err))
}
}

后台基本就是这个样子的了,接下来就是前端如何处理,前端获取图片后会保存到临时目录,这个看文档应该就清楚了

3 将二维码及其他信息画到canvas上

shareImage () {
console.log('that.access_token', this.access_token)
this.sharePop = false
var that = this
wx.showLoading({
title: '图片生成中...'
})
wx.downloadFile({
url:
'https://后台获取图片你地址/' + this.calendarId + '/code',
success: function (res) {
wx.downloadFile({
url: that.user.avatarId,
success: function (res3) {
const ctx = wx.createCanvasContext('shareCanvas')
ctx.setFontSize(50)
ctx.drawImage(res3.tempFilePath, 250, 20, 200, 200)
ctx.fillText(that.user.nickname, 250, 300, 100)
ctx.fillText('分享', 400, 300, 100)
ctx.fillText(that.calendar.name, 250, 400, 500)
ctx.drawImage(res.tempFilePath, 150, 450, 500, 600)
ctx.fillText('长按识别小程序,查看课程详细', 150, 1150, 500) ctx.stroke()
ctx.draw()
// loading
setTimeout(function () {
wx.canvasToTempFilePath({
x: 0,
y: 0,
width: 800,
height: 1200,
destWidth: 480,
destHeight: 550,
canvasId: 'shareCanvas',
fileType: 'jpg',
success: function (res2) {
that.imageurl = res2.tempFilePath
wx.hideLoading()
that.canvasDialog = true
},
fail: function (err) {
console.log('errr111', err)
console.log('生成失败......')
wx.hideLoading()
}
})
}, 2000)
},
fail: function (err) {
console.log('1111', err)
}
})
},
fail: function (err) {
console.log(err)
}
})
},

仔细瞧你会发现有两个wx.downloadFile解释一下,一个是我们生成的二维码,一个是用户信息的头像,这个canvas 画完之后就是要显示一下了,就是个图片显示一下好了

4 保存到相册

div.shareimage
canvas(canvas-id="shareCanvas",style="width:800px;height:1200px;")
van-dialog.dialogPop(use-slot='', :show='canvasDialog', show-cancel-button='', @cancel='onClose("canvasDialog")' @confirm='saveImage' cancel-button-text="取消" confirm-button-text="保存到相册" )
.df-col-ac.py-20p
image(:src="data:imageurl" style="width: 200px; height: 300px")
van-toast#van-toast

本人用的pug格式的html,看不明白的下次讲讲开发效率的问题

保存代码如下:

      saveImage () {
// debugger
var that = this
that.canvasDialog = false
wx.saveImageToPhotosAlbum({
filePath: that.imageurl,
success (res) {
wx.showModal({
content: '图片已保存到相册',
showCancel: false,
confirmText: '好的',
success: function (res) {
if (res.confirm) {
console.log('用户确定了')
}
}
})
}
})
},

最后一步就去分享吧

获取sence的传递的值

onLoad (options) {
if (options.scene) {
let scene2 = decodeURIComponent(options.scene)
//按照传递的值进行拆分。例如
var str = scene2.split('=')
shopId = str[1]
}
}

总结:

canvas是真的不好画,调不对格式呀,欢迎讨论,谢谢

转载请表明出处。

golang-vue实现微信小程序分享到朋友圈的更多相关文章

  1. 微信小程序分享至朋友圈的方法

    最近研究怎么实现微信小程序分享至朋友圈,对就是朋友圈. 微信小程序目前没有直接提供方法来将小程序分享至朋友圈,不过可以采用曲线救国的方式来达到目的. 方法分两步: 1.通过浏览器将希望分享的东西风向至 ...

  2. 微信小程序分享到朋友圈方法与技巧

    小程序提供onShareAppMessage 函数,此函数只支持分享给我微信朋友.小程序如何分享到朋友圈呢? 我提供的方法是,使用canvas绘制一张图片,并用wx.previewImage预览图片, ...

  3. 关于微信小程序分享/转发功能的实现方法

    实现微信小程序分享,可以有两个入口: 1. 小程序右上角菜单自带的分享 这个入口是默认关闭的,需要在当前页面中调用showShareMenu方法,开启分享 onLoad: function () { ...

  4. 使用Vue开发微信小程序:mpvue框架

    使用Vue开发微信小程序:mpvue框架:https://www.jianshu.com/p/8f779950bfd9

  5. 微信小程序分享转发用法大全——自定义分享、全局分享、组合分享

    官方提供的自定义分享 使用隐式页面配置函数实现的全局分享-推荐 使用隐式路由实现的全局分享-不推荐,仅供了解隐式路由 前言: 目前微信小程序只开放了页面自定义分享的API,为了能够更灵活的进行分享配置 ...

  6. 微信小程序--分享功能

    微信小程序--分享功能 微信小程序前段时间开放了小程序右上角的分享功能, 可以分享任意一个页面到好友或者群聊, 但是不能分享到朋友圈 这里有微信开发文档链接:点击跳转到微信分享功能API 入口方法: ...

  7. 只会Vue怎么开发小程序?vue和微信小程序的到底有哪些区别?

    写了vue项目和小程序,发现二者有许多相同之处,在此想总结一下二者的共同点和区别. 一.生命周期 先贴两张生命周期图对比下: vue生命周期 小程序生命周期 相比之下,小程序的钩子函数要简单得多. v ...

  8. Spring Boot后端+Vue前端+微信小程序,完整的开源解决方案!

    项目简介 一个小商场系统,包括: 后端:Spring Boot 管理员前端:Vue 用户前端:微信小程序 功能介绍 1.小商城 首页 专题列表.专题详情 分类列表.分类详情 品牌列表.品牌详情 新品首 ...

  9. 学了这么久,vue和微信小程序到底有什么样的区别?

    前言 写了vue项目和小程序,发现二者有许多相同之处,在此想总结一下二者的共同点和区别.相比之下,小程序的钩子函数要简单得多. 一.生命周期 先贴两张图: vue生命周期 小程序生命周期   相比之下 ...

随机推荐

  1. lua的table库中的常用函数总结

    table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下: (1).table 是一个“关联数组”,数组的索引可以是数字或者是字符串; (2).table 的默认初始索引一般 ...

  2. jumpserver跳板机(堡垒机)安装

     jumpserver跳板机(堡垒机) Jumpserver 是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能,基于ssh协议来管理,客户端无需安装agent,助力互联网企业 ...

  3. 桥接模式下访问虚拟机中的Django项目

    首先需要保证主机和虚拟机能相互Ping通,如果Ping不通,请参考我上篇文章,这里演示的是桥接模式下的方法,如果是NAT模式连接,请参考别处. 1. 虚拟机Linux系统内的Django项目 sett ...

  4. 【LOJ】#3032. 「JOISC 2019 Day1」馕

    LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...

  5. 使用Minikube运行一个本地单节点Kubernetes集群(阿里云)

    使用Minikube运行一个本地单节点Kubernetes集群中使用谷歌官方镜像由于某些原因导致镜像拉取失败以及很多人并没有代理无法开展相关实验. 因此本文使用阿里云提供的修改版Minikube创建一 ...

  6. 【Java学习】类、对象、实例—类是对象的抽象,对象是类的实例

    类.对象.实例的关系是什么,如果不能很好的理解什么是类什么是对象就无法讲清楚, 类:某种事物与另一种事物具有相似性,比如哈士奇和泰迪,我们发现他们有一些相似的特性和行为,在生物学上,他们都属于“狗”, ...

  7. 【hash+二分】Antisymmetry

    [题目链接] https://loj.ac/problem/2452 [参考博客] https://blog.csdn.net/xgc_woker/article/details/82904631 [ ...

  8. servlet容器,web容器,spring容器,springmvc容器的区别(转)

    web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器.其中spring控制service层和dao层的bean对象.springmvc容器控制contr ...

  9. how to Simply Singleton Navigate the deceptively simple Singleton pattern---reference

    http://www.javaworld.com/article/2073352/core-java/simply-singleton.html JAVA DESIGN PATTERNS By Dav ...

  10. mac手册汉化 2019

    1.安装依赖 brew install automake brew install opencc 2.编译 wget https://github.com/man-pages-zh/manpages- ...