【golang】动态生成微信小程序二维码实战上:golang整合github.com/silenceper/wechat/v2 实现生成 小程序二维码图片

本文主要是介绍【golang】动态生成微信小程序二维码实战上:golang整合github.com/silenceper/wechat/v2 实现生成 小程序二维码图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目背景

在自研的系统,需要实现类似草料二维码的功能
将我们自己的小程序,通过代码生成相想要的小程序二维码

代码已经上传到 Github 需要的朋友可以自取
https://github.com/ctra-wang/wechat-mini-qrcode

一、源生实现

通过源生API实现对小程序二维码的生成

1、官方API

官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/createQRCode.html

下面是三个官方的API 可以根据需求进行调用

CreateWXAQRCodeURL   = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=%s"
GetWXACodeURL        = "https://api.weixin.qq.com/wxa/getwxacode?access_token=%s"
GetWXACodeUnlimitURL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"

2、golang 实现源码

package mainimport ("bytes""encoding/json""errors""fmt""io""log""net/http""net/url""os"
)const (CreateWXAQRCodeURL   = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=%s"GetWXACodeURL        = "https://api.weixin.qq.com/wxa/getwxacode?access_token=%s"GetWXACodeUnlimitURL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"
)const (// 替换成你的小程序 appiId 和 secretKeyMINI_APP_LATEST_ID     string = "wxxxxf6"MINI_APP_LATEST_SECRET string = "7dfxxx64a"
)// 通过 普通的源生请求
func main() {// 要生成二维码的路径和参数_, err := GetQRCode(58)if err != nil {fmt.Println("Error getting QR code:", err)return}}func GetQRCode(id int) ([]byte, error) {//上面生成的access code 判断为空时重新请求accessToken, err := requestToken(MINI_APP_LATEST_ID, MINI_APP_LATEST_SECRET)if err != nil {return nil, err}strUrl := fmt.Sprintf(CreateWXAQRCodeURL, accessToken)// todo: 这里有bug待完善parm := make(map[string]string)// path 要以?开始parm["path"] = fmt.Sprintf("?pathName=/race/pages/group&id=%d", id)// page 起始位置不需要 /parm["page"] = fmt.Sprintf("pages/home/index")jsonStr, err := json.Marshal(parm)if err != nil {return nil, errors.New("json Marshal QRCode paramter err :" + err.Error())}req, err := http.NewRequest("POST", strUrl, bytes.NewBuffer([]byte(jsonStr)))if err != nil {return nil, errors.New("get QRCode err :" + err.Error())}// 发起 post 请求req.Header.Set("Content-Type", "application/json")client := &http.Client{}resp, err := client.Do(req)if err != nil {return nil, errors.New("get QRCode err :" + err.Error())}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return nil, errors.New("get QRCode err :" + err.Error())}// 生成图片png, err := os.Create("data.png")_, err2 := png.Write(body)if err2 != nil {log.Fatal(err2)}fmt.Println("QR code saved successfully!")return nil, nil
}func requestToken(appid, secret string) (string, error) {u, err := url.Parse("https://api.weixin.qq.com/cgi-bin/token")if err != nil {log.Fatal(err)}paras := &url.Values{}//设置请求参数paras.Set("appid", appid)paras.Set("secret", secret)paras.Set("grant_type", "client_credential")u.RawQuery = paras.Encode()resp, err := http.Get(u.String())//关闭资源if resp != nil && resp.Body != nil {defer resp.Body.Close()}if err != nil {return "", errors.New("request token err :" + err.Error())}jMap := make(map[string]interface{})err = json.NewDecoder(resp.Body).Decode(&jMap)if err != nil {return "", errors.New("request token response json parse err :" + err.Error())}if jMap["errcode"] == nil || jMap["errcode"] == 0 {accessToken, _ := jMap["access_token"].(string)return accessToken, nil} else {//返回错误信息errcode := jMap["errcode"].(string)errmsg := jMap["errmsg"].(string)err = errors.New(errcode + ":" + errmsg)return "", err}
}

3、代码分析 io.ReadAll 文件流

通过接口返回的 resp中的body,通过 io.ReadAll() 方法返回的body为二进制

body, err := io.ReadAll(resp.Body)
if err != nil {return nil, errors.New("get QRCode err :" + err.Error())
}

我们需要通过文件去接收这个文件流

// 生成图片
png, err := os.Create("data.png")
_, err2 := png.Write(body)

这样我们就可以看到一个data.png的文件产生

二、框架实现

1、官方API

作者: silenceper/wechat

github地址:https://github.com/silenceper/wechat/v2
文档地址:https://silenceper.com/wechat/miniprogram/qrcode.html

2、golang 实现源码

package mainimport ("fmt""github.com/silenceper/wechat/v2""github.com/silenceper/wechat/v2/cache"miniConfig "github.com/silenceper/wechat/v2/miniprogram/config""github.com/silenceper/wechat/v2/miniprogram/qrcode""log""os"
)const (// 替换成你的小程序 appiId 和 secretKeyMINI_APP_LATEST_ID     string = "wxxxxf6"MINI_APP_LATEST_SECRET string = "7dfxxx64a"
)func main() {// 初始化 Wechat 实例wc := wechat.NewWechat()//这里本地内存保存access_token,也可选择redis,memcache或者自定cachememory := cache.NewMemory()//token, _ := requestToken(MINI_APP_LATEST_ID, MINI_APP_LATEST_SECRET)cfg := &miniConfig.Config{AppID:     MINI_APP_LATEST_ID,AppSecret: MINI_APP_LATEST_SECRET,Cache:     memory,}//officialAccount := wc.GetOfficialAccount(cfg)mini := wc.GetMiniProgram(cfg)fmt.Println("------------")qcode := mini.GetQRCode()res, err := qcode.CreateWXAQRCode(qrcode.QRCoder{Page: "pages/home/index",Path: "?pathName=/race/pages/group&id=58",//CheckPath:  nil,Width: 300,//Scene: "pathName=/race/pages/group&id=58",//AutoColor:  false,//LineColor:  nil,//IsHyaline:  false,//EnvVersion: "",})if err != nil {return}// 生成图片png, err := os.Create("race.png")_, err2 := png.Write(res)if err2 != nil {log.Fatal(err2)}fmt.Println("QR code saved successfully!")}

这篇关于【golang】动态生成微信小程序二维码实战上:golang整合github.com/silenceper/wechat/v2 实现生成 小程序二维码图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/890347

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象