微信公众平台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)
上一篇 2021年9月12日 上午6:00
下一篇 2021年9月12日 上午6:00


相关推荐

  • CentOS安装/卸载Anaconda(图文详解)

    CentOS安装/卸载Anaconda(图文详解)众所周知的原因 从官网下载 Anaconda 非常慢 因此为了加速下载 这里我们采取清华源下载 不过下载前想要查看具体的版本信息 还是推荐从官网查看 这里我们以项目要用到的 2021 05 版本为例 输入 这里我们刚刚安装下载的文件 文件名与下载后缀相同 bashAnaconda 2021 05 Linux x86 64 sh 然后按 ENTER 即可 Please pressENTERto 接下来进入安装协议部分 一直按 ENTER 即可在安装许可的最后出现

    2026年3月19日
    1
  • 概率论中经典概率模型

    概率论中经典概率模型温故知新 1 抽样模型 nbsp 2 放回抽样模型 nbsp 3 盒子模型 nbsp nbsp 4 生日问题 nbsp nbsp 5 会面问题 nbsp nbsp 7 蒲丰投针 nbsp nbsp nbsp 8 配对问题 nbsp nbsp 9 摸彩问题 nbsp nbsp

    2026年1月21日
    2
  • 41. Vue组件传值-父组件向子组件传值

    41. Vue组件传值-父组件向子组件传值前言前面写了组件的创建、切换等等篇章,主要讲述了组件自身如何在父组件app中如何渲染使用。这里存在一个问题,就是父组件的数据如何传递到子组件中。这是一个很常见的情况,如果是jQuery那么都是直接传参数就是了,而在Vue框架中,这里就要使用子组件中props属性来处理了。官网介绍props地址:https://cn.vuejs.org/v2/guide/components-props.ht…

    2022年5月31日
    39
  • html下拉单选框

    html下拉单选框DOCTYPE tml htmllang en head metacharset UTF 8 metaname viewport content width device width user scalable no initial scale 1 0 maximum scale 1 0 minimum scale 1 0 metaname viewport content width device width user scalable no initial scale 1 0 maximum scale 1 0 minimum scale 1 0 metacharset UTF 8 head htmllang en

    2026年3月17日
    1
  • 如何理解先验概率和后验概率

    如何理解先验概率和后验概率如何理解先验概率和后验概率前言先验概率的分类先验概率与后验概率的区别理解前言近代西方传统中 认为先验指无需经验或先于经验获得的知识 它通常与后验知识相比较 后验意思是指 在经验之后 需要经验 这一区分来自于中世纪逻辑所区分的两种论证 从原因到结果的论证称为 先验的 而从结果到原因的论证称为 后验的 先验概率是指根据以往经验和分析得到的概率 如全概率公式 它往往作为 由因求果 问题中的 因 出现 后验概率是指在得到 结果 的信息后重新修正的概率 是 执果寻因 问题中的 因 后验概率是基于新的

    2025年8月15日
    5
  • redis 压缩表存储数据库数据(数据结构链表的特点)

    本文所引用的源码全部来自Redis2.8.2版本。Redis中ziplist数据结构与API相关文件是:ziplist.h,ziplist.c,t_zset.c。一、ziplist的构成是一个4字节无符号整数,用来存储整个ziplist占用的字节数;是一个4字节无符号整数,用来存储ziplist最后一个节点的相对于ziplist首地址偏移量;是一个2字节

    2022年4月15日
    76

发表回复

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

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