关于『该公众号提供的服务出现故障,请稍后再试』

Context

按照惯例先说上下文环境,,
是这样,,公司需要做个功能:

对ERP用户和公司公众号用户做映射,然后向该用户推送相应角色的经营日报模板消息。

实现流程:
1.通过微信接口生成带参二维码;
2.用户用微信扫一扫功能扫描生成的带参二维码;
3.获取二维码中的客户识别码和用户的openid;
4.被动回复用户文本消息(附超链接),引导用户完成绑定过程。

Tips

总的来说是没啥难度的,,过程还算顺利。有两点值得一提,,

关于授权流程

最开始的时候,是想让用户扫码之后直接跳转到绑定页面,完美~
然鹅,事实并非这样,,正常我们用浏览器、相机等APP扫描二维码的时候,如果二维码内容是链接的话,有的会直接访问,有的会提示是否访问这个链接。然而,在微信中扫描二维码分为两种情况,,

  1. scancode_push:扫码推事件用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
  2. scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
scancode_push

倘若我们使用 scancode_push 的方式,,OK,如果二维码内容是URL的话,可以直接访问。但如此,,我们就不能使用微信生成带参二维码的接口生成二维码了,,因为,这种方式生成的二维码内容本质上是微信的链接:

1
2
3
4
5
6
{
"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm
3sUw==",
"expire_seconds":60,
"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"
}

ticket: 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。
expire_seconds: 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天)。
url: 二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片

访问 URL 的链接无论如何是不能指向我们的绑定页面的。PASS!
那如果用其他工具把指向绑定页面的链接做成二维码呢?如此就可以访问页面了,,但是!!我们就获取不到用户的OpenID了。。因为,亲测这种方式是用户先访问页面(页面已然渲染好了),然后下发通知(获取到openid),,这样,页面还是无法获取到openid。。

scancode_waitmsg

看样子只能使用 scancode_waitmsg,这种方式既可以获取客户识别码,又可以获取到用户openid,,然鹅,之后只能下发消息,不能直接跳转到指定页面。在一堆汉字文本中显示链接真的好吗?!
就在这时,,【花点时间】给我推送消息了(其实我更喜欢『花加』,笑哭)。同样是文本消息,但是有超链接!!

文本消息中的链接优雅的显示方式

对,,就是超链接,而不是赤果果的将网址堆在一堆汉字中。

实现起来很简单,,就是把链接放在 a 标签的 href 属性中,剩下的就是拼接字符串儿了。。

终于到正题儿了

终于,,然而,为什么每次收到文本消息前总是报错?
被动回复文本消息

本以为是ngrok不稳定的原因,,但报错问题出现的太规律了,应该不是它(事实上它太稳定了,感谢开源!)。
直到看到了微信开发出现“该公众号暂时无法提供服务,请稍后再试”的坑,虽然最终遇到的问题不一样,但还是收到启发了,,那就是『第三方平台授权』的问题。因为我司之前做模板小程序的时候真的有将『北京众阳软件』公众号授权给『众阳宜商信息技术有限公司』第三方平台,,做授权测试嘛。但我记得后来改为只授权公众号的『开放平台账号管理权限』,其他权限都取消了呀?!咦,,登陆公众号微信后台之后,在『功能』->『自动回复』>>『被关注回复』中看到有第三方平台授权管理。哦,原来还有其他第三方平台,,唤作『魔盒』什么的。其中就将公众号的『消息回复』权限。怪不得,,每次被动回复前,先向『魔盒』服务器下发消息,失败后再向公众号服务器地址下发消息。所以,,每次所谓的服务器出现故障,是魔盒的问题!

Binggo!!取消授权之后,一切都那么清净~