周大胖子 发表于 2019-1-20 23:23:13

微信开发第一章 微信公众号

先掰扯一下 微信开发的本质: 微信官方留了一大把子的api ;我们去研究这些api 就是对微信的开发。
再掰扯一下, 与微信之间的通信本质: 微信给我们发一段 xml 格式的数据包, 我们在5秒内,还微信一个xml 数据包。

再理出一个重要的 白痴重点:之所以说这个重点白痴, 那是我白痴,我就纳闷了,微信公众号一开始要进行的 服务器配置认证是干嘛的?发到哪?返回哪?写在这里的这个url 地址有啥子卵用?
后来我明白了: 这个URL地址 就是微信消息的接收接口【如果是个文件,也可以叫做接收文件】。 后期所有的来自用户对微信平台的操作,【包括关注、取关、发文字等】都是发往的这个端口。 而 认证这个接口本身, 没啥乱用; 认证的时候,把这个接口调整一下, 返回一段 它要的值, 认证完后,注释掉这个接口,返回的语句, 写另一个调用,调用处理xml的代码, 然后返回xml 。

先写一个简单的PHP tp5.0 版本 某文件 对微信的一个 文字返回、关注返回菜单的 代码:
<?php
namespace app\weichart\controller;


class Index
{
    public function m()
    {
      return 'hahh    }

    public function index()
    {
      // 接入时的测试
      // $echoStr = $_GET["echostr"];
      // if($this->checkSignature()){
      //   return $echoStr;
      //   exit;
      // }
      
      // 返回数据
      $this->responseMsg();
    }

    public function checkSignature()
    {
      $signature = $_GET["signature"];
      $timestamp = $_GET["timestamp"];
      $nonce = $_GET["nonce"];
      $token = "weixinabc";
      $tmpArr = array($token, $timestamp, $nonce);
      sort($tmpArr, SORT_STRING);
      $tmpStr = implode( $tmpArr );
      $tmpStr = sha1( $tmpStr );
      if( $tmpStr == $signature ){
            return true;
      }else{
            return false;
      }
    }

    public function responseMsg()
    {
      // 输出到日志文件中
      file_put_contents('./test/abc.log','777777777777777 /r/n'.$GLOBALS["HTTP_RAW_POST_DATA"],FILE_APPEND);
      //获取post数据,可能是由于不同的环境
      $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
      // 如过请求不为空 提取post 数据
      if (!empty($postStr)){
      
      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
      $fromUsername = $postObj->FromUserName;
      $toUsername = $postObj->ToUserName;
      // 获取关键字
      $keyword = trim($postObj->Content);
      // 简写版 取出事件类型
      $event = $postObj->Event;

      // 输出到日志文件中
      file_put_contents('./test/abc.log', $fromUsername.'[]'.$toUsername.'[]'.$keyword,FILE_APPEND);

      $time = time();
      $textTpl = "<xml>
          <ToUserName><!]></ToUserName>
          <FromUserName><!]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><!]></MsgType>
          <Content><!]></Content>
          <FuncFlag>0</FuncFlag>
          </xml>";

      // 如果用户输入不为空
      // if(!empty( $keyword ))
      // {
      //   $msgType = "text";
      //   // 返回内容
      //   $contentStr = "已经成功进入这个文件!";
      //   // 填充模板
      //   $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
      //   // 返回
      //   echo $resultStr;
      // }else{
      //   echo "Input something...";
      // }
      
      //当我们关注微信平台时,会发送一个订阅的事件,我们就处理这个事件就OK
      switch($postObj ->MsgType)
      {
          case 'event':
            // 如果是用户订阅事件
            if($event =='subscribe'){

            // 返回信息
            $content = "你好啊。 大力!
\n\r\n * 菜单如下 \r\n\r\n 1.输入新闻 就返回新闻条目;\r\n 2.输入大力,跳出一个美女;\r\n";
            // 设置返回类型,为返回的第四个参数,文本类型
            $msgType = 'text
            // 推送事件返回信息,返回订阅为文本消息[填充模板]
            $textTpl = sprintf($textTpl,$fromUsername,$toUsername, $time,$msgType,$content);
            // 返回给客户端
            echo $textTpl;         

            }
          break;
          default:

      }

      }else {
      echo "";
      exit;
      }
    }
}

测试: 调试 是个什么概念, 这又不是服务器,怎么知道自己错没错呢?答案就是 把想要的数据输出到文件中。

xml通讯基础: 就是先写一段 xml 字符串, 其中 用 %s 做占位符, 然后 再使用 php 的 sprintf函数进行组装
sprintf( 'xml字符串', 第一个占位符的内容,第二个占位符的内容,第三个占位符的内容----- );

最后返回微信客户端用的是 echo ;



页: [1]
查看完整版本: 微信开发第一章 微信公众号