发送消息

微信服务器开放了很多API,不过这些API还是挺整齐的,套路很简单。说白了就是各种get或者post它提供的url一下,然后它给你一个json的响应。借着ES 6和Promise的东风,我搞了下面这样一个实现:

走在队伍最前面的是Talker,它的身后跟着一群Manager。除此之外,Talker还有个助手,叫AccessTokenKeeper,它帮Talker管理向微信服务器喊话用的口令。这个喊话小团伙就这三种岗位,结构简单,权责清晰。

每次我们要发什么消息的时候,就把关键内容告诉相应的Manager,Manager会帮给你写一份格式化的报告。就是上图中Message那个样子,其中会有urlmethod,json格式的parameters或者body。我们把这个Message交给Talkersend就ok了。Talker会根据Message中的method,决定用get还是post,当然,具体工作它都是交给著名的通讯员fetch去干的。

有一点要说明的是,如果你对accessToken有特殊的要求,可以实现一个TokenStoreTalker,你怎么存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更简单,比如MessageManagertextToCustomer

static textToCustom(content,openId) {
    return {
              "url":`${customUrlPrefix}send`,
              "method" : "post",
              "body": {
                           "touser":openId,
                            "msgtype":"text",
                            "text":
                            {
                                 "content":content
                            }
                        }
            }
}

results matching ""

    No results matching ""