http://www.1990c.com/?p=932
近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的~
 

 
今天来分享一下开发经验~
微信公众平台提供的接口很简单,先看看消息交互流程:
 

 
说的通俗一些,用户使用微信发送消息 -> 微信将数据发送给开发者 -> 开发者处理消息并返回数据至微信 -> 微信把返回数据发送给用户,期间数据交互通过XML完成,就这么简单。
 
下面写个实例,开发微信智能聊天机器人:
 
1. 注册微信公众平台账号
注: 目前一张身份证只能注册两个账号,账号名称关乎加V认证,请慎重注册。
 
2. 申请服务器/虚拟主机
没有服务器/虚拟主机的童鞋可以使用BAE和SAE,不多介绍。
 
3. 开启开发者模式
微信公众平台有两个模式,一个是编辑模式(傻瓜模式),简单但功能单一。另一个是开发者模式,可以通过开发实现复杂功能。两个模式互斥,显而易见,登录微信公众平台并通过“高级功能”菜单开启开发者模式。
 
4. 填写接口配置信息
同样是在“高级功能”菜单中配置,需要配置两项参数:
URL: 开发者应用访问地址,目前仅支持80端口,以“http://www.1990c.com/weixin/index.php”为例。
TOKEN: 随意填写,用于生成签名,以“1990c”为例。
填写完把下面代码保存为index.php并上传至http://www.1990c.com/weixin/目录,最后点击“提交”完成验证。
| 02 | define("TOKEN", "1990c"); //TOKEN值 | 
 
| 03 | $wechatObj= newwechat(); | 
 
