Skip to content Skip to footer

一文读懂微信开发生成带参数的二维码

微信生成带参数的二维码可以通过微信公众平台(订阅号、服务号)或微信开放平台的接口实现,主要分为以下几种场景和步骤:

一、微信公众号生成带参数二维码

适用于已认证的服务号(订阅号部分功能受限),通过微信公众平台API生成。

1. 获取AccessToken

调用微信接口需先获取access_token:

GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

APPID和APPSECRET在公众号后台的「开发」-「基本配置」中获取。

2. 生成带参数二维码

微信提供两种类型的参数二维码:

临时二维码(有过期时间,适用于短期活动)永久二维码(无过期时间,但数量有限制)

(1)临时二维码

POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN

请求参数(JSON格式):

{

"expire_seconds": 604800, // 过期时间(秒),最大1800(30分钟)~604800(7天)

"action_name": "QR_SCENE", // 临时二维码

"action_info": {

"scene": {

"scene_id": 123, // 自定义参数(数字),或使用"scene_str":"test"(字符串)

"scene_str": "test"

}

}

}

(2)永久二维码

{

"action_name": "QR_LIMIT_SCENE", // 永久二维码(数字参数)

"action_info": {

"scene": {

"scene_id": 123 // 1~100000的数字

}

}

}

// 或使用字符串参数(永久)

{

"action_name": "QR_LIMIT_STR_SCENE",

"action_info": {

"scene": {

"scene_str": "test" // 自定义字符串

}

}

}

3. 获取二维码图片

返回结果中的ticket用于换取二维码:

GET https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET

(直接在浏览器打开此URL即可显示二维码)

二、微信开放平台(移动应用/网站应用)

适用于小程序或开放平台应用,通过wxacode接口生成。

1. 小程序码(适用于小程序)

POST https://api.weixin.qq.com/wxa/getwxacode?access_token=TOKEN

请求参数:

{

"path": "pages/index?id=123", // 页面路径+参数

"width": 430, // 二维码宽度

"is_hyaline": true // 透明底色

}

2. 公众号网页授权二维码

通过微信JS-SDK生成,需用户授权后跳转带参数的URL。

三、参数说明与注意事项

参数类型:

临时二维码:scene_id(数字)或scene_str(字符串)。永久二维码:仅支持scene_id(数字)或scene_str(字符串)。 扫描事件推送:

用户扫描后,微信服务器会向你的公众号推送Event消息(subscribe或SCAN),包含参数:

限制:

临时二维码最多生成10万个,永久二维码(数字)最多10万个,(字符串)无明确限制。临时二维码过期后需重新生成。

四、代码示例-回调(go)

// 处理微信消息,扫码关注事件等

func handleWeChatMessage(c *gin.Context) {

// 解析XML消息(这里简化处理,实际需解析XML)

var xmlData struct {

ToUserName string `xml:"ToUserName"`

FromUserName string `xml:"FromUserName"`

MsgType string `xml:"MsgType"`

Content string `xml:"Content"`

MsgID string `xml:"MsgId"`

CreateTime string `xml:"CreateTime"`

Event string `xml:"Event"`

EventKey string `xml:"EventKey"`

Ticket string `xml:"Ticket"`

}

if err := c.ShouldBindXML(&xmlData); err != nil {

c.String(http.StatusBadRequest, "Invalid XML")

return

}

// TODO 增加实际的业务逻辑,例如公众号关注、消息接收回复等

// 回复消息(这里简单回复收到的内容)

response := fmt.Sprintf(`

%d

`, xmlData.FromUserName, xmlData.ToUserName, time.Now().Unix(), xmlData.Event+xmlData.EventKey+"已收到消息: "+xmlData.Content+"收到时间:"+time.Now().Format("2006-01-02 15:04:05"))

c.String(http.StatusOK, response)

}

五、常见问题

如何区分不同二维码的扫描? 通过EventKey字段判断参数(如scene_str或scene_id)。二维码过期后怎么办? 临时二维码需重新生成并更新展示,永久二维码无需处理。测试时无法生成二维码? 检查access_token是否有效,或公众号是否认证(未认证服务号可能受限)。

通过以上步骤,你可以为微信场景生成带参数的二维码,实现用户扫描后跳转或触发特定逻辑。