php版微信公众平台接口开发之智能回复开发教程


Posted in PHP onSeptember 22, 2016

本文实例讲述了php版微信公众平台接口开发之智能回复功能实现方法。分享给大家供大家参考,具体如下:

智能回复是根据用户输入的条件来反馈结果用用户了,这个小编以前有做过信整理了一些例子供各位参考,比较完整主要是介绍在开发端了。

微信自推出后,着实火了一把,而支付功能的推出,又把微信推到了一个无可比拟的高度,然后申请微信订阅号或者服务号的人也开始比肩接踵。下面我将给大家简单讲解下微信公众平台开发接口。

先去 微信公众平台 申请账号,然后按照提示一步步。在选择订阅号和服务号上,个人只能申请订阅号,而且局限于基础功能;而企业两者都可以申请。订阅号和服务号的区别在于:订阅号可以每天群发一条消息,而服务号一个月才能群发一条;订阅号需要微信认证才能自定义菜单(企业才能认证,认证300元一次),而服务号则一开始就有自定义菜单,但是也可以认证,认证后服务号直接升级高级功能。更多差异请百度...

我申请的是订阅号,因为是个人。只要传一张手捧身份证的人头照就可以了,虽然有点傻。然后等待信息登记审核(一天左右时间)。通过后直接进入 微信公众平台 ,点击功能进入高级功能,关闭编辑模式,开启开发模式,然后下载微信提供的demo,解压,就一个文件:wx_sample.php,代码如下:

<?php
/**
 * wechat php test
 */
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
 public function valid()
  {
    $echoStr = $_GET["echostr"];
    //valid signature , option
    if($this->checkSignature()){
     echo $echoStr;
     exit;
    }
  }
  public function responseMsg()
  {
 //get post data, May be due to the different environments
 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    //extract post data
 if (!emptyempty($postStr)){
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $fromUsername = $postObj->FromUserName;
        $toUsername = $postObj->ToUserName;
        $keyword = trim($postObj->Content);
        $time = time();
        $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[%s]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>0</FuncFlag>
    </xml>";
  if(!emptyempty( $keyword ))
        {
        $msgType = "text";
         $contentStr = "Welcome to wechat world!";
         $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
         echo $resultStr;
        }else{
         echo "Input something...";
        }
    }else {
     echo "";
     exit;
    }
  }
 private function checkSignature()
 {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
 $token = TOKEN;
 $tmpArr = array($token, $timestamp, $nonce);
 sort($tmpArr, SORT_STRING);
 $tmpStr = implode( $tmpArr );
 $tmpStr = sha1( $tmpStr );
 if( $tmpStr == $signature ){
  return true;
 }else{
  return false;
 }
 }
}
?>

其实就是认证,然后发送消息。将文件传到你的服务器上,我放在根目录下,然后修改开发模式下的url和token值。假设这里使用的url是https://3water.com/wx_sample.php,token就是上面define的token,这个可以改的,只要两边保持一致,默认是weixin。然后点提交,就会提示你成功了。然后扫下你申请的号码,发个消息,你会发现没反应,这个时候我们需要小调整一下,关闭接口文档中调用认证的方法,开启调用处理回复信息的方法:

//$wechatObj->valid();
$wechatObj->responseMsg();

这个时候你再发个消息,你就会收到:Welcome to wechat world!

是不是在关注了有些订阅号或者服务号之后,马上会收到一条消息。什么回复1,怎样怎样;回复2,怎样怎样之类的。

拿我自己的博客举例,我的关注语是:

感谢您关注AndyYang个人博客微信小助手。
回复【1】返回两篇最新文章
回复【2】返回两篇人气文章
回复【3】返回两篇热评文章
回复【4】返回两篇最新技术文章
回复【5】返回两篇最新写作文章
回复其他返回搜索关键字的两篇文章
更多精彩内容,尽在:3water.com。亲们,请多多支持哦,谢谢~

那这个怎么实现呢?直接上代码:

<?php
/**
 * wechat php test
 */
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();
$wechatObj->responseMsg();
class wechatCallbackapiTest
{
  public function valid()
  {
    $echoStr = $_GET["echostr"];
    //valid signature , option
    if($this->checkSignature()){
      echo $echoStr;
      exit;
    }
  }
  public function responseMsg()
  {
    //get post data, May be due to the different environments
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    //extract post data
    if (!empty($postStr)){
      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
      $fromUsername = $postObj->FromUserName;
      $toUsername = $postObj->ToUserName;
      $keyword = trim($postObj->Content);
      $time = time();
      $MsgType = $postObj->MsgType; //add
      $textTpl = "<xml>
        <ToUserName><![CDATA[%s]]></ToUserName>
        <FromUserName><![CDATA[%s]]></FromUserName>
        <CreateTime>%s</CreateTime>
        <MsgType><![CDATA[%s]]></MsgType>
        <Content><![CDATA[%s]]></Content>
        <FuncFlag>0</FuncFlag>
        </xml>";
      if($MsgType != 'event') {
        if(!empty( $keyword ))
        {
          $msgType = "text";
          $contentStr = "Welcome to wechat world!";
        }else{
          echo "Input something...";
        }
      } else {
        $msgType = "text";
        $contentStr = "感谢您关注AndyYang个人博客微信小助手。\r\n".
          "回复【1】返回两篇最新文章\r\n".
          "回复【2】返回两篇人气文章\r\n".
          "回复【3】返回两篇热评文章\r\n".
          "回复【4】返回两篇最新技术文章\r\n".
          "回复【5】返回两篇最新写作文章\r\n".
          "回复其他返回搜索关键字的两篇文章\r\n".
          "更多精彩内容,尽在:<a href='https://3water.com'>3water.com</a>。亲们,请多多支持哦,谢谢~";
        ;
      }
      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
      echo $resultStr;
    }else {
      echo "";
      exit;
    }
  }
  private function checkSignature()
  {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING); //这个在新的sdk中添加了第二个参数(compare items as strings)
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    if( $tmpStr == $signature ){
      return true;
    }else{
      return false;
    }
  }
}

