我看了官网给的对接微信公众号的文档,里面给了一个例子URL:http://ai.baidu.com/unit-3rd-party/callback ,这个地址是百度AI提供的测试地址,可以直接配置到公众号里直接使用,可是他提供了一些自己的测试语句,而且他给的二维码测试公众号,好像不支持语音,试了几句话,都是提示“没有听清你的语音”,不知道是不是我手机问题,所以决定连接到自己的公众号,并且自己配置UNIT自己定制对话。具体怎么配置UNIT的对话,可以看官方文档,也可以看我上一篇关于UNIT的帖子。
首先,要有自己的公众号,这个可以去微信官网申注册,很简单,几部就搞定,可以选择个人的,也可以选择公司的,看自己的需求。
按照步骤一步步执行即可,申请成功后,就有了自己的微信公众号了,那么下一步在微信公众号里开通开发者,
开通之后,微信就会生成一个开发者ID,这就算开通成功了
下一步需要下载一个服务端代码部署到自己的服务器上,https://ai.bdstatic.com/file/374AA32FCE3641A49816720409A712D9
这个是百度AI提供的一个服务,用java写的,其实实现很简单:
逻辑就是接收微信里用户输入的信息作为请求参数,然后把输入信息传递给UNIT API,然后UNIT进行一系列的解析,然后把处理的结果返回给服务,然后服务再把结果返回给微信公众号,然后显示给用户。支持用户输入文字和语音,其实语音微信最终会解析成文字给到服务端的。
所以这个服务完全可以由我们客户自己去写,不限制语音,可以用python,可以用Nodejs,只要提供web服务,通过http接口调用即可。
百度AI提供的程序,需要打包成war包,放到tomcat容器里才能运行。自从接触了springboot后,再也懒的安装tomcat了,所以我自己用springboot简单改造了一下他们的代码,其它都没动。打包成jar包,不用安装tomcat,只要有java环境,直接运行java -jar *.jar 这个jar包直接搞定。需要的小伙伴可以加我微信单独发给你。二维码在最下面。
先说说官网给的代码,需要修改几个配置文件,指定到自己的UNIT应用,
配置文件修改之后就可以打war包了。这个项目打包之后,生成了一个ROOT.war,因为他配置了pom文件里的finalName是ROOT,所以生成了ROOT.war
然后把ROOT.war放到服务器上tomcat里的webapps下就行了。
启动tomcat,启动成功后,然后下一步就要配置微信公众号来指向我们的服务器地址。
这个地方顺便说一句,对应初级程序员可能有帮助,
我的配置是http://unit.***.com/callback,而百度AI给的样例是http://ai.baidu.com/unit-3rd-party/callback ,多了一个项目名unit-3rd-party,这个地方我觉得对有经验的程序员来说,会直接删除这个项目名,而对于初学者来说,可能这么配置就报错了,而且微信公众号给的提示是token校验失败,但是token的确是对的。这说明微信公众号的报错提示不够严谨,没有逻辑校验,不管是什么错误,只要报错,都报同一个错误提示。
这里给初学者讲一下,为什么报错。
我们平时在tomcat下开发测试的时候,一般都是这么请求的:http://localhost:8080/项目名,项目名代表我们的要测试的项目,如果不写默认就是webapps目录下的ROOT项目 。所以配置里加了unit-3rd-party项目名,这样导致微信找不到这个路径。就报错了。其实他应该报URL地址错误。
如果非要按照百度给的样例加一个项目名的话,只需要修改一下pom里的配置finalName为unit-3rd-party即可
然后把unit-3rd-party.war放到webapps下,启动tomcat。然后配置微信公众号的URL地址,这时候就要把unit-3rd-party这个项目名称加上了。其他配置跟刚才是一样的。
配置完后,点击提交,这时候提示 “提交成功”,这时候说明我们的配置参数都是正确的,和百度UNIT已经对接成功了。服务器配置地方点击 "启用" 。
注意:一定要先启动tomcat,然后再配置微信,因为点击提交的时候微信会调用这个GET callback接口进行微信认证。
到这一步就完事儿了。小伙伴可以开开心心的使用微信公众号发消息进行验证了。
但是,
我粗心大意了,当我在微信公众号发消息的时候总是报错。
但是看不到错误消息,不知道报什么错。问题是肯定出现在我的服务器端了。调用服务器是微信后台转发调用的,所以用抓包工具是抓不到请求过程的,而且之前没做个微信公众号的开发,所以不知道他的请求格式是什么,所以也没办法用调试工具模拟调用,所以只能分析百度AI给的代码,发现他在接口里解析了一个xml,把解出来所有用到的数据放到了map里,所以我就改了一下代码加入输出map到日志文件里,然后重新部署,重新请求,然后输出到日志的数据拿出来数据组装成一个xml,就可以手动用模拟工具调用了。
日志: 接收到 微信平台 发送的消息:, {Format=amr, MediaId=AZXi4Ab6AEVT2yaIv74OIKkxjb8vPWG7cQYJ6Yttdmu4iekomGuE5MH-y1oINeOB, CreateTime=1513221912, ToUserName=gh_eea8ce28a776, FromUserName=oGmOJ1upSiE8rcpQhQKywl-IuHZs, MsgType=voice, MsgId=6499238623630589952, Recognition=我要听郭德纲。}
既然可以模拟调用了,那么我在本地启动服务,然后用模拟工具调用我本地服务,最终看到了报错,error_code = "282901",然后对照系统提供的错误码,终于发现了是什么错误。
这个地方的确是我自己粗心大意了。没有把应用和我的场景进行关联。然后找到我的应用,发现没有修改功能?我没理解系统为什么不让修改,然后我只能删除原来的应用,重新建一个新的应用。这个地方需要请教一下客服人员,为啥不能修改呢?
然后再核对一下程序的配置参数,用模拟工具再次调用。beautiful
最后到微信公众号测试:
下面是我公众号,大家可以试试效果:
我要听英语栏目
我要听汽车栏目
我要听郭德纲的专辑
等等。
后续还会加入更多。比如导航。。收音机,音乐等等。
嗯嗯,严谨点
就改造了一下,没有版权的,要的话加我发给你,哈哈
写得太详细了.还有排坑指南.
代码可以丢在gitee
哈哈,我先飘一会儿。。。
加油!Unit版块有你就行了hhhhh
你可以写写其他的啊
明明是 “互扯” 哈哈
可以。有人写了Java。那我就不写了 哈哈
这名字好牛逼...胡扯程序.
太客气了 哈哈 要像go神一样早日成就大神行列
谢谢谢谢
非常不错 不愧是精品贴 哈哈
谢谢,谢谢
很详细很ok。精品
有一处描述有误,有修改应用的功能,太不明显,没有看到,在左上角,更正此错误。