100 行代码在微信公众号里集成地图搜索功能

最近有不少朋友在微信上向我咨询 SAP 系统和微信公众号集成的问题,因此笔者把之前项目中学习到的集成经验总结成此文,分享给大家。
笔者之前在 SAP 成都研究院数字创新空间工作时,经常需要做一些在微信 app 里展示的原型,而微信里直接进行地图搜索,已经是国内客户公认的一个最基本的需求了。
Jerry 当时工作中需要给某个微信公众号增添一个新的菜单,用户点击之后,需要在微信 app 内嵌的浏览器里,使用地图搜索功能。我当时在网上找了很多例子,都是基于前端框架比如 jQuery,Bootstrap,Vue 来开发的。我觉得对于实现我那个简单的地图搜索需求来说,这些前端框架太重了,因此自己花了一点时间,把网上找到的一个例子的地图搜索功能,从其前端实现框架中剥离出来,之后这个例子无需任何前端框架即可运行。

这个地图搜索的功能使用起来很简单,在微信公众号里通过菜单打开我剥离之后,纯 HTML/JavaScript 实现的百度地图的搜索界面后,在 input 字段里输入地址,然后点 Search 按钮,即可自动定位到目的地址。

地图的放大和缩小,地图类型的切换都是百度地图库本身提供的,开发人员无需任何额外的编程工作。

完整代码在我的Github上。
下面是部分代码说明。
我们利用微信公众号的菜单项,启动一个 SAP UI5 应用,并运行在微信的内嵌浏览器里。
如下图“Jerry List”菜单项所示:

我们提前把 SAP UI5 应用部署在云平台上,得到该应用的 url,然后直接将 url 绑定到 Jerry List
这个公众号菜单即可。最后,点击公众号菜单后,这个 SAP UI5 应用在微信浏览器里打开的效果如下:


下面是实现细节。
使用微信开发文档里提到的公众号菜单创建 API,创建一个新的名为 Jerry List 的菜单,url 字段指定成部署到云平台上的 SAP UI5 应用的 url:

url: https://api.weixin.qq.com/cgi-bin/menu/create?access_token=4_otQpSMfcwvmcL-T-DovhnozCAYCpy6wiKU3t4LUeZcQOF_i85a9NbpKpx7seLyEeHlrxl1rtlztL0miJthojqlqHqJArx7sm5OUdnsAupPpUwGr2EWljdJrLlrAVDNcADACKU
Access Token 使用如下的 API 调用,通过 app id 和 app secret 换取:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=<your app id>&secret=<your secret>
将 SAP UI5 应用部署到云平台上,得到 url:
http://wechatjerry.herokuapp.com/ui5/
确保该 url 直接在浏览器里访问能够正常工作:

上面这个 UI5 应用的完整源代码,可以在我的Github上找到。

这个 nodejs 应用,调用第 6 行的 app.use 方法,将 webapp 文件夹下的 SAP UI5 应用,通过/ui5 暴露给用户。

下面我们先在本地开发一个能提供地图搜索的网页应用,测试通过后将其部署到云平台,将部署到云平台后生成的 url 绑定到微信公众号菜单即可。
我的这个地图搜索网页应用只需要实现唯一的一个 index.html,源代码刚好 100 行:

完整代码:
网页加载时,onload hook 触发函数 findDefaultLocation, 将默认地址,成都,定位并显示在地图上。

新建一个文件夹 map,将 index.html 放至其内,用 url /map 映射到 map 文件夹:

这样我们在浏览器地址栏里添加/map 的片段,就能通过 nodejs express 库,访问到 map 文件夹下的 index.html 网页了。该 nodejs 应用部署到云平台后的访问效果如下:
浏览器输入 https://wechatjerry.herokuapp.com/map/
默认自动定位到成都:

最后调用微信公众号菜单创建 API,将下列 JSON 负载传入 API,即可将云平台上的地图搜索网页应用同新建的微信公众号菜单绑定在一起。

总结
本文首先介绍了如何调用微信公众号菜单 API,给公众号添加新的菜单项。接着介绍了如何将一个 Web 应用部署在云平台上,并且将生成的链接绑定到新添加的微信菜单项上。最后,我们使用百度地图 API 开发一个 Web 应用,绑定到微信公众号菜单项上,即实现了本文标题提到的功能。
版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/4ddf17d9d961d56d602bfee7d】。文章转载请联系作者。
评论