- 概述
微信公众号开发,其实就是微信使用者、微信公众号平台和自身服务器的http消息交互;在这一系列过程中,微信公众号平台充当了中介和转发作用(如图1所示)。需要注意的是,微信公众号平台向自身服务器转发消息,目前只支持http的80端口和https的443端口,所以,自身服务器必须打开80端口或443端口。
图1 微信公众号开发消息交互
微信公众号开发有官方文档,官方文档地址:https://mp.weixin.qq.com/wiki。学习官网可知,微信公众号开发,更多的是和微信公众号平台的一些http消息,消息格式以XML和JSON为主,主要采用get和post两种消息形式。
微信公众号官方文档理论上是最权威的说明,但部分开发并没有进行详细说明,尤其让初次进行微信公众号开发的人感到无从下手。本文档旨在提供一个基础的说明,方便人进行微信公众号开发入门。
- 微信公众号后台配置
对于微信公众号的开发人员来说,首先需要做的事情是:对自身微信公众号后台进行配置。
登录微信公众号平台(https://mp.weixin.qq.com/)以后,在“开发”——“基本配置”里对微信公众号进行设置。
“公众号开发信息”里,是公众号的开发信息,包括开发者ID、开发者密码和IP白名单。其中IP白名单是可以登录自身公众号平台的的IP,建议加上自身的服务器IP。(如图2所示)
图2 公众号开发信息
“服务器配置”里,是对自身服务器信息的配置。其中,“服务器地址(URL)”是对服务器地址的配置,“令牌(Token)”是校验方式,“消息加密密钥”和“消息加解密方式”是进行加解密的密钥和方法。(如图3所示)
图3 服务器配置
需要注意的是,第一次配置的时候,服务器地址和Token必须存在且正确,才能进行配置,否则会不会生效。同时,由于服务器只支持http的80和https的443端口,注意服务器的端口配置。(笔者曾用Nginx和简单的php进行了配置,可以参考博客https://blog.csdn.net/wangzhezhilu001/article/details/96876020)
公众号配置完成后,启用即可使微信公众号生效。
- 自身服务器搭建
自身服务器搭建,是和微信公众号设置紧密相关的。
理论上,自身服务器搭建,最关键的是有固定的IP;如果是企业号,最后肯定还要进行域名申请。
固定IP获得由几个方法:
- 企业获得电信的固定IP(目前电信运营商只给企业固定IP);
- 各种云平台的固定IP(阿里云、腾讯云或新浪云);
- 花生壳等固定IP转换工具。
笔者采用了腾讯云。
在获得固定IP以后,对80端口进行了绑定,并对固定URL进行响应,并配置了相应Token。笔者给出自己的Flask代码样例进行说明。(如图4所示,注意的是Token和URL)
图4 URL和Token设置
- 微信收发图文消息
微信收发图文消息,需要注意的是,收发消息,消息格式都是XML。
微信的文字消息的XML格式为:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
其中,ToUserName为开发者微信号,FromUserName为发送方帐号(一个OpenID),CreateTime为消息创建时间(整型),MsgType为消息类型,文本为text,Content文本消息内容,MsgId 消息id,64位整型。
图片消息的XML格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[this is a url]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
<MsgId>1234567890123456</MsgId>
</xml>
其中,ToUserName为开发者微信号,FromUserName为发送方帐号(一个OpenID),CreateTime为消息创建时间 (整型),MsgType为消息类型,图片为image,PicUrl为图片链接(由系统生成),MediaId为图片消息媒体id,可以调用获取临时素材接口拉取数据,MsgId为消息id,64位整型。
还有语音消息,这里不再赘述。如有兴趣,可以参考微信公众平台技术文档(https://mp.weixin.qq.com/wiki)的“消息管理”,“接收普通消息”。
值得注意的是:发送方或者微信本人的确定标志位OpenID。
还有,开发微信公众号的人要谨记:发送和接受消息,必须用XML形式,必须符合相关格式,否则收发消息可能会失败。
- 微信生成二维码
微信生成二维码,可以用微信的自带功能QCode。该方法,可以把OpenID放到二维码里,使URL本身带有OpenID。
微信返回二维码,是图片格式。最关键的图片信息,是MediaId。MediaID可以用WebClient获得。WebClient获得MediaID需要让 IP白名单中包含服务器IP的白名单。(参考选项2的说明)
- 微信发送模板消息
微信平台向个人发送消息,必须采用模板消息。模板消息参考的官方文档为“消息管理”——“模板消息接口”(https://mp.weixin.qq.com/wiki)。
发送模板消息,首先需要订阅,必须是已经认证的公众号,才可以进行消息订阅。认证方式为“公众号平台”(https://mp.weixin.qq.com)——“设置”——“微信认证”。
认证之后,可以设置模板消息。(如图5所示)
图5 模板消息设置
关于添加模板消息的的具体步骤,可以参考https://jingyan.baidu.com/album/b87fe19e4295a352183568b3.html?picindex=2上的说明。
发送模板消息需要知道Acceess_Token,Aceess_Token是两小时变化一次的。获得Access_Token的接口为:用get方式 调用https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 接口。其中,grant_type设置为client_credential,appid和secret分别为公众号平台的APPID和APPSeceret。
发送模板消息的方法为用post方法发送数据到https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN,post数据格式如下:
{
"touser":"OPENID",
"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
"url":"http://weixin.qq.com/download",
"miniprogram":{
"appid":"xiaochengxuappid12345",
"pagepath":"index?foo=bar"
},
"data":{
"first": {
"value":"
恭喜你购买成功!
",
"color":"#173177"
},
"keyword1":{
"value":"
巧克力
",
"color":"#173177"
},
"keyword2": {
"value":"39.8
元
",
"color":"#173177"
},
"keyword3": {
"value":"2014
年
9
月
22
日
",
"color":"#173177"
},
"remark":{
"value":"
欢迎再次购买!
",
"color":"#173177"
}
}
}
其中,touse为接收者openid,template_id为模板ID,url为模板跳转链接(海外帐号没有跳转能力),miniprogram为跳小程序所需数据,不需跳小程序可不用传该数据,appid为所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏),pagepath为所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏,data为模板数据,color模为板内容字体颜色,不填默认为黑色。
- Python开发微信公众号平台的SDK和样例代码
Python开发微信公众号平台可以参考的SDK为wechatpy。
可以参考的样例代码(本人所写)地址为:https://gitee.com/xwtspace/wxCode (或 https://github.com/diziqian/wxCode.git)
注意,解析消息用wechatpy的parse_message,回复消息如果是文本用TextReply,图片为ImageReply。