整天净瞎bb搞...
新的订阅消息来了,什么玩意?省去了formID 的模板消息,对字段类型还控制,也算是给前后端都省了一个方法,但是!要授权啊!好吧,前端又回来了,总结:折腾。
搞起来发现用户触发云函数可以发送模板消息,但定时执行会报错:
{ Error: errCode: -501007 invalid parameters | errMsg: subscribeMessage.send:fail Invalid request param
at new CloudSDKError (/var/user/node_modules/wx-server-sdk/index.js:6389:28)
at Object.<anonymous> (/var/user/node_modules/wx-server-sdk/index.js:424:35)
at step (/var/user/node_modules/tslib/tslib.js:136:27)
at Object.next (/var/user/node_modules/tslib/tslib.js:117:57)
at fulfilled (/var/user/node_modules/tslib/tslib.js:107:62)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
errCode: -501007,
errMsg: 'subscribeMessage.send:fail Invalid request param' }
这不是和原来模板消息 一样的问题吗?还是需要用户点击?真是改了个j8...
算了,还是用request-promise请求吧,懂的直接到后面复制代码。
第一步:云函数中:package.json 中增加引用 request-promise
"dependencies": {
"wx-server-sdk": "latest",
"request-promise": ""
}
第二步:
新建集合(表明)accessToken,添加记录:
“_id”:“ACCESS_TOKEN”
新建云函数timerGetAccessToken,搞成定时执行,调用时间:"config": "10 2 */1 * * * *" 每一小时一次
这个方法同样引入request-promise
目的是获取有效token保存起来拱send使用
//timerGetAccessToken
const cloud = require('wx-server-sdk')
cloud.init({
env: 'test-mmmmm'
// env: 'jvben-rrrrr'
})
const db = cloud.database()
const coll_token = db.collection('accessToken');
const rq = require('request-promise')
const APPID = 'wxb*********';
const APPSECRET = 'a************************';
exports.main = async (event, context) => {
try {
let res = await rq({
method: 'GET',
uri: "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + APPSECRET,
});
res = JSON.parse(res)
let resUpdate = await coll_token.doc('ACCESS_TOKEN').update({
data: {
token: res.access_token
}
})
} catch (e) {
console.error(e)
}
}
到这里先执行一下timerGetAccessToken 看access_token获取到没
第三步:
在你的定时发送函数下新建templateMessage.js,代码如下
const rp = require('request-promise');
const sendTemplateMsg = async(token, param) => {
return await rp({
json: true,
method: 'POST',
uri: 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=' + token,
body: {
touser: param.touser,
template_id: param.templateId,
page: param.page,
data: param.data
}
}).then(res => {
return true
}).catch(err => {
return false
console.error(err)
})
}
module.exports = {
sendTemplateMsg: sendTemplateMsg,
}
index.js中:写sendMsg方法传参调用就可以了:
const templateMessage = require('templateMessage.js')
const cloud = require('wx-server-sdk')
async function sendMsg(data) {
let tokenRes = await db.collection("accessToken").doc("ACCESS_TOKEN").get();
let token = tokenRes.data.token; // access_token
let param = {
touser: data.openId,
page: '******',
data: {
thing1: {
value:"啊实打实大"
},
date2: {
value:"2019-12-12"
}
},
templateId: '******************************',
}
var result = await templateMessage.sendTemplateMsg(token, param);
return result
}
结束:没啥想说的,感觉这个问题未来会修复,毕竟人家云开发都有几万的套餐了。。。。