当前代码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校验成功,这时你从公众号的聊天窗口输入一段文本,公众号应该会回显你的输入内容。