微信公众平台PHP开发

微信公众平台PHP开发

微信公众平台PHP开发

2013.05.19 10:28CATEGORY:PHPVIEWS:2346COMMENTS:29

微信公众平台PHP开发

近期在做微信公众平台开发,一口气写了二十几个功能,挺有意思的~
 
闽南师大小秘书
 
今天来分享一下开发经验~
微信公众平台提供的接口非常easy,先看看消息交互流程:
 
微信公众平台消息交互流程
 
说的通俗一些,用户使用微信发送消息 -> 微信将数据发送给开发人员 -> 开发人员处理消息并返回数据至微信 -> 微信把返回数据发送给用户,期间数据交互通过XML完毕,就这么简单。
 
以下写个实例,开发微信智能聊天机器人:
 
1. 注冊微信公众平台账号

微信公众平台:
https://mp.weixin.qq.com/

注: 眼下一张身份证仅仅能注冊两个账号,账号名称关乎加V认证,请谨慎注冊。

 
2. 申请server/虚拟主机
没有server/虚拟主机的童鞋能够使用BAE和SAE。不多介绍。

 
3. 开启开发人员模式
微信公众平台有两个模式,一个是编辑模式(傻瓜模式)。简单但功能单一。还有一个是开发人员模式。能够通过开发实现复杂功能。两个模式相互排斥,显而易见,登录微信公众平台并通过“高级功能”菜单开启开发人员模式。
 
4. 填写接口配置信息
相同是在“高级功能”菜单中配置。须要配置两项參数:
URL: 开发人员应用訪问地址,眼下仅支持80port。以“http://www.1990c.com/weixin/index.php”为例。
TOKEN: 任意填写。用于生成签名。以“1990c”为例。
填写完把以下代码保存为index.php并上传至http://www.1990c.com/weixin/文件夹,最后点击“提交”完毕验证。

01 <?php
02 define("TOKEN","1990c"); //TOKEN值
03 $wechatObj new wechat();
04 $wechatObj->valid();
05 class wechat {
06     publicfunction valid() {
07         $echoStr$_GET["echostr"];
08         if($this->checkSignature()){
09             echo$echoStr;
10             exit;
11         }
12     }
13  
14     privatefunction checkSignature() {
15         $signature$_GET["signature"];
16         $timestamp$_GET["timestamp"];
17         $nonce$_GET["nonce"];
18         $token= TOKEN;
19         $tmpArrarray($token,$timestamp$nonce);
20         sort($tmpArr);
21         $tmpStr= implode( $tmpArr );
22         $tmpStr= sha1( $tmpStr );
23         if($tmpStr == $signature) {
24             returntrue;
25         else {
26             returnfalse;
27         }
28     }
29 }
30 ?>

这玩意儿就是微信公众平台校验URL是否正确接入。研究代码没有实质性意义。验证完就可以删除文件,就不具体说明了,有兴趣的童鞋能够查看官方文档。

微信公众平台API文档:
http://mp.weixin.qq.com/wiki/index.php

5. 开发微信公众平台功能

OK。上面提到了,微信公众平台与开发人员之间的数据交互是通过XML完毕的,既然用到XML,当然得遵循规范。所以在着手开发之前先看看官方接口文档提供的XML规范,以文本消息为例:

 

当用户向微信公众账号发送消息时,微信server会POST给开发人员一些数据:

01 <xml>
02 <!--开发人员微信号-->
03 <ToUserName><![CDATA[toUser]]></ToUserName>
04 <!--发送方帐号(OpenID)-->
05 <FromUserName><![CDATA[fromUser]]></FromUserName>
06 <!--消息创建时间 (整型)-->
07 <CreateTime>12345678</CreateTime>
08 <!--消息类别 (text文本消息)-->
09 <MsgType><![CDATA1]></MsgType>
10 <!--消息内容-->
11 <Content><![CDATA[content]]></Content>
12 <!--消息ID (64位整型)-->
13 <MsgId>1234567890123456</MsgId>
14 </xml>

 
开发人员在处理完消息后须要返回数据给微信server:

01 <xml>
02 <!--接收方帐号(OpenID)-->
03 <ToUserName><![CDATA[toUser]]></ToUserName>
04 <!--开发人员微信号-->
05 <FromUserName><![CDATA[fromUser]]></FromUserName>
06 <!--消息创建时间 (整型)-->
07 <CreateTime>12345678</CreateTime>
08 <!--消息类别 (text文本消息)-->
09 <MsgType><![CDATA1]></MsgType>
10 <!--回复消息内容-->
11 <Content><![CDATA[content]]></Content>
12 <!--星标操作(位0x0001被标志时 星标刚收到的消息)-->
13 <FuncFlag>0</FuncFlag>
14 </xml>

除文本消息外,微信公众平台还支持用户发送图片消息、地理位置消息、链接消息、事件推送,而开发人员还能够向微信公众平台回复音乐消息和图文消息,各类消息XML规范也能够參见官方文档。
 
来看看官方提供的一个PHP演示样例,我做了一些精简:

01 <?php
02 $wechatObj new wechat();
03 $wechatObj->responseMsg();
04 class wechat {
05     publicfunction responseMsg() {
06  
07         //---------- 接 收 数 据 ---------- //
08  
09         $postStr$GLOBALS["HTTP_RAW_POST_DATA"];//获取POST数据
10  
11         //用SimpleXML解析POST过来的XML数据
12         $postObj= simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
13  
14         $fromUsername$postObj->FromUserName;//获取发送方帐号(OpenID)
15         $toUsername$postObj->ToUserName;//获取接收方账号
16         $keyword= trim($postObj->Content);//获取消息内容
17         $time= time(); //获取当前时间戳
18  
19  
20         //---------- 返 回 数 据 ---------- //
21  
22         //返回消息模板
23         $textTpl= "<xml>
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>
30         </xml>";
31  
32         $msgType"text";//消息类型
33         $contentStr'http://www.1990c.com'; //返回消息内容
34  
35         //格式化消息模板
36         $resultStr= sprintf($textTpl,$fromUsername,$toUsername,
37         $time,$msgType,$contentStr);
38         echo$resultStr//输出结果
39     }
40 }
41 ?>

把代码保存为index.php并上传至http://www.1990c.com/weixin/文件夹。假设刚才没删除该文件,则直接覆盖。
 
如今用户通过微信公众平台发送不论什么消息公众账号均会返回一条内容为“http://www.1990c.com”的消息。

如今用户通过微信公众平台发送不论什么消息公众账号均会返回一条内容为“http://www.1990c.com”的消息。

接下来须要做的就是依据用户消息动态返回结果~
 
SimSimi(小黄鸡)是眼下比較火的聊天机器人,我用CURL开发了一个免费的SimSimi(小黄鸡)接口,传入关键词会返回文本回复,这部分不是本文重点。就不多说明。直接上代码:

01 <?

php

02function SimSimi($keyword) {
03 
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];
13    curl_close($ch);
14 
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);
22    curl_close($ch);
23 
24    if($content['result']=='100') {
25        $content['response'];
26        return $content['response'];
27    else {
28        return '我还不会回答这个问题...';
29    }
30}
31?>

