老莫的笔记本  
  
请选择 进入手机版 | 继续访问电脑版
查看: 1152|回复: 0

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

[复制链接]

662

主题

878

帖子

5115

积分

超级版主

Rank: 8Rank: 8

积分
5115
发表于 2019-1-20 23:23:13 | 显示全部楼层 |阅读模式
先掰扯一下 微信开发的本质: 微信官方留了一大把子的api ;  我们去研究这些api 就是对微信的开发。
再掰扯一下, 与微信之间的通信本质: 微信给我们发一段 xml 格式的数据包, 我们在5秒内,还微信一个xml 数据包。

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

先写一个简单的PHP tp5.0 版本 某文件 对微信的一个 文字返回、关注返回菜单的 代码:
  1. <?php
  2. namespace app\weichart\controller;
  3. class Index
  4. {
  5.     public function m()
  6.     {
  7.       return 'hahh    }
  8.     public function index()
  9.     {
  10.       // 接入时的测试
  11.       // $echoStr = $_GET["echostr"];
  12.       // if($this->checkSignature()){
  13.       //   return $echoStr;
  14.       //   exit;
  15.       // }
  16.       
  17.       // 返回数据
  18.       $this->responseMsg();
  19.     }
  20.     public function checkSignature()
  21.     {
  22.         $signature = $_GET["signature"];
  23.         $timestamp = $_GET["timestamp"];
  24.         $nonce = $_GET["nonce"];
  25.         $token = "weixinabc";
  26.         $tmpArr = array($token, $timestamp, $nonce);
  27.         sort($tmpArr, SORT_STRING);
  28.         $tmpStr = implode( $tmpArr );
  29.         $tmpStr = sha1( $tmpStr );
  30.         if( $tmpStr == $signature ){
  31.             return true;
  32.         }else{
  33.             return false;
  34.         }
  35.     }
  36.     public function responseMsg()
  37.     {
  38.       // 输出到日志文件中
  39.       file_put_contents('./test/abc.log','777777777777777 /r/n'.$GLOBALS["HTTP_RAW_POST_DATA"],FILE_APPEND);
  40.       //获取post数据,可能是由于不同的环境
  41.       $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  42.       // 如过请求不为空 提取post 数据
  43.       if (!empty($postStr)){
  44.       
  45.         $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  46.         $fromUsername = $postObj->FromUserName;
  47.         $toUsername = $postObj->ToUserName;
  48.         // 获取关键字
  49.         $keyword = trim($postObj->Content);
  50.         // 简写版 取出事件类型
  51.         $event = $postObj->Event;
  52.         // 输出到日志文件中
  53.         file_put_contents('./test/abc.log', $fromUsername.'[]'.$toUsername.'[]'.$keyword,FILE_APPEND);
  54.         $time = time();
  55.         $textTpl = "<xml>
  56.           <ToUserName><![CDATA[%s]]></ToUserName>
  57.           <FromUserName><![CDATA[%s]]></FromUserName>
  58.           <CreateTime>%s</CreateTime>
  59.           <MsgType><![CDATA[%s]]></MsgType>
  60.           <Content><![CDATA[%s]]></Content>
  61.           <FuncFlag>0</FuncFlag>
  62.           </xml>";
  63.         // 如果用户输入不为空
  64.         // if(!empty( $keyword ))
  65.         // {
  66.         //   $msgType = "text";
  67.         //   // 返回内容
  68.         //   $contentStr = "已经成功进入这个文件!";
  69.         //   // 填充模板
  70.         //   $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  71.         //   // 返回
  72.         //   echo $resultStr;
  73.         // }else{
  74.         //     echo "Input something...";
  75.         // }
  76.         
  77.         //当我们关注微信平台时,会发送一个订阅的事件,我们就处理这个事件就OK
  78.         switch($postObj ->MsgType)
  79.         {
  80.           case 'event':
  81.             // 如果是用户订阅事件
  82.             if($event =='subscribe'){
  83.               // 返回信息
  84.               $content = "你好啊。 大力!
  85. \n\r\n * 菜单如下 \r\n\r\n 1.输入新闻 就返回新闻条目;\r\n 2.输入大力,跳出一个美女;\r\n";
  86.               // 设置返回类型,为返回的第四个参数,文本类型
  87.               $msgType = 'text
  88.               // 推送事件返回信息,返回订阅为文本消息[填充模板]
  89.               $textTpl = sprintf($textTpl,$fromUsername,$toUsername, $time,$msgType,$content);
  90.               // 返回给客户端
  91.               echo $textTpl;           
  92.             }
  93.           break;
  94.           default:
  95.         }
  96.       }else {
  97.         echo "";
  98.         exit;
  99.       }
  100.     }
  101. }
复制代码

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

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

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



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表