微信公众号自定义菜单ASP教程

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

微信公众号自定义菜单ASP教程
(图片来源网络,侵删)

目录

  1. 准备工作
    • 1. 申请服务号
    • 2. 获取开发者凭证
    • 3. 设置服务器配置(Token, EncodingAESKey)
    • 4. 获取Access Token
  2. 核心概念:Access Token
  3. 菜单创建与删除API
  4. ASP代码实现
    • 1. 获取Access Token的ASP函数
    • 2. 创建自定义菜单的ASP函数
    • 3. 删除自定义菜单的ASP函数
  5. 完整示例代码
  6. 调试与发布
    • 1. 使用菜单生成器
    • 2. 使用微信公众平台的调试工具
    • 3. 发布菜单
  7. 常见问题与注意事项

准备工作

在编写任何代码之前,你必须完成以下微信官方的配置步骤。

1. 申请服务号

自定义菜单功能仅对服务号开放,如果你拥有的是订阅号,需要先升级为服务号(需满足一定条件,如认证等)。

2. 获取开发者凭证

登录微信公众平台,进入“设置与开发” -> “基本配置”,你可以看到:

  • AppID (应用ID): 也叫wx_idcorp_id
  • AppSecret (应用密钥): 也叫wx_secretcorp_secret

这两个是调用API时进行身份验证的关键,请务必妥善保管,不要泄露。

微信公众号自定义菜单ASP教程
(图片来源网络,侵删)

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去微信服务器“换”这把钥匙。

微信公众号自定义菜单ASP教程
(图片来源网络,侵删)

获取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格式的菜单结构数据。
  • 删除菜单: GET请求

    • URL: https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
    • 请求体: 无。

ASP代码实现

下面是关键的ASP函数实现,我们将使用微软的MSXML2.ServerXMLHTTP对象来发送HTTP请求。

1. 获取Access Token的ASP函数

这个函数会调用微信API,并返回一个包含access_tokenexpires_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_APPIDYOUR_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。

  • 推荐工具: 微信菜单生成器
  • 用法:
    1. 在网页上可视化地设计你的菜单。
    2. 点击“生成代码”,复制完整的JSON内容。
    3. 将你代码中的 menuData 变量替换为生成器给出的JSON字符串。

2. 使用微信公众平台的调试工具

微信公众平台提供了强大的调试工具,可以让你在发布前测试菜单是否正确。

  1. 登录微信公众平台,进入“开发者工具” -> “公众号测试账号”。
  2. 你可以使用你的服务号生成一个临时的测试账号,并获取测试用的AppIDAppSecret
  3. 使用测试账号的凭证修改你的 create_menu.asp 文件中的 APPIDAPPSecret
  4. 访问你的 create_menu.asp 页面执行创建操作。
  5. 在测试账号界面,你可以直接看到菜单的预览效果,并且可以点击测试,查看是否跳转到正确的URL。

3. 发布菜单

当你使用测试账号确认菜单无误后,将 create_menu.asp 文件中的 APPIDAPPSecret 替换为你正式服务号的凭证,再次访问该页面,菜单就会立即生效,所有关注你的用户都能看到新的菜单。

常见问题与注意事项

  1. Access Token过期: Token有效期为7200秒(2小时),你的应用应该有一个机制来缓存Token,并在过期前自动刷新,而不是每次调用都重新获取,可以使用Application变量或文件缓存。
  2. HTTPS: 微信所有API请求都要求使用HTTPS协议,你的服务器必须支持SSL。
  3. 编码: 确保你的ASP页面和发送的JSON数据都使用UTF-8编码,以避免中文乱码。
  4. 错误处理: 代码中包含了基本的错误处理,但微信API返回的JSON也可能包含错误信息(如errcodeerrmsg),你应该解析这些返回值,根据错误代码进行相应处理。errcode: 40001 表示access_token无效,需要重新获取。
  5. 权限: 确保你的服务号已经获得“自定义菜单”的权限(通常需要认证)。
  6. 点击事件: 如果菜单项类型是click,用户点击后微信服务器会向你在“服务器配置”中设置的URL发送一个POST请求,事件类型为CLICK,你的服务器需要处理这个事件并做出响应(回复一段文本消息),这超出了本教程的范围,但它是完整菜单功能的一部分。