微信公众平台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)


相关推荐

  • GoogleMaps_键盘网站

    GoogleMaps_键盘网站在Google地球中使用键盘/鼠标导航首先要明白导航过程中的三个中心,视野中心,相机视角,鼠标锁定位置。还要明白3D视图和俯视图、地平面视图的区别,因为在海拔为0时将进入地平面视图,上下的操作将变为拉近和推远。中间的位置为视野中心,可以通过Ctrl+Shif+左箭头/右箭头来触发显示,如果要展示的对象不在视野中心,可以通过Alt+左箭头/右箭头进行对象位置微调。-/+的中心为视野中心。相机视角可以通过Ctrl触发,为可以通过左箭头/右箭头控制水平方向旋转,上箭头/下箭头控制上下方向旋

  • 复杂指针声明解析

    复杂指针声明解析

  • jadx初识_你我初识

    jadx初识_你我初识一.jadx介绍一款相对流行的反编译工具下载:https://github.com/skylot/jadx/releases/tag/v1.0.0解压后得到这么几个文件:启动:(以下来两个文件

  • db4o数据库文件_繁忙的Java开发人员指南db4o,使用db4o进行数据库重构

    db4o数据库文件_繁忙的Java开发人员指南db4o,使用db4o进行数据库重构存档日期:2019年5月13日|首次发布:2007年5月22日重构Java™代码比重构关系数据库要简单得多,但是幸运的是,对象数据库的情况并非如此。在《繁忙的Java开发人员db4o指南》的这一期中,TedNeward向您介绍了他最喜欢的对象数据库的另一个优点:db4o将重构简化到几乎没有用处。此内容不再被更新或维护。全文以PDF格式“按原样”提供。随着技术的飞速发展,…

  • informatik_bug report

    informatik_bug report
    使用工具:PowerCenterDesigner
    版本:DesignerVersion8.6.1HotFix100124412(R179D88)
    平台:CitrixWebInterface
    Bug:
    1、Mappings->ParametersandVariables…和Union[GroupPorts]里PortName粘贴未双击时,显示已改变,但偶尔失效。
    2、Union[GroupPorts]连线后顺

    2022年10月29日
  • 用户头像上传_头像使用

    用户头像上传_头像使用上传头像上传头像-持久层SQL语句的规划将对应文件保存在操作系统上,然后在把这个文件路径给记录,因为记录路径是非常便捷和方便,将来如果要打开这个文件可以依据这个路径去找到这个文件。在数据库中需要保存这个文件的路径即可。将所有的静态资源(图片、文件、其他资源文件)方法某台电脑上,在把这台电脑作为一台单独的服务器使用。对应是一个更新用户avatar字段的sql语句。updatet_usersetavatar=?,modified_user=?,modified=?whereuid=?设

    2022年10月25日

发表回复

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

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