微信公众号自定义菜单ASP教程
微信公众号自定义菜单可以让用户更方便地与公众号互动,直接点击菜单项即可触发一系列操作,如发送消息、跳转到网页、获取用户信息等,对于使用ASP作为后端语言的开发者来说,实现这个功能需要通过调用微信提供的API来完成。

目录
- 准备工作
- 1. 申请服务号
- 2. 获取开发者凭证
- 3. 设置服务器配置(Token, EncodingAESKey)
- 4. 获取Access Token
- 核心概念:Access Token
- 菜单创建与删除API
- ASP代码实现
- 1. 获取Access Token的ASP函数
- 2. 创建自定义菜单的ASP函数
- 3. 删除自定义菜单的ASP函数
- 完整示例代码
- 调试与发布
- 1. 使用菜单生成器
- 2. 使用微信公众平台的调试工具
- 3. 发布菜单
- 常见问题与注意事项
准备工作
在编写任何代码之前,你必须完成以下微信官方的配置步骤。
1. 申请服务号
自定义菜单功能仅对服务号开放,如果你拥有的是订阅号,需要先升级为服务号(需满足一定条件,如认证等)。
2. 获取开发者凭证
登录微信公众平台,进入“设置与开发” -> “基本配置”,你可以看到:
- AppID (应用ID): 也叫
wx_id或corp_id。 - AppSecret (应用密钥): 也叫
wx_secret或corp_secret。
这两个是调用API时进行身份验证的关键,请务必妥善保管,不要泄露。

3. 设置服务器配置
在“基本配置”页面,点击“修改配置”。
- URL: 你的服务器上接收微信服务器推送消息的地址。
http://www.yourdomain.com/weixin/weixin.asp,这个页面需要能够处理微信的GET请求验证。 - Token: 可以任意填写,用作生成签名,以确认请求来自微信服务器。
- EncodingAESKey: 随机生成或手动填写,用于消息加解密。
注意:这一步主要是为了接收消息和事件,如果你只是想创建菜单,并且不打算处理用户发来的消息,你可以先不配置,或者配置一个占位页面,但最终菜单生效后,用户点击菜单会访问你配置的URL,所以这个URL必须是真实可访问的。
4. 获取Access Token
这是整个流程的核心,Access Token是公众号的全局唯一票据,调用所有接口时都需使用它,它有效期为2小时,过期后需要重新获取。
核心概念:Access Token
你可以把它想象成进入微信API大门的“钥匙”,没有这把钥匙,任何操作都无法进行,我们的第一步代码就是编写一个函数,用AppID和AppSecret去微信服务器“换”这把钥匙。

