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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android 实现锚点定位

    Android 实现锚点定位

    2022年4月3日
    35
  • oracle存储过程语法

    oracle存储过程语法前两天无意见看见了一个非常适合学习Oracle附上链接:https://blog.csdn.net/yucaifu1989/article/details/15813793Oracle存储过程基本语法存储过程   1CREATEORREPLACEPROCEDURE存储过程名   2IS   3BEGIN   4NULL;   5END; 行1:   CREAT…

    2022年7月17日
    17
  • 怎么保证RabbitMQ和kafuka集群的高可用性?

    怎么保证RabbitMQ和kafuka集群的高可用性?rabbitMQ有三种模式:单机模式,普通集群模式,镜像集群模式 RabbitMQ的高可用性 RabbitMQ是比较有代表性的,因为是基于主从做高可用性的,我们就以他为例子讲解第一种MQ的高可用性怎么实现。 rabbitmq有三种模式:单机模式,普通集群模式,镜像集群模式 1)单机模式 就是demo级别的,一般就…

    2022年6月1日
    40
  • Windows 10版本business_editions和consumer_editions的区别?「建议收藏」

    Windows 10版本business_editions和consumer_editions的区别?「建议收藏」Windows10版本business_editions和consumer_editions的区别?【答1】二者都内置专业版,不同之处在于:consumer_editions版本包含:Home(家庭版);Education(教育版);Professional(专业版);business_editions版本包含:Education(教育版);Enterprise(企业版);Pro…

    2025年7月9日
    3
  • Camstar CDO增加自定义字段

    Camstar CDO增加自定义字段本节讲述如何在Camstar原生CDO里加入自定义字段进入Designer,打开CDO页,找到要增加字段的CDO,打开,切换到Fields页,点击下面的Add按钮。在弹出的窗口中,输入相应的数据:DataType增加的字段的数据类型,字符串、整数、浮点数、Object等FieldType字段类型,描述字段的具体用处,不同类型的数据字段长度是不同的(比如字符串的长度)Name字段名称,也是数据库表里的默认字段名称Caption字段描述,也是在Modeling配置页面里对应字段的名称点

    2025年7月1日
    4
  • Celer Network月报 202107

    Celer Network月报 202107Celer技术研发更新 cBridgev1开发完成,主网上线,运行良好 cBridgev2开始研发,新增智能费率与流动性调节功能 Layer2.finance测试网成功运行,完成所有相关问题修复与功能改进 正在进行多项Layer2.finance的策略开发工作 SGN主网技术支持,现已有10个验证节点上线 Celer社区建设及市场活动社区动态更新本月重点事件Layer2.financev1.0版本测…

    2022年5月17日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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