把上面两段代码整合在一起就大功告成了,须要说明一点,微信server在5秒内收不到响应会断掉连接。通过此接口有可能会超时,且SimSimi已经屏蔽了BAE和SAE上的抓取请求。推荐使用SimSimi官方收费API,速度比較快~
 
最后附上微信公众平台智能聊天机器人源代码:

微信公众平台智能聊天机器人源代码下载:
http://www.1990c.com/wp-content/uploads/2013/05/40.rar

转载地址:http://www.1990c.com/?

p=932

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109182.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 怎么安装汉化包(svn中文语言包安装)

    检查SVN与汉化包的版本是否一致1、查看tortoiseSVN的版本2、在SVN的安装目录下,将对应版本的汉化包拷过去注意,保证Languages目录下的文件都已删掉3、双击安装汉化包,安装完成时,在出现的最后一个页面中,选中ConfigureTortoiseSVNtousethislanguage即可直接应用。SVN1.12.1对应汉化包的…

  • MSF搭建socks代理[通俗易懂]

    MSF搭建socks代理[通俗易懂]目录搭建代理添加路由​搭建Socks4a代理搭建Socks5代理连接代理搭建代理当我们通过MSF拿到一个机器的权限后,想通过MSF搭建socks代理,然后通内网。MSF中有三个代理模块,分别是socks4a、socks5、socks_unc。我们一般用socks4a和socks5进行代理。socks5可以设置用户名和密码。这里运行代理后,有时候MSF不会监听端口…

  • pycharm滚动放大缩小字体_pycharm滚轮调整字体大小

    pycharm滚动放大缩小字体_pycharm滚轮调整字体大小pycharm中,设置滚轮直接调整字体大小步骤1、setting2、Editor→General3、勾选Change。。。。。。。4、Apply5、OK

  • jdbc元数据DataBaseMetaData查询数据库表信息详解

    jdbc元数据DataBaseMetaData查询数据库表信息详解java-jdbc获取表信息,表字段信息,并且匹配实体对象类型

  • LOAM 原理及代码实现介绍[通俗易懂]

    LOAM 原理及代码实现介绍[通俗易懂]LOAM介绍paper:《LidarOdometryandMappinginReal-time》LOAM整体框架:将定位与建图分开运行,高频位姿估计+低频优化建图->实现实时,低计算量,低漂移。数据提取及处理:根据点的曲率c来将点划分为不同的类别(边/面特征或不是特征),在每一个sweep中,根据曲率对点进行排序,来作为评价局部表面平滑性的标准。一个sweep指完成一次完整的扫描,一次sweep分为多个scan,每一次sweep的雷达位姿定义为为这一sweep起始时的状态

  • Redis的数据类型以及各类型的操作

    Redis的数据类型以及各类型的操作

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号