微信公众平台后台接入简明指南

现在微信越来越火了,公众平台也越来越火,作为一个公司或者网站,没有一个公众号,你都不好意思跟人打招呼,更别提递名片了。

但是,开通了公众平台,靠人工去响应用户消息,不但技术含量不够,而且,人少也忙不过来啊。

幸好微信公众平台有开发模式,只要接入了微信后台,用户消息会被发送到我们指定的服务器上,然后,由服务器向用户回复消息。这种方式,比提示用户“回复1看xxx,回复2看xxx”显得高端大气上档次。

开发模式需要准备网站并且接入微信后台,在微信目前文档不完善,接口不友好的情况下,本文将详细讲解如何快速接入微信公众平台。

准备工作

首先,你需要有一个微信公众号,比如“中华诗词”。在往下继续阅读前,请自觉掏出手机,打开微信扫一扫:


其次,你需要有一个独立域名的网站,用来和微信服务器交互。

接入公众平台

登录微信公众平台后台后,点“功能”-“高级功能”-“开发模式”,进入开发模式,如果公众平台显示“尚未成为开发者”,就点击“成为开发者”:

同意协议后,填写URL和Token:

URL是指微信服务器向哪个URL发送消息,假设我们自己的服务器域名是www.example.com,准备用/weixin来接收消息,就填写:

http://www.example.com/weixin

而Token是微信服务器和我们自己的服务器通信时验证身份用的,可以随便填写,但要注意保密。

然后点“提交”,一般来说会报错“URL超时”或者“没有正确返回echostr”,因为我们的后台还没有准备好,所以,第一步是接收微信后台发送的验证消息,微信后台会发送一个GET请求到上面的URL,并附带以下参数:

signature,timestamp,nonce,echostr

我们的服务器在接收到上述参数后,需要验证signature是否正确,验证方法是先对timestamp、nonce和token先排序,再拼接成一个字符串,计算出sha1,并和signature对比:

public static boolean check_signature(signature, timestamp, nonce) {
    String[] arr = new String[] { timestamp, nonce, token };
    Arrays.sort(arr);
    String s = arr[0] + arr[1] + arr[2];
    md = MessageDigest.getInstance("SHA-1");
    byte[] digest = md.digest(s.getBytes("utf-8"));
    return signature == bytes2HexString(digest);

注意token不是微信服务器发过来的,而是我们自己写死的一个常量,就是在微信后台填写的Token。

如果计算的sha1和微信传过来的signature相等,说明这个请求确实是微信后台发过来的,如果是别人伪造的请求,由于他不知道token,所以,无法计算出正确的signature。

要防止第三方通过监听发动replay攻击,还需要验证timestamp和nonce,这个以后再讨论。

如果signature计算无误,就把微信后台传过来的echostr原封不动地传回去,这样,就可以通过验证,成为开发者。

在确保开发模式打开的情况下,微信后台会把用户消息发到我们的服务器上,也就是URL:http://www.example.com/weixin


微信后台发送消息是一个POST请求,但和普通的POST请求不同的是,首先,URL会带上signature、timestamp、nonce这3个参数:

POST http://www.example.com/weixin?signature=xxx×tamp=123456&nonce=123

然后,HTTP请求的BODY是一个不规范的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>

我们自己的服务器只需要处理该XML,然后,向微信返回一个类似如下的XML:

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
</xml>

就可以完成消息的回复。微信后台要求必须在5秒内回复,最多重试3次,否则我们自己的回复消息就到达不了用户的手机了。如果我们自己的服务器无法在5秒内回复,就回复一个空字符串,告诉微信服务器,不用重试了,这个消息处理不了,不给用户回复了。

上面的交互逻辑看起来很简单,但实际上坑有很多。

首先,微信服务器发送的POST请求根本就不符合HTTP规范。原则上POST请求不应该在URL上附带参数,但微信后台偏偏要这么干,这就让很多编程语言的标准框架无法获取到POST参数,因为标准的POST参数是从HTTP BODY中解析的。

所以,从POST获取URL参数就需要用到更底层的代码。在Java中,用HttpServletRequest在POST模式下别想用getParameter()拿到URL参数,必须用getQueryString()然后自己想办法解析字符串:

// java:
String qs = request.getQueryString();
Map<String, String> map = parse(qs);
// TODO: check signature...

然后,我们再讨论如何读取微信后台发过来的XML,在Java中,需要从HttpServletRequest中获取Reader流:

Reader reader = request.getReader();

如果有乱码,写一个EncodingFilter把Request强制设置为UTF-8编码:

public class EncodingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {}

    public void destroy() {}
}

