微信生成带参数的二维码可以通过微信公众平台(订阅号、服务号)或微信开放平台的接口实现,主要分为以下几种场景和步骤:
一、微信公众号生成带参数二维码
适用于已认证的服务号(订阅号部分功能受限),通过微信公众平台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(`
`, 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是否有效,或公众号是否认证(未认证服务号可能受限)。
通过以上步骤,你可以为微信场景生成带参数的二维码,实现用户扫描后跳转或触发特定逻辑。