程序员技能分享

微信公共平台开发接口之智能回复开发实例

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

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

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

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

  1. <?php
  2. /**
  3.   * wechat php test
  4.   */
  5. //define your token
  6. define(“TOKEN”“weixin”);
  7. $wechatObj = new wechatCallbackapiTest();
  8. $wechatObj->valid();
  9. class wechatCallbackapiTest
  10. {
  11.  public function valid()
  12.     {
  13.         $echoStr = $_GET[“echostr”];
  14.         //valid signature , option
  15.         if($this->checkSignature()){
  16.          echo $echoStr;
  17.          exit;
  18.         }
  19.     }
  20.     public function responseMsg()
  21.     {
  22.   //get post data, May be due to the different environments
  23.   $postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];
  24.        //extract post data
  25.   if (!emptyempty($postStr)){
  26.                $postObj = simplexml_load_string($postStr‘SimpleXMLElement’, LIBXML_NOCDATA);
  27.                 $fromUsername = $postObj->FromUserName;
  28.                 $toUsername = $postObj->ToUserName;
  29.                 $keyword = trim($postObj->Content);
  30.                 $time = time();
  31.                 $textTpl = “<xml>
  32.        <ToUserName><![CDATA[%s]]></ToUserName>
  33.        <FromUserName><![CDATA[%s]]></FromUserName>
  34.        <CreateTime>%s</CreateTime>
  35.        <MsgType><![CDATA[%s]]></MsgType>
  36.        <Content><![CDATA[%s]]></Content>
  37.        <FuncFlag>0</FuncFlag>
  38.        </xml>”;
  39.     if(!emptyempty$keyword ))
  40.                 {
  41.                 $msgType = “text”;
  42.                  $contentStr = “Welcome to wechat world!”;
  43.                  $resultStr = sprintf($textTpl$fromUsername$toUsername$time$msgType$contentStr);
  44.                  echo $resultStr;
  45.                 }else{
  46.                  echo “Input something…”;
  47.                 }
  48.         }else {
  49.          echo “”;
  50.          exit;
  51.         }
  52.     }
  53.  private function checkSignature()
  54.  {
  55.         $signature = $_GET[“signature”];
  56.         $timestamp = $_GET[“timestamp”];
  57.         $nonce = $_GET[“nonce”];
  58.   $token = TOKEN;
  59.   $tmpArr = array($token$timestamp$nonce);
  60.   sort($tmpArr, SORT_STRING);
  61.   $tmpStr = implode( $tmpArr );
  62.   $tmpStr = sha1( $tmpStr );
  63.   if$tmpStr == $signature ){
  64.    return true;
  65.   }else{
  66.    return false;
  67.   }
  68.  }
  69. }
  70. ?>

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

  1. //$wechatObj->valid();
  2. $wechatObj->responseMsg();

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

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

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

感谢您关注AndyYang个人博客微信小助手。

回复【1】返回两篇最新文章

回复【2】返回两篇人气文章

回复【3】返回两篇热评文章

回复【4】返回两篇最新技术文章

回复【5】返回两篇最新写作文章

回复其他返回搜索关键字的两篇文章

