微信公众号开发的一些总结
微信公众号开发,主要可以分为2大块
公众号基本情况
就如同普通用户可以开通个人账号一样,任何想借助微信平台提供公众服务或信息发布的个人或组织,也可以开通公众账号。归根结底,公众账号也是一个微信账号,也可以接收信息,发送信息,也有关系链,但是在功能上和个人账号有较大区别
腾讯设计公众账号的基本原则,是不允许公众账号主动骚扰粉丝。这是公众号和个人号的一个很大的区别。我们平常使用的个人账号,可以随时给好友发信息,但是公众账号不能随意给粉丝群发消息,或者给指定的粉丝发送信息,需要满足一定的条件:群发信息每月有限制数量,而且每个粉丝最多能接收到的群发信息也有限制;只有粉丝主动发起交互(如点击菜单,关注,给公众号发信息)的情况下,公众号才能给粉丝回复消息
公众账号的分类和区别
开通公众账号的时候,要选择账号主体是个人,或组织。个人账号需要提交的审核资料比较少,只要身份证等,组织账号审核资料就多得多,比如营业执照,组织机构代码等。然后公众账号可以分为订阅号和服务号。个人只能申请成为订阅号,只有组织账号才能申请成为服务号
订阅号和服务号的定位不同,订阅号的目的主要是定时向粉丝推送资讯,像大部分自媒体,媒体网站的公众号,都属于订阅号。服务号是为粉丝提供服务,每个月能够主动推送的消息更少,但是可以提供更多服务,比如支付等
表现出来的区别主要是:
1、在通讯录中的层次不同。服务号和一般的好友是一样的,都在通讯录的一级菜单;订阅号被统一归到“订阅号”的一级菜单下,本身是二级菜单。所以从醒目程度来说,服务号比较好
2、能够调用的接口有区别,服务号可以调用高级接口,比如主动群发,获取粉丝列表,回复客服消息等等,而订阅号能调用的接口要少得多,只能接收粉丝消息,被动回复消息等。但是如果精心设计,订阅号也可以实现大部分的功能
微信认证
不管是订阅号还是服务号,都可以申请微信认证。认证需要每年300元。认证之后,订阅号就可以使用自定义菜单了,而服务号可以调用上述的高级接口
公众平台管理后台
使用公众账号并不一定需要编程,微信为公众账号提供了管理后台,登陆之后就可以管理粉丝,查看和回复消息,设置自动回复等等。网上教怎么玩公众号的文章很多,不是本文的重点。但是我建议就算目的是调用公众账号的接口,最好也要把公众号的管理后台好好玩几遍,找找感觉。因为调用接口能做的事情,也没有脱离公众账号的框架,很多限制和概念都是一样的
比如说,服务号在管理后台里每个月只能群发4条消息,虽然调用群发接口不受这个限制,但是每个粉丝每个月最多也只能收到4条消息。对于订阅号来说,由于能调用的接口比较少,有些事情还只能在管理后台才能做。比如说,想给粉丝回复一条纯图片消息,由于接口参数需要MediaId,而订阅号是无法拿到MediaId的,所以无法回复图片消息,但是在管理后台,就可以做到
公众平台开发者模式
但是借助接口,我们可以做到很多事情。比如将微信公众号,和企业内部的信息系统打通,这就不是用公众账号管理后台能做到的事了。基本的结构类似这样:
平时粉丝跟公众号交互的时候,是从微信客户端发消息到微信服务器,如果公众号没有开通开发者模式的话,微信服务器就直接返回响应给到微信客户端。但是如果打开了开发者模式,就增加了绿线右边的交互。在一些节点,微信服务器会调用微信交互服务器上的接口,交互服务器可以给回响应,这样就可以实现带逻辑的自动回复等功能。有了这个通道,交互服务器也可以跟内部系统互动起来,实现高级特性。比如粉丝可以通过公众号,来预约,查看会员信息等等
微信服务器调用接口的时机很多,具体看微信官方的文档。比如粉丝关注,取消关注,发来消息,发来语音,支付成功等等,因此开发者就有机会在这些环节接入业务流程
做不到的事
由于上文提到的公众号设计原则,有一件事是做不了的:无论是订阅号还是服务号,都不能任意主动向粉丝推送消息。下发消息主要有3种:
1、被动回复。向任一个订阅号发一条消息,收到的自动回复,基本都是这种
2、客服消息。如果粉丝主动给公众号发了消息,那么在48小时之内,公众号可以给这个粉丝回复消息,数量不限。但是订阅号只能在管理后台手工操作,而服务号可以调用高级接口
3、群发消息。订阅号每天可以群发1条消息,服务号每个月可以群发4条消息。同样,订阅号只能在后台操作,服务号可以调用群发接口
可见,除了限制很大的群发消息之外,被动回复和客服消息的前提都是粉丝主动发起交互,所以就算是通过认证的服务号,目前也不可能实现任意主动发送消息的功能。
例外是类似招商银行这样的微信战略合作伙伴,他们能调用的接口与普通的公众号是不同的
服务端开发
公众号服务端的开发,基于公众平台提供的那套接口,可以玩的花样比较少。总结一些小经验
利用菜单生成URL
看了很多公众号,一个普遍的做法是,点击下方的菜单之后,不是直接跳到页面上,而是返回一个图文消息,再点击图文消息,才会跳到新页面上
看起来有点多此一举,直接跳走不是更方便吗?这样做的目的是为了动态地生成URL。下面的菜单,一般都是固定的,粉丝点击了直接就跳走了,没有机会在服务器过一道。但是如果设置成EVENT,微信服务器就会往开发者服务器推一条消息,并且带有粉丝和公众号的open_id,利用这个就可以做文章,做一些逻辑,生成新的URL等等。尤其对很多平台提供商来说,比如微盟等,这是必须的。因为所有公众号,都是走到他们的服务器上,必须要区分出不同的公众号才行
向粉丝推消息的方法
在8月27日之前,公众号想给粉丝发消息,大体上只有3个方法。一是每个月固定数量的群发,二是被动回复,三是客服消息。这3种方法的缺陷都很明显
第一种方法不仅数量有限制(还相当苛刻),而且很难实现点对点的精准发送;第二和第三种方法,虽然能点对点发送,但是前提都是粉丝要先跟公众号交互(点击菜单,发消息都算),所以没法实现主动的推送
但是我注意到有一些公众号的体验就相当好,比如招商银行,拉勾网,在需要的时候,会主动给我发一条消息,完全不受上面三种方法的限制
其实他们调用的是“模板消息”接口,只不过这个接口内测了很长时间,所以一般的公众号没有机会使用。从8月27日起,微信已经开放了这个接口,所以这种体验,一般的公众号也可以做到了。当然,必须是认证服务号
图文消息带链接
原来我发现,我返回的图文消息,用户点开以后,都是跳到一个我指定的URL,而不是通过公众账号管理后台人工编辑出来的那种形式。后来观察了一下,发现这种图文消息的URL,都是类似这样的:
1 | http://mp.weixin.qq.com/s?__biz=MjAzNzMzNTkyMQ==&mid=201391418&idx=2&sn=34bbeb346775724ef15cec07de66b3a3#rd |
点开以后可以发现,里面有微信嵌入的html和js
所以,要通过接口拼出这样的图文消息,需要实际有这样一个媒体资源存在,似乎是要通过高级接口上传媒体资源,然后根据MediaId来拼。暂时没发现更简单的办法
web端开发
在微信内置浏览器里打开的网页,可以调用WeixinJSBridge上的方法,在普通的浏览器里打开的话,就不存在这个全局对象
令人发指的是,微信官方文档里,只公开了4个无关痛痒的API。所以很长一段时间,我都不知道WeixinJSBridge能做的事情,远远不止文档里提到的那么多
比如分享到朋友圈之后的回调,分享到朋友圈自定义URL,这2个功能,截止到本文(2014年9月10日)都是可用的。更早以前,还可以通过WeixinJSBridge实现一键分享,一键关注等,不过现在被微信封了
这个对象里的接口,未来或许是正式公开,或许是也被封掉,现在还不清楚。但是目前至少分享行为是可控的,所以强烈推荐大家试一下这个js lib,把WeixinJSBridge的私有API整理了一遍,调用也很方便: