发送消息
微信服务器开放了很多API,不过这些API还是挺整齐的,套路很简单。说白了就是各种get或者post它提供的url一下,然后它给你一个json的响应。借着ES 6和Promise的东风,我搞了下面这样一个实现:
走在队伍最前面的是Talker
,它的身后跟着一群Manager。除此之外,Talker
还有个助手,叫AccessTokenKeeper
,它帮Talker
管理向微信服务器喊话用的口令。这个喊话小团伙就这三种岗位,结构简单,权责清晰。
每次我们要发什么消息的时候,就把关键内容告诉相应的Manager,Manager会帮给你写一份格式化的报告。就是上图中Message那个样子,其中会有url
,method
,json格式的parameters
或者body
。我们把这个Message交给Talker
去send
就ok了。Talker会根据Message中的method
,决定用get
还是post
,当然,具体工作它都是交给著名的通讯员fetch去干的。
有一点要说明的是,如果你对accessToken
有特殊的要求,可以实现一个TokenStore
给Talker
,你怎么存Talker
并不关心,只要有loadAccessToken
,需要的时候能把accessToken
拿出来就可以了。
用代码来描述这个过程,大概是这样的:
talker.send(UserManager.usersGet())
.then(response => response.json())
.then(json => {
if(json.errcode) {
console.log("Get user list got error:",json.errmsg)
throw Error(json.errmsg)
} else {
console.log("Get users:",json)
return MessageManager.textToCustom("感谢订阅",json.next_openid)
}
})
.catch(error => {
console.log("There is an error to get nextOpenId")
})
.then(message => talker.send(message))
.then(response => response.json())
.then(json => {
if(json.errcode) {
console.log(`Send text message to customer ${nextOpenId} got error:${json.errmsg}`)
} else {
console.log(`Send text message to ${nextOpenId} success`)
}
})
接下来请看我们最重要的Talker
:
class Talker {
constructor(options) {
this.tokenKeeper = new TokenKeeper(options)
}
send(message) {
switch(message.method) {
case "get":
return this._get(message)
case "post":
return this._post(message)
default:
return new Promise(( resolve,reject) => {
reject({
errcode:10001,
errmsg:"There is no method in message"
})
})
}
}
_get(message) {
...
}
_post(message) {
...
}
}
篇幅有限,就不完全展开了,_get和_post都很简单,就是拿到accessToken后返回一个fetch请求。虽然Talker简单,但Manager更简单,比如MessageManager
的textToCustomer
:
static textToCustom(content,openId) {
return {
"url":`${customUrlPrefix}send`,
"method" : "post",
"body": {
"touser":openId,
"msgtype":"text",
"text":
{
"content":content
}
}
}
}