不需要读取为字符串,只要有了流就可以解析XML了,建议用SAX解析,最终我们应该得到微信的XML中传过来的几个值:

ToUserName: 'abc'
FromUserName: 'xyz'
CreateTime: '12345678'
MsgType: 'text'
Content: '用户发的消息'

根据MsgType我们可以判断消息是文本、语音、图片、位置还是视频,然后,构造一个XML回复给微信后台,如果一切顺利,微信后台就把我们的消息发给用户。

目前我们只讨论如何回复文本消息,只需构造如下的XML:

<xml>
    <ToUserName><![CDATA[xyz]]></ToUserName>
    <FromUserName><![CDATA[abc]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[你好]]></Content>
</xml>

在回复的XML中,把接收的ToUserName和FromUserName交换,这两个字符串都是用户ID(公众号本身也是一个用户ID),CreateTime是以秒为单位的UNIX时间戳,计算如下:

long CreateTime = System.currentTimeMillis() / 1000;

MsgType仍是text,Content就是我们自动回复的消息,注意不要超过600个字符。

回复的时候,需要注意,一是最好明确地设置Content-Type: text/xml,二是XML的编码必须是UTF-8,否则,回复的消息就会出现乱码。

如何创建回复XML?由于该XML结构相当简单,所以无需动用任何XML接口,直接拼接字符串最简单快速。

最后,把代码部署到服务器,记住把接收的参数和XML,以及自己生成的XML在log中打印出来,一边看log,一边用手机端的微信来调试。只要调通了一种接口,其他接口参考微信文档就很容易开发了:

http://mp.weixin.qq.com/wiki/

限制

目前,微信公众平台的API还有很多限制,比如没有每天自动群发消息的API,要回复图文等多媒体消息需要V认证等等。

思考

微信和微信公众平台虽然产品很先进,但后台API设计得确实不咋地。由于API是给开发人员使用的,所以,设计一个好的API要从开发人员的角度出发。与其使用笨重的XML,不如使用更符合Web潮流的JSON。而且,没有必要把验证单独用GET区分,完全可以全部使用POST方式,在JSON中把所有信息全部包括,以action和data来区分消息类型和数据,例如,验证服务器:

{
    "signature": "xxx",
    "timestamp": 123456,
    "nonce": "xxx",
    "action": "verify",
    "data": {
        "echostr": "echo"
    }
}


发送消息:

{
    "signature": "xxx",
    "timestamp": 123456,
    "nonce": "xxx",
    "action": "msg",
    "data": {
        "id": "123456",
        "type": "text",
        "from": "user-abc",
        "to": "user-xyz",
        "create_time": 1234567,
        "content": "blablabla..."
    }
}

回复消息:

{
    "action": "msg",
    "data": {
        "type": "text",
        "from": "user-xyz",
        "to": "user-abc",
        "create_time": 1234567,
        "content": "reply to..."
    }
}