当然这里只是简单的实现下,在微信公众平台提供的sdk上做简单的修改,实际上msgtype类型很多,就算消息类型为event的,它里面也有subscribe、LOCATION等,而如果细化的话,就用Event为subscribe来处理初次关注的事件,代码如下:

<?php
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->weixin_run();
class wechatCallbackapiTest {
  private $fromUsername;
  private $toUsername;
  private $times;
  private $keyword;
  private $MsgType;
  public function responseMsg() {
 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 if (!emptyempty($postStr)) {
      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
      $this->fromUsername = $postObj->FromUserName;
      $this->toUsername  = $postObj->ToUserName;
      $this->keyword   = trim($postObj->Content);
      $this->time     = time();
      $this->MsgType   = $postObj->MsgType;
    } else {
     echo "Pay attention to <a href='http://{$_SERVER['HTTP_HOST']}'>http://{$_SERVER['HTTP_HOST']}</a>,thanks!";
     exit;
    }
  }
  public function weixin_run() {
    $this->responseMsg();
    if($this->MsgType != 'event') { //attention
      $data = $this->getData();
     $this->fun_xml("news", $data, count($data));
    } else {
      $data = $this->getWelData();
     $this->fun_xml("text", $data, 1);
    }
  }
 //type: text 文本类型, news 图文类型
 //text,array(内容),array(ID)
 //news,array(array(标题,介绍,图片,超链接),...小于10条),条数
 private function fun_xml($type, $value_arr, $count) {
   $con="<xml>
   <ToUserName><![CDATA[{$this->fromUsername}]]></ToUserName>
   <FromUserName><![CDATA[{$this->toUsername}]]></FromUserName>
   <CreateTime>{$this->times}</CreateTime>
   <MsgType><![CDATA[{$type}]]></MsgType>";
    switch($type) {
     case "text" :
   $con.="<Content><![CDATA[$value_arr]]></Content>";
     break;
   case "news" :
   $con.="<ArticleCount>{$count}</ArticleCount>
    <Articles>";
   foreach($value_arr as $key => $v) {
      $con.="<item>
       <Title><![CDATA[{$v[0]}]]></Title>
       <Description><![CDATA[{$v[1]}]]></Description>
       <PicUrl><![CDATA[{$v[2]}]]></PicUrl>
       <Url><![CDATA[{$v[3]}]]></Url>
       </item>";
   }
   $con.="</Articles>";
     break;
   }
   echo $con."</xml>";
 }
  private function getData() {
    //数据库通过关键字查询文章
    //。。。。。。。。。。。。
    //。。。。。。。。。。。。
    //返回文章结果的数组
    return $data;
  }
  private function getWelData() {
    $data = "感谢您关注AndyYang个人博客微信小助手。\r\n".
          "回复【1】返回两篇最新文章\r\n".
          "回复【2】返回两篇人气文章\r\n".
          "回复【3】返回两篇热评文章\r\n".
          "回复【4】返回两篇最新技术文章\r\n".
          "回复【5】返回两篇最新写作文章\r\n".
          "回复其他返回搜索关键字的两篇文章\r\n".
          "更多精彩内容,尽在:<a href='https://3water.com/'>3water.com</a>。亲们,请多多支持哦,谢谢~";
        ;
    return $data;
  }
}

老实说很想弄个服务号玩玩,自定义菜单是没什么技术含量的,但是后面的微信支付之类,服务号仅有的服务,还是挺值得去尝试下的.

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php中cookie的作用域
Mar 27 PHP
PHP 函数语法介绍一
Jun 14 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
php 显示指定路径下的图片
Oct 29 PHP
PHP 代码规范小结
Mar 08 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
php字符串过滤与替换小结
Jan 26 PHP
PHP验证码生成原理和实现
Jan 24 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 PHP
php-msf源码详解
Dec 25 PHP
PHP __call()方法实现委托示例
May 20 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 #PHP
PHP查看SSL证书信息的方法
Sep 22 #PHP
php版微信自动获取收货地址api用法示例
Sep 22 #PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 #PHP
php中foreach结合curl实现多线程的方法分析
Sep 22 #PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 #PHP
php微信公众平台配置接口开发程序
Sep 22 #PHP
You might like
一个简单的PHP投票程序源码
2007/03/11 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
js实现文本框中焦点在最后位置
2014/03/04 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
Python实现单词拼写检查
2015/04/25 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
办公室主任职责范文
2013/11/08 职场文书
毕业生就业推荐信范文
2013/12/01 职场文书
网站开发实习生的自我评价
2013/12/11 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
社区安全检查制度
2014/02/03 职场文书
保安公司服务承诺书
2014/05/28 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
主持人开幕词
2015/01/29 职场文书
大学生个人总结范文
2015/02/15 职场文书
如何撰写创业策划书
2019/06/27 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android