nodejs调用微信接口返回47001错误

在公司开发的时候,做了一个评论区,在评论区中需要对用户发表的评论内容做一定的过滤。经商量决定还是使用微信的msgSecCheck接口来过滤吧。

在进行接口调用的时候,我自己使用接口测试工具的时候,是可以正常获取结果的。但是在使用http.request进行接口数据传输的时候,一直返回的就是47001错误。在网上评论大概有以下几种原因。

  • 传送的json错误。在json的错误这里。错误有两个:
      一个是json字符串中不能包含单引号:这个方式,我试了下,并没有什么用。而使用接口测试工具的时候,把json字符串中的双引号改成单引号的时候,反而报错。所以这种方式,pass。
      还一个就是json字符串中不能包含换行符。可是我的这个字符串,根本就没有换行符。所以pass。
      最后一个就是我的json字符串,不规范。可是我都将我传输的json字符串,使用json校验工具检查了,并没有问题,所以这种可能依旧pass。
  • json中字符编码的问题。话说也很奇怪。我在校验字母和英文的时候,是没有问题的,但是在校验中文的时候,就会报错。本来以为是编码的问题,在进行测试的时候,并没有发现是乱码等问题。所以pass。
  • http.request中header设置问题。在一开始的时候,我就觉得应该是这个问题,可是网上的百度资料,除了copy的还是copy的重复的。在微信开发者中心进行搜索的时候,微信官网发现header和我本地并没有问题啊。无奈只是纠结。
      经过了上述的测试和分析,问题已经出来了,就是http.request中的header设置问题。无奈我只能求救老大。老大,过来把我的header一改,整个校验就跑起来了,果然,经验真不是能吹出来的。至于这个问题,我需要再查看下http的具体详解。至于为什么,等我忙完这件事,再出一个详细的教程。不说废话了,上代码再说问题。
return getTokenByDB(wxGameClient)
        .then(config =>{
            if(!config) throw new Error('get token by db failed!')
            return new Promise((resolve, reject) => {
                let pushContent =  JSON.stringify({"content":paramsStr });
                let options = {
                    hostname: 'api.weixin.qq.com',
                    port : 443,
                    path: '/wxa/msg_sec_check',
                    method: 'POST',
                    headers:{
                        'Content-Type': 'text/html; charset=utf-8',
                        //'Content-Type': 'application/json; charset=utf-8',
                        'Content-Length': Buffer.byteLength(pushContent)
                        //'Content-Length': pushContent.length
                    }
                };
                options.path = options.path + '?' + querystring.stringify({access_token:config[0].data.access_token});
                let req = https.request(options, (res) => {
                    let data = '';
                    res.on('data', (d) => {
                        data += d;
                    });
                    res.on("end", function () {
                        try{
                            data = JSON.parse(data);
                        }catch(e){
                            return reject({code : 50000, errmsg : e, message : data});
                        }
                        if(data.errcode === 87014) return reject('有敏感信息!');
                        else if(data.errcode === 0)  return resolve(data);
                        else reject({code : 50000,message : data})
                    });
                });
                req.write(pushContent);//写入传递的数据
                req.on('error', e => {
                    let err = new Error(e)
                    err.code = 500
                    reject(err)
                });
                req.end();
            })
        })

再上面的代码中,再header配置中,注释掉的是我原来的设置,新改的设置,是成功的,其实对比一下,就是这么点问题。浪费了我一上午的时间。看来是时候,好好弄弄http请求详解了。

你可能感兴趣的:(微信,nodejs,微信信息校验,报错47701)