这样设计的API,各种编程语言都能处理,而且处理逻辑更简单,速度更快。









  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、系统描述 1、大数据 云存储 DTcms 5.0架构进一步优化,性能更好,运行更快。支持上传文件布置至FTP空间、云存储,大网站支持Redis 2、矢量图标 精心雕琢 全新的矢量图标,兼容IE8+及主流浏览器,海量的图标库,解决图标设计难题。 3、一次更新 多次挑战 敢于颠覆自已,每一次的更新,我们都严谨苛刻,全力以赴。 4、兼容IE8+浏览器 响应式后台界面 更加苛刻的管理界面,更好地兼容IE8+及手机浏览器无需IE10以上亦可体验响应式带来的快感 5.0界面不仅对CSS和图标进行调整,对控件、树形目录等也做了对应的增改。 5、无惧挑战 无论电脑或移动设备 无论身处何处 拿起你的设备 随时随地办公 6、简约 多样化界面依然采用简约的风格样式,没有过多的喧哗 在不同的分辨率下,页面能根据尺寸呈现不同的界面效果 7、 支持大中小型网站项目,能够承载大数据。4.0只有一张数据库主表,用视图关联数据,而5.0每增加一个频道即自动创建一张表; 8、 网站上传的图片、附件、视频等资源支持本地存储、阿里云对象存储、腾讯云对象存储,有利于减少带宽和分散服务器的压力,提交用户体验; 9、 进一步区分各个站点的数据,包括订单、会员等信息,重点打造移动平台微信方面的开发; 二、功能介绍 1、站点(新闻资讯(内容管理、栏目类别、评论管理)、购物商城(内容管理、栏目类别、评论管理)、视频专区(内容管理、栏目类别、评论管理)、图片分享(内容管理、栏目类别、评论管理)、资源下载(内容管理、栏目类别、评论管理)、公司介绍(内容管理、栏目类别)其他栏目可以自定添加) 2、应用(插件管理(链接管理、留言管理)、微信管理(基本设置(公众平台管理、自定义菜单)、消息管理(关注回复、默认回复、文本回复、图文回复、语音回复、消息记录))) 3、会员(会员管理(审核会员、所有会员、会员组别)、会员日志(发送短信、站内消息、充值记录、消费记录、积分记录)、会员设置(参数设置、OAuth设置、短信模板、邮件模板)) 4、订单(订单管理(待确认订单、全部订单)、订单设置(订单参数设置、支付方式设置、配送方式设置)) 5、控制面板(系统管理(系统设置、插件设置、URL配置)、站点设置(站点管理、频道管理、扩展字段、Tags标签)、界面管理(站点模板管理、生成静态管理、后台导航管理)、系统用户(管理员管理、角色管理、管理日志)) 三、注意事项 3.1运行环境 开发工具:Microsoft Visual Studio 2013+ 数据库:Sql Server 2008+ Web服务器:推荐IIS7.0+,应用池为集成模式 环境要求:.NET Framework 4.x及以上 3.2安装布置流程 需要以下步骤生成网站发布文件方可上传到你的网站空间中 1、用Microsoft Visual Studio 2013+打开源码中的DTcms.sln; 2、找到DTcms.Web项目,右击在弹出的菜单中选择“发布”; 3、在弹出的对话框中,“发布方法”选择文件系统,“目标位置”选择您要存放本地的目录; 4、单击“发布”按扭,生成编译文件,由于部分文件和目录并未包含在项目中,此时需要手动拷贝过来; 5、将“DTcms.Web”项目下的aspx、html、plugins、upload三个文件夹拷贝到您本地发布目录,由于友情链接和留言插件已安装,所以还需将“DTcms.Web/bin”目录下的DTcms.Web.Plugin.Link.dll和DTcms.Web.Plugin.Feedback.dll拷贝过来,否则无法查看留言和友情链接页面。 6、通过FTP工具将网站上传到你的空间下即可; 7、后台登录地址:http://你的网址/admin/login.aspx,默认管理员帐号:admin,密码:admin888 8、更多插件源码下载请登录官方技术论坛:http://bbs.dtsoft.net 经过以上步骤,网站安装流程完毕,下一步附件数据库及更改数据库连接节点 1、源码项目中,有一个名为“DataBase”的文件夹,里面存在的是SQL数据库文件,其中“DTcmsdb4.mdf”是MSSQL2005数据库文件,。 2、具体的安装配置数据库请查看:http://www.dtcms.net/help.html 3、找到网站目录下的“Web.config”文件,找到“connectionStrings”节点,将其更改为:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值