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

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

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. 利用sklearn的Pipeline简化建模过程

    很多框架都会提供一种Pipeline的机制,通过封装一系列操作的流程,调用时按计划执行即可.比如netty中有ChannelPipeline,TensorFlow的计算图也是如此. 下面简要介绍skl ...

  2. 一、linux基础命令

    一. 常用系统工作命令 1.echo 命令 ​ echo命令用于在终端输出字符串或者变量提取后的值 ​ echo $SHELL 2.date命令 ​ date命令用于显示及设置系统的时间或者日期 参数 ...

  3. 【VS开发】这就是COM组件

    [实例]这就是COM组件 时间 2012-02-21 10:49:15  CSDN博客 原文  http://blog.csdn.net/btwsmile/article/details/727849 ...

  4. vscode setting.json (@vue/eslint-config-prettier)

    {     "workbench.colorTheme": "Default Light+", // 主题     "terminal.integra ...

  5. pynput模块—键盘鼠标操作和监听

    pynput.mouse:包含控制和监控鼠标或者触摸板的类. pynput.keyboard:包含控制和监控键盘的类. 上面提到的子包都已被引入到pynput库中.要使用上面的子包,从pynput中引 ...

  6. [官网] 一个很好的 search rpm 或者是deb 包的网站

    https://pkgs.org Home About About pkgs.org - Packages Search The pkgs.org is created to provide you ...

  7. Spring学习笔记(一)

    Spring学习笔记(一) 这是一个沉淀的过程,大概第一次接触Spring是在去年的这个时候,当初在实训,初次接触Java web,直接学习SSM框架(当是Servlet都没有学),于是,养成了一个很 ...

  8. springboot2.0处理任何异常返回通用数据格式

    异常分为以下三种 自定义异常 可预知异常 不可预知异常 下面具体说明如何分类处理,从而保证无论触发什么异常均可返回理想的自定义数据格式 ResultCode /** * Created by mrt ...

  9. 安装jenkins时出现 No such plugin: cloudbees-folder的解决办法

    今天安装了一下jenkins,在初始化安装插件时出现" No such plugin: cloudbees-folder"错误,根据网上的教程: 1.打开链接"http: ...

  10. C语言中signed和unsigned理解

    一直在学java,今天开始研究ACM的算法题,需要用到C语言,发现好多知识点都不清楚了,看来以后要多多总结~ signed意思为有符号的,也就是第一个位代表正负,剩余的代表大小,例如:signed i ...