【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"

golang__19">2、golang 实现源码

package main

import (
	"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 和 secretKey
	MINI_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

golang__169">2、golang 实现源码

package main

import (
	"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 和 secretKey
	MINI_APP_LATEST_ID     string = "wxxxxf6"
	MINI_APP_LATEST_SECRET string = "7dfxxx64a"
)

func main() {
	// 初始化 Wechat 实例
	wc := wechat.NewWechat()
	//这里本地内存保存access_token,也可选择redis,memcache或者自定cache
	memory := 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!")

}

http://www.niftyadmin.cn/n/5479213.html

相关文章

scaling laws for neural language models

关于scaling law 的正确认识 - 知乎最近scaling law 成了最大的热词。一般的理解就是,想干大模型,清洗干净数据,然后把数据tokens量堆上来,然后搭建一个海量H100的集群,干就完了。训练模型不需要啥技巧,模型…

IntelliJ IDEA 2024.1安装与激活[破解]

一:IDEA官方下载 ①如题,先到IDEA官方下载,简简单单 ②IDEA官方:IntelliJ IDEA – the Leading Java and Kotlin IDE 二:获取脚本 🌟网盘下载:jetbra (密码:lzh7) 🌟获取…

Python学习笔记10 - 程序的组织结构

1. if 语句 2. pass语句 3. 内置函数range() 4. while 循环语句 5. for-in 循环语句 6. 流程控制语句 break 7. 流程控制语句 continue 8. else 语句 9. 嵌套循环

Element UI前端页面

1.前端 如何用ElementUI快速搭建一个前端网页模板,接下来会详细讲解! 1.Container布局 这是ElementUI官网提供的能快速搭建一个网页的基本布局模式,以下是一个网页的基本架构模式,主要分为三大块: AsideHeaderMain 我…

网络安全(防火墙,IDS,IPS概述)

问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…

【深度学习|基础算法】初识Transformer-encoder-decoder

关于transformer的学习 一、前言二、初识Transformer2.1 总览2.2 encoder2.3 decoder 三. 流程与细节1、输入2、self-attention 一、前言 我本身是从事图像算法行业的,在之前主要是做传统的图像算法,后来接触了基于CNN的神经网络图像算法,包括…

如何控制台灯的亮度

控制台灯的亮度通常涉及到硬件控制和编程。在硬件方面,台灯通常会有一个可调节的电源电路,通过改变电路的电压或电流来实现亮度的调整。在编程方面,你需要编写代码来发送控制信号给这个电源电路。 以下是一个简化的流程,描述了如何…

请解释TensorFlow中的自动微分(Automatic Differentiation)是如何工作的。如何使用TensorFlow进行分布式训练?

请解释TensorFlow中的自动微分(Automatic Differentiation)是如何工作的。 TensorFlow中的自动微分(Automatic Differentiation)是一个强大的工具,它使得计算和优化复杂函数的梯度变得简单而高效。自动微分是TensorFlo…