| 06 |     publicfunctionvalid() { | 
 
| 07 |         $echoStr= $_GET["echostr"]; | 
 
| 08 |         if($this->checkSignature()){ | 
 
| 14 |     privatefunctioncheckSignature() { | 
 
| 15 |         $signature= $_GET["signature"]; | 
 
| 16 |         $timestamp= $_GET["timestamp"]; | 
 
| 17 |         $nonce= $_GET["nonce"]; | 
 
| 19 |         $tmpArr= array($token, $timestamp, $nonce); | 
 
| 21 |         $tmpStr= implode( $tmpArr); | 
 
| 22 |         $tmpStr= sha1( $tmpStr); | 
 
| 23 |         if( $tmpStr== $signature) { | 
 
 
 
这玩意儿就是微信公众平台校验URL是否正确接入,研究代码没有实质性意义,验证完即可删除文件,就不详细说明了,有兴趣的童鞋可以查看官方文档。
5. 开发微信公众平台功能
OK,上面提到了,微信公众平台与开发者之间的数据交互是通过XML完成的,既然用到XML,当然得遵循规范,所以在着手开发之前先看看官方接口文档提供的XML规范,以文本消息为例:
 
当用户向微信公众账号发送消息时,微信服务器会POST给开发者一些数据:
| 03 | <ToUserName><![CDATA[toUser]]></ToUserName> | 
 
| 05 | <FromUserName><![CDATA[fromUser]]></FromUserName> | 
 
| 07 | <CreateTime>12345678</CreateTime> | 
 
| 08 | <!--消息类别 (text文本消息)--> | 
 
| 09 | <MsgType><![CDATA1]></MsgType> | 
 
| 11 | <Content><![CDATA[content]]></Content> | 
 
| 13 | <MsgId>1234567890123456</MsgId> | 
 
 
 
开发者在处理完消息后需要返回数据给微信服务器:
| 03 | <ToUserName><![CDATA[toUser]]></ToUserName> | 
 
| 05 | <FromUserName><![CDATA[fromUser]]></FromUserName> | 
 
| 07 | <CreateTime>12345678</CreateTime> | 
 
| 08 | <!--消息类别 (text文本消息)--> | 
 
| 09 | <MsgType><![CDATA1]></MsgType> | 
 
| 11 | <Content><![CDATA[content]]></Content> | 
 
| 12 | <!--星标操作(位0x0001被标志时 星标刚收到的消息)--> | 
 
| 13 | <FuncFlag>0</FuncFlag> | 
 
 
 
除文本消息外,微信公众平台还支持用户发送图片消息、地理位置消息、链接消息、事件推送,而开发者还可以向微信公众平台回复音乐消息和图文消息,各类消息XML规范也可以参见官方文档。
 
来看看官方提供的一个PHP示例,我做了一些精简:
| 02 | $wechatObj= newwechat(); | 
 
| 03 | $wechatObj->responseMsg(); | 
 
| 05 |     publicfunctionresponseMsg() { | 
 
| 07 |         //---------- 接 收 数 据 ---------- // | 
 
| 09 |         $postStr= $GLOBALS["HTTP_RAW_POST_DATA"]; //获取POST数据 | 
 
| 11 |         //用SimpleXML解析POST过来的XML数据 | 
 
| 12 |         $postObj= simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA); | 
 
| 14 |         $fromUsername= $postObj->FromUserName; //获取发送方帐号(OpenID) | 
 
| 15 |         $toUsername= $postObj->ToUserName; //获取接收方账号 | 
 
| 16 |         $keyword= trim($postObj->Content); //获取消息内容 | 
 
| 17 |         $time= time(); //获取当前时间戳 | 
 
| 20 |         //---------- 返 回 数 据 ---------- // | 
 
| 24 |         <ToUserName><![CDATA[%s]]></ToUserName> | 
 
| 25 |         <FromUserName><![CDATA[%s]]></FromUserName> | 
 
| 26 |         <CreateTime>%s</CreateTime> | 
 
| 27 |         <MsgType><![CDATA[%s]]></MsgType> | 
 
| 28 |         <Content><![CDATA[%s]]></Content> | 
 
| 29 |         <FuncFlag>0</FuncFlag> | 
 
| 32 |         $msgType= "text"; //消息类型 | 
 
| 33 |         $contentStr= 'http://www.1990c.com'; //返回消息内容 | 
 
| 36 |         $resultStr= sprintf($textTpl,$fromUsername,$toUsername, | 
 
| 37 |         $time,$msgType,$contentStr); | 
 
| 38 |         echo$resultStr; //输出结果 | 
 
 
 
把代码保存为index.php并上传至http://www.1990c.com/weixin/目录,如果刚才没删除该文件,则直接覆盖。
 
现在用户通过微信公众平台发送任何消息公众账号均会返回一条内容为“http://www.1990c.com”的消息。
接下来需要做的就是根据用户消息动态返回结果~
 
SimSimi(小黄鸡)是目前比较火的聊天机器人,我用CURL开发了一个免费的SimSimi(小黄鸡)接口,传入关键词会返回文本回复,这部分不是本文重点,就不多说明,直接上代码:
| 02 | functionSimSimi($keyword) { | 
 
| 04 |     //----------- 获取COOKIE ----------// | 
 
| 05 |     $url= "http://www.simsimi.com/"; | 
 
| 06 |     $ch= curl_init($url); | 
 
| 07 |     curl_setopt($ch, CURLOPT_HEADER,1); | 
 
| 08 |     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); | 
 
| 09 |     $content= curl_exec($ch); | 
 
| 10 |     list($header, $body) = explode("\r\n\r\n", $content); | 
 
| 11 |     preg_match("/set\-cookie:([^\r\n]*);/iU", $header, $matches); | 
 
| 12 |     $cookie= $matches[1]; | 
 
| 15 |     //----------- 抓 取 回 复 ----------// | 
 
| 16 |     $url= "http://www.simsimi.com/func/req?lc=ch&msg=$keyword"; | 
 
| 17 |     $ch= curl_init($url); | 
 
| 18 |     curl_setopt($ch, CURLOPT_REFERER, "http://www.simsimi.com/talk.htm?lc=ch"); | 
 
| 19 |     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); | 
 
| 20 |     curl_setopt($ch, CURLOPT_COOKIE, $cookie); | 
 
| 21 |     $content= json_decode(curl_exec($ch),1); | 
 
| 24 |     if($content['result']=='100') { | 
 
| 26 |         return$content['response']; | 
 
| 28 |         return'我还不会回答这个问题...'; | 
 
 
 
把上面两段代码整合在一起就大功告成了,需要说明一点,微信服务器在5秒内收不到响应会断掉连接,通过此接口有可能会超时,且SimSimi已经屏蔽了BAE和SAE上的抓取请求,推荐使用SimSimi官方收费API,速度比较快~
 
最后附上微信公众平台智能聊天机器人源码:
												
												
								- 微信公众平台Java版极速SDK
		JEEWX-API 是第一个微信公众平台Java版极速SDK,基于 jeewx-api 开发可以立即拥有简单易用的API,让开发更加轻松自如,节省更多时间 http://www.jeewx.com/ 
- 微信公众平台自定义菜单PHP开发
		微信公众平台自定义菜单PHP开发,微信公众平台自定义菜单是如何实现的呢?其实很简单,首先在微信公众平台升级为服务号,获取appid和appsecret,然后根据这2个参数获取access_token, ... 
- 微信公众平台iPhone版内测开始了
		5月9日晚些时候自媒体人收到了微信公众平台iPhone版的内测邀请,微信公众平台iPhone版可在手机上写图文,快速查看并回复粉丝消息.留言和赞赏,新建群发.查看群发历史和今日数据,这些功能很实用了, ... 
- 运用Java对微信公众平台二次开发技术——开发者模式接入
		当初我在这碰到了很多问题,市面上以及网络上的资料特别少,所以当初碰了很多壁,所以现在跟大家分享一下,如何用Java,对微信公众平台进行二次开发. 一.开发预备知识: 最基本的JavaSE与JavaWe ... 
- 【玩转微信公众平台之六】 搭建新浪SAEserver
		赶紧接上一篇继续讲. ------本篇将介绍怎样搭建 新浪SAEserver.猛戳 http://sae.sina.com.cn/1.先自己注冊一个账号,假设有新浪的账号,微博之类的都能够直接拿来用, ... 
- 【玩转微信公众平台六】 构建新浪SAEserver
		连接急于继续发言. ------本文主要介绍介绍如何设置 新浪SAEserver.猛戳 http://sae.sina.com.cn/1.先自己注冊一个账号,假设有新浪的账号,微博之类的都能够直接拿来 ... 
- 微信公众平台测试帐号的注册与使用(自己的服务器<---->微信后台<---->测式公众号)
		打开注册的网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 用手机微信扫描网页左边的二维码,然后在手机上确认即可: 至此 ... 
- CentOS7+Python3.6利用web.py库进行微信公众平台服务器简易配置,token验证
		1.安装配置Python CentOS7 自带 Python2.7, 我用的是Python3.6.5,需要CentOS7安装配置Python3并和Python2共存的,请看以下教程: CentOS7安 ... 
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
		第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ... 
随机推荐
	
									- 3des加解密算法
			编号:1003时间:2016年4月1日09:51:11功能:openssl_3des加解密算法http://blog.csdn.net/alonesword/article/details/17385 ... 
- 一秒钟Win7笔记本变无线路由器
			开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器购买费.亲测通过,比conncetify方便,稳定,网速好!  ... 
- pyvcf 模块
			最近一直在处理samtools freebayes gatk 产生的snp数据, 结果文件都是vcf,于是自己就写了相应的类,但是总是不够完善. 海宝推荐这个模块,他都推荐了 我还抱着我那烂代码不放干 ... 
- 浅谈jQuery中setInterval()方法
			定义和用法: setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口 ... 
- Date 对象总结
			Date对象,是操作日期和时间的对象.Date对象对日期和时间的操作只能通过方法. 无参数: var date=new Date(); console.log(date)     // Mon Jun ... 
- Codeforces Round #123 (Div. 2)
			A. Let's Watch Football 记时间为\(t\), 则\(bt+(b-a)c>=0\),可得\[t \ge \frac{c(a-b)}{b}\] B. After Traini ... 
- POJ-2528  Mayor's posters (线段树区间更新+离散化)
			题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ... 
- HDU-4405 Aeroplane chess(概率DP求期望)
			题目大意:一个跳棋游戏,每置一次骰子前进相应的步数.但是有的点可以不用置骰子直接前进,求置骰子次数的平均值. 题目分析:状态很容易定义:dp(i)表示在第 i 个点出发需要置骰子的次数平均值.则状态转 ... 
- json对象和字符串互相转换
			
			
- jQuery序列化后的表单值转换成Json
			$.fn.serializeObject = function() { var o = {}; var a = this.serializeArray(); $.each(a, function()  ...