Scala實戰-經過微信聊天窗口實現應答式點餐 1:鏈接微信API

當前代碼tag: v0.0.1,https://github.com/yangbajing/wechat-meal/tree/v0.0.1html

微信公衆號提供了詳盡的API文檔說明,提供了明文和加密兩種接入方式。這裏,咱們選擇加密的接入方式微信公衆號接入指南node

本此實戰的代碼部署到了Heroku,讀者也能夠下載代碼嘗試部署到Heroku並鏈接微信公衆號。本章末尾講講述Heroku的部署及怎樣與微信公衆號鏈接。git

微信API

如今主要的功能是實現與微信公衆號的鏈接,咱們將在微信裏實現一個echo功能。就是用戶在公衆號聊天窗口裏輸入一段文本,系統原樣返回。github

鏈接微信API的代碼WeixinCtrl。微信公衆號的鏈接分兩個部分:shell

  1. 驗證服務器地址有效性 這個接口爲WeixinCtrl.get方法,用戶校驗服務器的有效性api

  2. 依據接口文檔實現業務邏輯 這個接口爲WeixinCtrl.post方法,經過微信公衆號聊天窗口發送的各種消息都會發送的這裏。安全

代碼WeixinService是因此微信API相關功能實現的入口,如今提供了簽名校驗、加密消息和解密消息功能。服務器

WeixinCtrl控制器中,咱們將收到的微信公衆號消息原樣返回給用戶:微信

def post = Action.async(parse.tolerantText) { request =>
    def getBody = ......

    def responseContent(body: String) = {
      val node = scala.xml.XML.loadString(body)
      OrdinaryMessage.msgType(node) match {
        case MessageTypes.Event => // event
          ......
        case _ => // message
          getContent(node)
      }
    }

    for {
      body <- getBody
      resp <- responseContent(body)
    } yield {
      Ok(resp).withHeaders("Content-Type" -> "application/xml; charset=UTF-8")
    }
  }
  
  private def getContent(node: Elem, reply: String = ""): Future[String] = {
    val msg = OrdinaryMessage(node)
    val newTs = Utils.currentTimeSeconds()
    val replyContent =
      if (StringUtils.isEmpty(reply)) {
        msg.contentOption getOrElse "歡迎關注羊八井花園"
      } else {
        reply
      }
    val respStr = OrdinaryTextResponse(msg.fromUserName, msg.toUserName, newTs, replyContent).stringify()
    weixinService.encryptMsg(respStr, newTs, Utils.randomString(8))
  }

Play 2的依賴注入

Play 2.4開始,官方推薦使用依賴注入的方式定義路由和服務了,Play使用了一個Java標準注入方式的實現:Guiceapp

@Singleton
class WeixinCtrl @Inject()(weixinService: WeixinService) extends Controller with BaseController {
  def get(signature: String, echostr: String, timestamp: String, nonce: String) = Action.async { request =>
    logger.debug(request.rawQueryString)

    weixinService.validateSign(timestamp, nonce).map {
      case `signature` => Ok(echostr)
      case s =>
        logger.error(s"$s not match $signature")
        BadRequest
    }
  }
......

@singleton註解表示這個控制器將作爲單例存在於整個應用生命週期,默認狀況是每次調用時都會從新生成一個。

Play中,注入依賴的方式和Java很不同,它是在scala類定義的主構造器中注入的,而Java代碼中咱們通常是在類的私用屬性變量上進行注入。@Inject()是一個特殊的語法,用於修飾構造函數,以後的參數實例將由註解框架自動注入。在這裏,weixinService這個服務就由系統框架注入了,咱們不須要手動管理它的生命週期。

部署代碼到Heroku

Heroku官網https://www.heroku.com註冊開發者帳號。

  • 登錄Heroku的Dashboard,點擊屏幕右上方的+號按鈕添加新應用。
  • 安裝Heroku Toolbelt,支持MacLinuxWindows系統。
  • 有3種部署代碼到Heroku的方式:
    • 經過ToolbeltGit方式提交
    • 鏈接到你的Github代碼庫
    • 經過Dropbox提交。

這裏選擇了經過Toolbelt手動提交到Heroku的GIT代碼庫的方式。

  1. 添加新的或已存的項目到GIT版本庫
$ cd wechat-meal/
$ git init
$ heroku git:remote -a wechat-meal
  1. 部署應用
$ git add .
$ git commit -am "make it better"
$ git push heroku master

鏈接微信公衆號

程序使用「加密鏈接」的方式,示例代碼已經整合了微信提供的Java版加密、解密功能。

配置微信接口參數

URL(服務器地址)配置好鏈接微信API的服務地址,這裏注意須要使用http協議(必需爲80端口)。設置好Token(令牌)EncodingAESKey(消息加解密密鑰),並選擇「安全模式」。

當所有配置都設置好後就能夠點擊「提交」按鈕了。若微信API校驗成功,這時你從公衆號的聊天窗口輸入一段文本,公衆號應該會回顯你的輸入內容。

相關文章
相關標籤/搜索