更多精彩内容,尽在:www.phpfensi.com。亲们,请多多支持哦,谢谢~

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

  1. <?php
  2. /**
  3.  * wechat php test
  4.  */
  5. //define your token
  6. define(“TOKEN”“weixin”);
  7. $wechatObj = new wechatCallbackapiTest();
  8. //$wechatObj->valid();
  9. $wechatObj->responseMsg();
  10. class wechatCallbackapiTest
  11. {
  12.     public function valid()
  13.     {
  14.         $echoStr = $_GET[“echostr”];
  15.         //valid signature , option
  16.         if($this->checkSignature()){
  17.             echo $echoStr;
  18.             exit;
  19.         }
  20.     }
  21.     public function responseMsg()
  22.     {
  23.         //get post data, May be due to the different environments
  24.         $postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];
  25.         //extract post data
  26.         if (!empty($postStr)){
  27.             $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement’, LIBXML_NOCDATA);
  28.             $fromUsername = $postObj->FromUserName;
  29.             $toUsername = $postObj->ToUserName;
  30.             $keyword = trim($postObj->Content);
  31.             $time = time();
  32.             $MsgType = $postObj->MsgType; //add
  33.             $textTpl = “<xml>
  34.                 <ToUserName><![CDATA[%s]]></ToUserName>
  35.                 <FromUserName><![CDATA[%s]]></FromUserName>
  36.                 <CreateTime>%s</CreateTime>
  37.                 <MsgType><![CDATA[%s]]></MsgType>
  38.                 <Content><![CDATA[%s]]></Content>
  39.                 <FuncFlag>0</FuncFlag>
  40.                 </xml>”;
  41.             if($MsgType != ‘event’) {
  42.                 if(!empty( $keyword ))
  43.                 {
  44.                     $msgType = “text”;
  45.                     $contentStr = “Welcome to wechat world!”;
  46.                 }else{
  47.                     echo “Input something…”;
  48.                 }
  49.             } else {
  50.                 $msgType = “text”;
  51.                 $contentStr = “感谢您关注AndyYang个人博客微信小助手。\r\n”.
  52.                     “回复【1】返回两篇最新文章\r\n”.
  53.                     “回复【2】返回两篇人气文章\r\n”.
  54.                     “回复【3】返回两篇热评文章\r\n”.
  55.                     “回复【4】返回两篇最新技术文章\r\n”.
  56.                     “回复【5】返回两篇最新写作文章\r\n”.
  57.                     “回复其他返回搜索关键字的两篇文章\r\n”.
  58.                     “更多精彩内容,尽在:<a href=’http://www.phpfensi.com’>www.phpfensi.com</a>。亲们,请多多支持哦,谢谢~”;
  59.                 ;
  60.             }
  61.             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  62.             echo $resultStr;
  63.         }else {
  64.             echo “”;
  65.             exit;
  66.         }
  67.     }
  68.     private function checkSignature()
  69.     {
  70.         $signature = $_GET[“signature”];
  71.         $timestamp = $_GET[“timestamp”];
  72.         $nonce = $_GET[“nonce”];
  73.         $token = TOKEN;
  74.         $tmpArr = array($token, $timestamp, $nonce);
  75.         sort($tmpArr, SORT_STRING); //这个在新的sdk中添加了第二个参数(compare items as strings)
  76.         $tmpStr = implode( $tmpArr );
  77.         $tmpStr = sha1( $tmpStr );
  78.         if( $tmpStr == $signature ){
  79.             return true;
  80.         }else{
  81.             return false;
  82.         }
  83.     }
  84. }

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

  1. <?php
  2. define(“TOKEN”“weixin”);
  3. $wechatObj = new wechatCallbackapiTest();
  4. $wechatObj->weixin_run();
  5. class wechatCallbackapiTest {
  6.     private $fromUsername;
  7.     private $toUsername;
  8.     private $times;
  9.     private $keyword;
  10.     private $MsgType;
  11.     public function responseMsg() {
  12.   $postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];
  13.   if (!emptyempty($postStr)) {
  14.             $postObj = simplexml_load_string($postStr‘SimpleXMLElement’, LIBXML_NOCDATA);
  15.             $this->fromUsername = $postObj->FromUserName;
  16.             $this->toUsername   = $postObj->ToUserName;
  17.             $this->keyword      = trim($postObj->Content);
  18.             $this->time         = time();
  19.             $this->MsgType      = $postObj->MsgType;
  20.         } else {
  21.          echo “Pay attention to <a href=’http://{$_SERVER[‘HTTP_HOST’]}’>http://{$_SERVER[‘HTTP_HOST’]}</a>,thanks!”;
  22.          exit;
  23.         }
  24.     }
  25.     public function weixin_run() {
  26.         $this->responseMsg();
  27.         if($this->MsgType != ‘event’) { //attention
  28.             $data = $this->getData();
  29.          $this->fun_xml(“news”$datacount($data));
  30.         } else {
  31.             $data = $this->getWelData();
  32.          $this->fun_xml(“text”$data, 1);
  33.         }
  34.     }
  35.  //type: text 文本类型, news 图文类型
  36.  //text,array(内容),array(ID)
  37.  //news,array(array(标题,介绍,图片,超链接),…小于10条),条数
  38.  private function fun_xml($type$value_arr$count) {
  39.      $con=”<xml>
  40.      <ToUserName><![CDATA[{$this->fromUsername}]]></ToUserName>
  41.      <FromUserName><![CDATA[{$this->toUsername}]]></FromUserName>
  42.      <CreateTime>{$this->times}</CreateTime>
  43.      <MsgType><![CDATA[{$type}]]></MsgType>”;
  44.         switch($type) {
  45.          case “text” :
  46.       $con.=“<Content><![CDATA[$value_arr]]></Content>”;
  47.           break;
  48.       case “news” :
  49.       $con.=”<ArticleCount>{$count}</ArticleCount>
  50.        <Articles>”;
  51.       foreach($value_arr as $key => $v) {
  52.             $con.=”<item>
  53.              <Title><![CDATA[{$v[0]}]]></Title>
  54.              <Description><![CDATA[{$v[1]}]]></Description>
  55.              <PicUrl><![CDATA[{$v[2]}]]></PicUrl>
  56.              <Url><![CDATA[{$v[3]}]]></Url>
  57.              </item>”;
  58.       }
  59.       $con.=“</Articles>”;
  60.           break;
  61.      }
  62.      echo $con.“</xml>”;
  63.  }
  64.     private function getData() {
  65.         //数据库通过关键字查询文章
  66.         //。。。。。。。。。。。。
  67.         //。。。。。。。。。。。。
  68.         //返回文章结果的数组
  69.         return $data;
  70.     }
  71.     private function getWelData() {
  72.         $data = “感谢您关注AndyYang个人博客微信小助手。\r\n”.
  73.                     “回复【1】返回两篇最新文章\r\n”.
  74.                     “回复【2】返回两篇人气文章\r\n”.
  75.                     “回复【3】返回两篇热评文章\r\n”.
  76.                     “回复【4】返回两篇最新技术文章\r\n”.
  77.                     “回复【5】返回两篇最新写作文章\r\n”.
  78.                     “回复其他返回搜索关键字的两篇文章\r\n”.
  79.                     “更多精彩内容,尽在:<a href=’http://m.phpfensi.com/’>www.phpfensi.com</a>。亲们,请多多支持哦,谢谢~”;
  80.                 ;
  81.         return $data;
  82.     }
  83. }

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

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址