获取Access Token的API地址是:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=YOUR_APPID&secret=YOUR_APPSECRET
菜单创建与删除API
有了Access Token后,我们就可以操作菜单了。
-
创建菜单:
POST请求- URL:
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN - 请求体: 一个JSON格式的菜单结构数据。
- URL:
-
删除菜单:
GET请求- URL:
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN - 请求体: 无。
- URL:
ASP代码实现
下面是关键的ASP函数实现,我们将使用微软的MSXML2.ServerXMLHTTP对象来发送HTTP请求。
1. 获取Access Token的ASP函数
这个函数会调用微信API,并返回一个包含access_token和expires_in的JSON对象。
<%
' Function to get WeChat Access Token
' 参数: appid, appsecret
' 返回: 包含access_token的JSON字符串,如果出错则返回错误信息
Function GetAccessToken(appid, appsecret)
On Error Resume Next ' 开启错误处理
Dim url, xmlHttp, result
' 构建获取Token的API URL
url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" & appid & "&secret=" & appsecret
' 创建XMLHTTP对象
Set xmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
' 设置请求方法和超时时间 (3秒)
xmlHttp.Open "GET", url, False
xmlHttp.setTimeouts 5000, 5000, 10000, 10000 ' 连接, 发送, 等待响应, 总超时
' 发送请求
xmlHttp.Send
' 检查请求是否成功
If xmlHttp.Status = 200 Then
result = xmlHttp.responseText
Else
result = "{""errcode"": -1, ""errmsg"": ""HTTP Request Failed: " & xmlHttp.Status & " " & xmlHttp.statusText & """}"
End If
' 释放对象
Set xmlHttp = Nothing
' 如果发生错误,返回错误信息
If Err.Number <> 0 Then
GetAccessToken = "{""errcode"": -2, ""errmsg"": ""VBScript Error: " & Err.Description & """}"
Err.Clear
Else
GetAccessToken = result
End If
On Error GoTo 0 ' 关闭错误处理
End Function
%>
2. 创建自定义菜单的ASP函数
这个函数接收Access Token和菜单的JSON字符串,然后发送POST请求。
<%
' Function to create WeChat custom menu
' 参数: accessToken, menuJsonData
' 返回: 微信API返回的JSON响应
Function CreateMenu(accessToken, menuJsonData)
On Error Resume Next
Dim url, xmlHttp, result
' 构建创建菜单的API URL
url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" & accessToken
' 创建XMLHTTP对象
Set xmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
' 设置请求方法为POST,并设置Content-Type为JSON
xmlHttp.Open "POST", url, False
xmlHttp.setRequestHeader "Content-Type", "application/json; charset=utf-8"
xmlHttp.setTimeouts 5000, 5000, 10000, 10000
' 发送请求,菜单数据作为请求体
xmlHttp.Send menuJsonData
' 检查请求是否成功
If xmlHttp.Status = 200 Then
result = xmlHttp.responseText
Else
result = "{""errcode"": -1, ""errmsg"": ""HTTP Request Failed: " & xmlHttp.Status & " " & xmlHttp.statusText & """}"
End If
' 释放对象
Set xmlHttp = Nothing
' 如果发生错误,返回错误信息
If Err.Number <> 0 Then
CreateMenu = "{""errcode"": -2, ""errmsg"": ""VBScript Error: " & Err.Description & """}"
Err.Clear
Else
CreateMenu = result
End If
On Error GoTo 0
End Function
%>
3. 删除自定义菜单的ASP函数
这个函数更简单,只需要发送一个GET请求即可。
<%
' Function to delete WeChat custom menu
' 参数: accessToken
' 返回: 微信API返回的JSON响应
Function DeleteMenu(accessToken)
On Error Resume Next
Dim url, xmlHttp, result
' 构建删除菜单的API URL
url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" & accessToken
' 创建XMLHTTP对象
Set xmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
' 设置请求方法为GET
xmlHttp.Open "GET", url, False
xmlHttp.setTimeouts 5000, 5000, 10000, 10000
' 发送请求
xmlHttp.Send
' 检查请求是否成功
If xmlHttp.Status = 200 Then
result = xmlHttp.responseText
Else
result = "{""errcode"": -1, ""errmsg"": ""HTTP Request Failed: " & xmlHttp.Status & " " & xmlHttp.statusText & """}"
End If
' 释放对象
Set xmlHttp = Nothing
' 如果发生错误,返回错误信息
If Err.Number <> 0 Then
DeleteMenu = "{""errcode"": -2, ""errmsg"": ""VBScript Error: " & Err.Description & """}"
Err.Clear
Else
DeleteMenu = result
End If
On Error GoTo 0
End Function
%>
完整示例代码
创建一个名为 create_menu.asp 的文件,将以下代码放入其中。请务必修改 YOUR_APPID 和 YOUR_APPSECRET。
<%@ Language="VBScript" %>
<%
' --- 配置信息 ---
Const APPID = "YOUR_APPID" ' 替换成你的AppID
Const APPSECRET = "YOUR_APPSECRET" ' 替换成你的AppSecret
' -----------------
' 引入上面的函数
' (为了简洁,这里直接把函数写在同一个文件里,实际项目中最好放在一个inc文件中)
' ... (这里粘贴 GetAccessToken, CreateMenu, DeleteMenu 三个函数) ...
' --- 主程序逻辑 ---
' 1. 首先获取Access Token
Dim tokenJson, accessToken
tokenJson = GetAccessToken(APPID, APPSECRET)
' 使用ASP的JSON解析器(如果有的话)或者手动解析
' 这里为了简单,我们使用正则表达式来提取access_token
' 注意:这不是最健壮的方法,但对于简单场景足够了。
' 推荐使用更专业的JSON解析库,如VB-JSON等。
Dim regex, matches
Set regex = New RegExp
regex.Pattern = """access_token""\s*:\s*""(.+?)"""
regex.Global = True
Set matches = regex.Execute(tokenJson)
If matches.Count > 0 Then
accessToken = matches(0).SubMatches(0)
' 2. 定义菜单的JSON结构
' 这是一个示例菜单,包含一个一级菜单“官网”和一个二级菜单“关于我们”
' 点击“关于我们”会跳转到指定网页
Dim menuData
menuData = "{"
menuData = menuData & " ""button"": ["
menuData = menuData & " {"
menuData = menuData & " ""name"": ""官网"","
menuData = menuData & " ""sub_button"": ["
menuData = menuData & " {"
menuData = menuData & " ""type"": ""view"","
menuData = menuData & " ""name"": ""关于我们"","
menuData = menuData & " ""url"": ""http://www.yourdomain.com/about.html"""
menuData = menuData & " }"
menuData = menuData & " ]"
menuData = menuData & " }"
menuData = menuData & " ]"
menuData = menuData & "}"
' 3. 调用创建菜单的函数
Dim responseJson
responseJson = CreateMenu(accessToken, menuData)
' 4. 输出结果
Response.Write "<h1>菜单创建结果</h1>"
Response.Write "<pre>"
Response.Write "Access Token: " & accessToken & vbCrLf & vbCrLf
Response.Write "发送的菜单数据: " & menuData & vbCrLf & vbCrLf
Response.Write "微信API返回: " & responseJson
Response.Write "</pre>"
Else
' 获取Token失败
Response.Write "<h1>获取Access Token失败</h1>"
Response.Write "<pre>"
Response.Write "返回的JSON: " & tokenJson
Response.Write "</pre>"
End If
' 清理对象
Set matches = Nothing
Set regex = Nothing
%>
调试与发布
1. 使用菜单生成器
手动编写JSON菜单结构非常容易出错,强烈建议使用在线的微信菜单生成器,它会帮你生成标准格式的JSON。
- 推荐工具: 微信菜单生成器
- 用法:
- 在网页上可视化地设计你的菜单。
- 点击“生成代码”,复制完整的JSON内容。
- 将你代码中的
menuData变量替换为生成器给出的JSON字符串。
2. 使用微信公众平台的调试工具
微信公众平台提供了强大的调试工具,可以让你在发布前测试菜单是否正确。
- 登录微信公众平台,进入“开发者工具” -> “公众号测试账号”。
- 你可以使用你的服务号生成一个临时的测试账号,并获取测试用的
AppID和AppSecret。 - 使用测试账号的凭证修改你的
create_menu.asp文件中的APPID和APPSecret。 - 访问你的
create_menu.asp页面执行创建操作。 - 在测试账号界面,你可以直接看到菜单的预览效果,并且可以点击测试,查看是否跳转到正确的URL。
3. 发布菜单
当你使用测试账号确认菜单无误后,将 create_menu.asp 文件中的 APPID 和 APPSecret 替换为你正式服务号的凭证,再次访问该页面,菜单就会立即生效,所有关注你的用户都能看到新的菜单。
常见问题与注意事项
- Access Token过期: Token有效期为7200秒(2小时),你的应用应该有一个机制来缓存Token,并在过期前自动刷新,而不是每次调用都重新获取,可以使用Application变量或文件缓存。
- HTTPS: 微信所有API请求都要求使用
HTTPS协议,你的服务器必须支持SSL。 - 编码: 确保你的ASP页面和发送的JSON数据都使用
UTF-8编码,以避免中文乱码。 - 错误处理: 代码中包含了基本的错误处理,但微信API返回的JSON也可能包含错误信息(如
errcode和errmsg),你应该解析这些返回值,根据错误代码进行相应处理。errcode: 40001 表示access_token无效,需要重新获取。 - 权限: 确保你的服务号已经获得“自定义菜单”的权限(通常需要认证)。
- 点击事件: 如果菜单项类型是
click,用户点击后微信服务器会向你在“服务器配置”中设置的URL发送一个POST请求,事件类型为CLICK,你的服务器需要处理这个事件并做出响应(回复一段文本消息),这超出了本教程的范围,但它是完整菜单功能的一部分。
