當前代碼tag: v0.0.1,https://github.com/yangbajing/wechat-meal/tree/v0.0.1html
微信公衆號提供了詳盡的API文檔說明,提供了明文和加密兩種接入方式。這裏,咱們選擇加密的接入方式微信公衆號接入指南。node
本此實戰的代碼部署到了Heroku
,讀者也能夠下載代碼嘗試部署到Heroku
並鏈接微信公衆號。本章末尾講講述Heroku
的部署及怎樣與微信公衆號鏈接。git
如今主要的功能是實現與微信公衆號的鏈接,咱們將在微信裏實現一個echo
功能。就是用戶在公衆號聊天窗口裏輸入一段文本,系統原樣返回。github
鏈接微信API的代碼WeixinCtrl
。微信公衆號的鏈接分兩個部分:shell
驗證服務器地址有效性 這個接口爲WeixinCtrl.get
方法,用戶校驗服務器的有效性api
依據接口文檔實現業務邏輯 這個接口爲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
標準注入方式的實現:Guice
。app
@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
,支持Mac
、Linux
和Windows
系統。Heroku
的方式:
Toolbelt
用Git
方式提交Github
代碼庫Dropbox
提交。這裏選擇了經過Toolbelt
手動提交到Heroku
的GIT代碼庫的方式。
GIT
版本庫$ cd wechat-meal/ $ git init $ heroku git:remote -a wechat-meal
$ git add . $ git commit -am "make it better" $ git push heroku master
程序使用「加密鏈接」的方式,示例代碼已經整合了微信提供的Java版
加密、解密功能。
在URL(服務器地址)
配置好鏈接微信API的服務地址,這裏注意須要使用http協議(必需爲80端口)。設置好Token(令牌)
和EncodingAESKey(消息加解密密鑰)
,並選擇「安全模式」。
當所有配置都設置好後就能夠點擊「提交」按鈕了。若微信API校驗成功,這時你從公衆號的聊天窗口輸入一段文本,公衆號應該會回顯你的輸入內容。