Nodejs 创建微信自定义菜单

Nodejs 创建微信自定义菜单

有高手用nodejs创建过自定义菜单吗?请求指点

{ “button”:[ { “type”:“click”, “name”:“今日歌曲”, “key”:“V1001_TODAY_MUSIC” }, { “type”:“view”, “name”:“歌手简介”, “url”:“http://www.qq.com/” }, { “name”:“菜单”, “sub_button”:[ { “type”:“click”, “name”:“hello word”, “key”:“V1001_HELLO_WORLD” }, { “type”:“click”, “name”:“赞一下我们”, “key”:“V1001_GOOD” }] }] } 如果我的参数里不包含中文就可以创建成功,如果包含中文就创建不了。好像是数据编码的问题。求解决


8 回复

Nodejs 创建微信自定义菜单

在使用 Node.js 创建微信自定义菜单时,遇到包含中文字符无法创建成功的问题,通常是由于字符编码问题导致的。下面是一个简单的示例代码,展示如何使用 Node.js 创建微信自定义菜单,并确保中文字符正确处理。

示例代码

首先,确保你已经安装了 axios 库来发送 HTTP 请求:

npm install axios

然后,你可以使用以下代码来创建自定义菜单:

const axios = require('axios');

// 微信公众号的 Access Token
const accessToken = 'YOUR_ACCESS_TOKEN';

// 自定义菜单数据
const menuData = {
    "button": [
        {   
            "type": "click",
            "name": "今日歌曲",
            "key": "V1001_TODAY_MUSIC"
        },
        {
            "type": "view",
            "name": "歌手简介",
            "url": "http://www.qq.com/"
        },
        {
            "name": "菜单",
            "sub_button": [
                {
                    "type": "click",
                    "name": "hello word",
                    "key": "V1001_HELLO_WORLD"
                },
                {
                    "type": "click",
                    "name": "赞一下我们",
                    "key": "V1001_GOOD"
                }
            ]
        }
    ]
};

// 将 JSON 数据转换为字符串
const postData = JSON.stringify(menuData);

// 发送 POST 请求到微信服务器
axios.post(`https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${accessToken}`, postData, {
    headers: {
        'Content-Type': 'application/json;charset=utf-8'
    }
})
.then(response => {
    console.log('Menu created successfully:', response.data);
})
.catch(error => {
    console.error('Error creating menu:', error.response ? error.response.data : error.message);
});

解释

  1. 获取 Access Token: 在实际应用中,你需要从微信服务器获取 access_token。这里假设你已经有一个有效的 access_token
  2. 构造菜单数据: 定义一个包含菜单项的对象 menuData,其中包含了点击事件(click)和跳转链接(view)。
  3. 处理中文字符: 确保所有中文字符都正确编码,并且在发送 POST 请求时设置 Content-Typeapplication/json;charset=utf-8,以确保中文字符能够被正确解析。
  4. 发送请求: 使用 axios.post 方法向微信服务器发送 POST 请求,创建自定义菜单。

通过上述步骤,你应该能够成功创建包含中文字符的微信自定义菜单。


试试unicode看

https://github.com/tomas/needle 用了这个post请求,就能创建了。

应该是 Content-Length 的问题, javascript 对一个中文字符计算长度为 1, 而 HTTP 协议的body是以字节为长度的, 一个中文字符通常要2-3字节, 你在发请求的时候http头里的 Content-Length 要写成字节长度而不是字符长度

可以的,没有问题,你的问题错误是什么?

只要name是中文的就会返回的是40024,或者40026。现在我用needle创建成功了。

这个自定义菜单的接口是不是得交300块钱的认证费才行的呀?

创建微信自定义菜单时,如果包含中文字符,确实可能会遇到编码问题。以下是一个使用Node.js来创建微信自定义菜单的示例代码,并且会处理中文字符的编码问题。

首先确保你已经在微信公众平台注册并获得了相应的appidappsecret。你需要通过这两个信息获取到access_token,然后利用这个token来创建自定义菜单。

示例代码

const axios = require('axios');
const qs = require('querystring');

// 微信公众平台的相关信息
const appid = 'YOUR_APP_ID';
const appsecret = 'YOUR_APP_SECRET';

// 获取access_token的URL
const tokenUrl = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}`;

// 创建自定义菜单的URL
const menuUrl = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=';

async function getAccessToken() {
    try {
        const response = await axios.get(tokenUrl);
        return response.data.access_token;
    } catch (error) {
        console.error("获取access_token失败", error);
    }
}

function createMenu(menuJson, accessToken) {
    const url = `${menuUrl}${accessToken}`;
    axios.post(url, menuJson)
        .then(response => {
            console.log("创建菜单结果:", response.data);
        })
        .catch(error => {
            console.error("创建菜单失败", error);
        });
}

// 菜单定义
const menuJson = {
    "button": [
        {
            "type": "click",
            "name": "今日歌曲",
            "key": "V1001_TODAY_MUSIC"
        },
        {
            "type": "view",
            "name": "歌手简介",
            "url": "http://www.qq.com/"
        },
        {
            "name": "菜单",
            "sub_button": [
                {
                    "type": "click",
                    "name": "hello word",
                    "key": "V1001_HELLO_WORLD"
                },
                {
                    "type": "click",
                    "name": "赞一下我们",
                    "key": "V1001_GOOD"
                }
            ]
        }
    ]
};

(async () => {
    try {
        const accessToken = await getAccessToken();
        createMenu(menuJson, accessToken);
    } catch (error) {
        console.error("程序执行错误:", error);
    }
})();

代码解析

  • getAccessToken: 这个函数用来从微信服务器获取access_token。
  • createMenu: 这个函数负责创建自定义菜单,它接收一个已经定义好的菜单JSON对象和access_token作为参数。
  • 在主程序中,首先获取access_token,然后调用createMenu函数将菜单信息发送给微信服务器。

确保你的菜单JSON中的所有字符串(特别是中文字符)都是正确的UTF-8编码。这段代码应该能帮助你在Node.js环境中成功创建包含中文的微信自定义菜单。

回到顶部