PHP前端开发

php开发微信公众平台接口智能回复实例代码

百变鹏仔 3周前 (03-13) #前端问答
文章标签 实例

这篇文章主要介绍了php版微信公众平台接口开发之智能回复开发,结合实例形式较为详细的分析了只能回复功能的原理与通过微信接口调用具体实现技巧,需要的朋友可以参考下

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

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

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

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

立即学习“PHP免费学习笔记(深入)”;

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

<?php /** * wechat php test *///define your tokendefine("TOKEN", "weixin");$wechatObj = new wechatCallbackapiTest();$wechatObj->valid();class wechatCallbackapiTest{ public function valid()  {    $echoStr = $_GET["echostr"];    //valid signature , option    if($this-&gt;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-&gt;FromUserName;        $toUsername = $postObj-&gt;ToUserName;        $keyword = trim($postObj-&gt;Content);        $time = time();        $textTpl = "<xml>    <tousername></tousername>    <fromusername></fromusername>    <createtime>%s</createtime>    <msgtype></msgtype>    <content></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; } }}?&gt;

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

//$wechatObj-&gt;valid();$wechatObj-&gt;responseMsg();

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

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

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

<?php /** * wechat php test *///define your tokendefine("TOKEN", "weixin");$wechatObj = new wechatCallbackapiTest();//$wechatObj->valid();$wechatObj-&gt;responseMsg();class wechatCallbackapiTest{  public function valid()  {    $echoStr = $_GET["echostr"];    //valid signature , option    if($this-&gt;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-&gt;FromUserName;      $toUsername = $postObj-&gt;ToUserName;      $keyword = trim($postObj-&gt;Content);      $time = time();      $MsgType = $postObj-&gt;MsgType; //add      $textTpl = "<xml>        <tousername></tousername>        <fromusername></fromusername>        <createtime>%s</createtime>        <msgtype></msgtype>        <content></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个人博客微信小助手。".          "回复【1】返回两篇最新文章".          "回复【2】返回两篇人气文章".          "回复【3】返回两篇热评文章".          "回复【4】返回两篇最新技术文章".          "回复【5】返回两篇最新写作文章".          "回复其他返回搜索关键字的两篇文章".          "更多精彩内容,尽在:<a>www.jb51.net</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-&gt;fromUsername = $postObj-&gt;FromUserName;      $this-&gt;toUsername  = $postObj-&gt;ToUserName;      $this-&gt;keyword   = trim($postObj-&gt;Content);      $this-&gt;time     = time();      $this-&gt;MsgType   = $postObj-&gt;MsgType;    } else {     echo "Pay attention to <a>http://{$_SERVER['HTTP_HOST']}</a>,thanks!";     exit;    }  }  public function weixin_run() {    $this-&gt;responseMsg();    if($this-&gt;MsgType != 'event') { //attention      $data = $this-&gt;getData();     $this-&gt;fun_xml("news", $data, count($data));    } else {      $data = $this-&gt;getWelData();     $this-&gt;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>fromUsername}]]&gt;</tousername>   <fromusername>toUsername}]]&gt;</fromusername>   <createtime>{$this-&gt;times}</createtime>   <msgtype></msgtype>";    switch($type) {     case "text" :   $con.="<content></content>";     break;   case "news" :   $con.="<articlecount>{$count}</articlecount>    <articles>";   foreach($value_arr as $key =&gt; $v) {      $con.="<item>       <title></title>       <description></description>       <picurl></picurl>       <url></url>       </item>";   }   $con.="</articles>";     break;   }   echo $con."</xml>"; }  private function getData() {    //数据库通过关键字查询文章    //。。。。。。。。。。。。    //。。。。。。。。。。。。    //返回文章结果的数组    return $data;  }  private function getWelData() {    $data = "感谢您关注AndyYang个人博客微信小助手。".          "回复【1】返回两篇最新文章".          "回复【2】返回两篇人气文章".          "回复【3】返回两篇热评文章".          "回复【4】返回两篇最新技术文章".          "回复【5】返回两篇最新写作文章".          "回复其他返回搜索关键字的两篇文章".          "更多精彩内容,尽在:<a>www.jb51.net</a>。亲们,请多多支持哦,谢谢~";        ;    return $data;  }}

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