如图一:能获取到access_token,说明appid和appsecret都是正确的,然后对已关注用户的提问进行回复,调用的接口是:https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN,返回40003错误,提示openid不对。但是同样的接口,同样的参数,我在postman和调试工具(https://mp.weixin.qq.com/debug/)都可以正常测试ok,见图二、图三。
麻烦问下该怎么处理,我已经试了在网上找到的所有办法,包括注意顺序,注意格式,重新关注之类的,都不行。救命啊。
图一:(errmsg:'invalid openid rid: 635985d9-3360cafe-7a783cfa')
图二:用postman调用是成功的,在公众号可以收到发送的消息。
图三:用调试工具调用也是成功的,在公众号也能收到发回的消息。
图四:关注服务号的微信也能收到从postman和调试工具发的消息。
你好,麻烦提供下openID,请勿提供打码截图
蹲个后续,请问一下楼主后面怎么解决的?遇到了同样的问题
测试脚本:
const talkControllor = require('./wxControllor'); console.log('测试通过公众号给用户发消息'); // 测试发送消息给微信 const _mockData={ userOpenId:'oJv0u5rvPwXZfGDzvFUquo_N30ZM', content:'您的申请已收到,感谢提交!' } talkControllor.reply(_mockData);
wxControllor.js完整代码如下:
// wxControllor.js const axios = require('axios'); class TalkControllor { // 回复用户消息 static reply(data) { // 转换数据格式 const _body = WeiXinHelper.toText(data); // 发送消息 TalkControllor.Send(_body); } // 发消息给用户 static async Send(msg) { // TODO:test const apiPre='https://api.weixin.qq.com/cgi-bin/'; //const _accessToken = await this.GetAccessToken(); // 获取accesstoken const _accessToken= '62_3ttn31TLHSpOdb-PwugmDsTTKtGyzlqCRb3KEUwt_KtpKMIS7IsHmgj7chgJwTpy6Yizv5kfpdh306pxXrS_iXHQTNVjuNOZIiAFAZKT'; const _json = JSON.parse(msg); //发送 axios.post(apiPre + 'message/custom/send?access_token=' + _accessToken, { //data:JSON.parse(msg) data: { "touser": _json.touser, "msgtype": _json.msgtype, "text": { "content": _json.text.content } }, responseType: 'json', responseEncoding: 'utf8' }) .then(function (response) { console.log('发消息后,微信回复:'); console.log(response.data); }) .catch(function (error) { console.log(error); }) .then(function () { // TODO:记录发送日志 }); } } class WeiXinHelper{ // 转换为微信代码格式 static toText(obj){ let str=WeiXinHelper.template.text; str = str.replace(/{userOpenId}/, obj.userOpenId); str=str.replace(/{content}/, obj.content); return str; } } WeiXinHelper.template={//向公众号发送消息模版(Json格式) text: `{ "touser":"{userOpenId}", "msgtype":"text", "text": { "content":"{content}" } }` } // 将该模块导出 module.exports = TalkControllor;
你代码里有没有最后调用发消息接口的日志,看看你代码里传的参数是什么
1 . url里面传accesstoken:https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=xxx
2. 回传的参数放在postdata里面。
代码如下:
// 发消息给用户
static async Send(msg){
const _accessToken = await this.GetAccessToken(); // 获取accesstoken
const _json = JSON.parse(msg);
//发送
axios.post(apiPre+'message/custom/send?access_token='+_accessToken, {
//data:JSON.parse(msg)
data:{
"touser":_json.touser,
"msgtype":_json.msgtype,
"text":{
"content":_json.text.content
}
},
responseType: 'json',
responseEncoding: 'utf8'
})
.then(function (response) {
console.log('发消息后,微信回复:');
console.log(response.data);
})
.catch(function (error) {
console.log(error);
})
.then(function () {
// TODO:记录日志
});
}