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

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

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. 【AMAD】django-allauth

    简介 个人评分 简介 django-allauth1集成的Oauth API包括: Amazon (OAuth2) AngelList (OAuth2) Bitly (OAuth2) Dropbox ...

  2. 在openstack中安装mysql5.7

    在控制节点上执行 1.下载mysql二进制安装包和依赖包 wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libaio-devel- ...

  3. 深度学习之目标检测:非极大值抑制源码解析(nms)

    目标检测:nms源码解析 原理:选定一个阈值,例如为0.3,然后将所有3个窗口(bounding box)按照得分由高到低排序.选中得分最高的窗口,遍历计算剩余的2窗口与该窗口的IOU,如果IOU大于 ...

  4. springboot使用elasticsearch的客户端操作eslaticsearch

    一  ES客户端 ES提供多种不同的客户端: 1.TransportClient ES提供的传统客户端,官方计划8.0版本删除此客户端. 2.RestClient RestClient是官方推荐使用的 ...

  5. Javadoc文档生成工具-自定义版

    先上图来一波 本身JDK自带了doc文档生成工具,但是不支持排除类,方法,属性,虽然有个@deprecated可以使用,但是达不到我想要的结果(类会被标记为废弃类,编译使用时会提示), 而且类说明示例 ...

  6. 网络流三大算法【邻接矩阵+邻接表】POJ1273

    网络流的基本概念跟算法原理我是在以下两篇博客里看懂的,写的非常好. http://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html http://www.cnb ...

  7. cxLookupComboBox控件的应用

    1.Properties-DropDownListStyle:下拉列表的模式, 里面有三个值:lsEditList:     lsEditFixedList    lsFixedList 2.Head ...

  8. LC 200 Number of Islands

    问题描述 Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is ...

  9. spring boot 2.0 提示 No primary or default constructor found for interface Pageable 解决办法

    在SpringBoot 2.0 以前,我们会配置以下类 @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter ...

  10. 进阶Java编程(10)反射与简单Java类

    1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...