微信开发第一章 微信公众号
先掰扯一下 微信开发的本质: 微信官方留了一大把子的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]