个人微信公众号
2018-03-04 19:08
337 查看
本人的微信公众号,欢迎大家的关注,微信公众号中有许多优秀的资源,希望与大家分享:
本文从需求分析、系统设计、代码实现等方面进行讲解微信公众号的搭建,欢迎大家批评指正。
本文地址:http://blog.csdn.net/tiandixuanwuliang/article/details/79438738
本文从需求分析、系统设计、代码实现等方面进行讲解微信公众号的搭建,欢迎大家批评指正。
1 采用了第三方服务器和开发者服务器同时授权的方式
2 微信公众号原理图
3 微信公众号开发者服务器架构图
4 微信公众号功能结构图
5 开发者服务器代码
<?php /** * 微信公众号开发-入门 * * api */ define("TOKEN",'we--xxxx'); //这里和你微信公众号开放平台上的tonken填写一样的即可 $weixinApi=new WeixinApi(); if(isset($_GET["echostr"])){ $weixinApi->valid(); }else{ $weixinApi->responseMsg(); } class WeixinApi{ //验证接口 public function valid(){ $echoStr = $_GET["echostr"];//从微信用户端获取一个随机字符赋予变量echostr if($this->checkSignature()){ echo $echoStr; exit; } } //检查签名 private function checkSignature(){ //1 接受微信服务器get请求发送过来的4个参数 $signature = $_GET["signature"];//从用户端获取签名赋予变量signature $timestamp = $_GET["timestamp"];//从用户端获取时间戳赋予变量timestamp $nonce = $_GET["nonce"]; //从用户端获取随机数赋予变量nonce //2 加密和校验请求 //2.1 将token、timestamp、nonce三个参数进行字典序排序 $tmpArr = array(TOKEN, $timestamp, $nonce);//简历数组变量tmpArr sort($tmpArr, SORT_STRING);//新建排序 //2.2 将三个参数字符串拼接成一个字符串进行sha1加密 $tmpStr = implode($tmpArr);//数组转字符串 $tmpStr = sha1($tmpStr);//shal加密 //2.3 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if ($tmpStr == $signature) { return true; } else { return false; } } //回复消息 public function responseMsg(){ //3 以下代码接受消息 //3.1 接受微信服务器发送过来的原生的POST的数据包 // $postData = $GLOBALS["HTTP_RAW_POST_DATA"]; $postData = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] :file_get_contents("php://input"); //3.2 处理数据包 $xmlObj = simplexml_load_string($postData, "SimpleXMLElement", LIBXML_NOCDATA); $msgType = $xmlObj->MsgType; //4 根据消息类型进行业务处理 switch ($msgType) { //接受事件消息 case 'event': $this->disposeEvent($xmlObj); 4000 break; //接受文本消息 case 'text': $this->disposeText($xmlObj); break; //接受图片消息 case 'image': $this->disposeImage($xmlObj); break; } } //处理接收的事件消息 private function disposeEvent($xmlObj){ switch ($xmlObj->Event){ case 'subscribe'://订阅事件 $this->sendText('欢迎您的订阅'); break; case 'unsubscribe'://取消订阅事件 $this->sendText('good-bye');//该消息用户其实是看不到的,取消订阅事件一般用来清除数据库记录 break; } } //处理接收的文本消息 private function disposeText($xmlObj){ $text=trim($xmlObj->Content); //包含关键字都不做处理 if (!( strstr($text,'违规') //这里对违规的关键字做排除,不予理睬 )){ switch ($text){ case '你好': $this->sendText($xmlObj,'Hi 我是开发者服务器'); break; case 'new': $newsArr=array( array( "title"=>"看到这条消息,你可以买彩票了", "description"=>"本公众号有许多小彩蛋,欢迎您的探索。", "picUrl"=>"http://img.mp.itc.cn/upload/20170610/03d69e8df0524b8cb59fd16dc2fec989.jpg", "url"=>"http://www.baidu.com" ) ); $this->sendNews($xmlObj,$newsArr); break; default: $this->tuling123($xmlObj,trim($xmlObj->Content)); //图灵机器人 } } } //处理接收的图片消息 private function disposeImage($xmlObj){ //一般情况下,不会去处理用户发送的图片 $this->sendImage($xmlObj,$xmlObj->PicUrl,$xmlObj->MediaId); } //发送文本的方法 private function sendText($xmlObj,$content){ $replyTextMsg="<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; echo sprintf($replyTextMsg,$xmlObj->FromUserName,$xmlObj->ToUserName,time(),$content); } //发送图片的方法 private function sendImage($xmlObj,$mediaId){ $replyImageMsg="<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[%s]]></MediaId> </Image> </xml>"; echo sprintf($replyImageMsg,$xmlObj->FromUserName,$xmlObj->ToUserName,time(),$mediaId); } //发送图文的方法 private function sendNews($xmlObj,$newsArr){ $newsTplHead = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>%s</ArticleCount> <Articles>"; $newsTplBody = "<item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item>"; $newsTplFoot = "</Articles> <FuncFlag>%s</FuncFlag> </xml>"; $replyNewsMsg = sprintf($newsTplHead, $xmlObj->FromUserName, $xmlObj->ToUserName, time(),count($newsArr)); foreach($newsArr as $key => $value){ $replyNewsMsg .= sprintf($newsTplBody, $value['title'], $value['description'], $value['picUrl'], $value['url']); } $replyNewsMsg .= sprintf($newsTplFoot, 0); echo $replyNewsMsg; } public function tuling123($xmlObj,$message){//这是是使用图灵机器人 $tuTonken='2d8aaa17141c443----xxx---fsa'; //请去图灵网http://www.tuling123.com/自己申请一个tonken $tuUrl='http://www.tuling123.com/openapi/api?key='.$tuTonken.'&info='.$message.'&userid='.$xmlObj->FromUserName; $tuData='{ "key": "'.$tuTonken.'", "info": "'.$message.'", "userid": "'.$xmlObj->FromUserName.'" }'; $results = $this->htts_request($tuUrl,$tuData); // print_r($results); if ($results['code']==100000){ $text=$results['text']; $this->sendText($xmlObj,$text); }else{ $this->sendText($xmlObj,'有问题,请输入“帮助”'); } } //https请求(get和post) private function htts_request($url,$data=array()){ //1 初始化curl $ch=curl_init(); //2 设置传输选项 curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//把页面以文件流的形式返回 if (!empty($data)) { curl_setopt($ch, CURLOPT_POST, true); //设置为 POST 请求 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //设置POST的请求数据 } //3 执行curl请求 $outopt=curl_exec($ch); $outoptArr=json_decode($outopt,true); //4 关闭curl curl_close($ch); return $outoptArr; } } ?>
本文地址:http://blog.csdn.net/tiandixuanwuliang/article/details/79438738
相关文章推荐
- 个人微信公众号如何开通原创和赞赏功能?
- 微信公众号教程—记录个人公众号运营(待更新)
- 关于南通大学教务管理系统微信公众号的个人看法:
- 所有围绕微信公众号,企业号开发者的企业或个人的创造的利润以及生存时间周期
- 向微信公众号发送么个特地消息给么个人
- Node.js+Koa开发微信公众号个人笔记(一)准备工作
- 微信公众号开发-----个人测试装备
- 设置微信公众号客服账号个人使用习惯-微信公众号使用教程24
- 手把手教你创建个人微信公众号
- Node.js+Koa开发微信公众号个人笔记(二)响应事件
- 微信公众号个人中心,实现自动登录的问题
- 如何走上更高平台分享传递干货知识:(开通个人微信公众号:大数据躺过的坑)(图文详解)(博主推荐)
- 个人怎么申请微信公众号-微信公众号使用教程33
- 个人微信公众号,TEBS,欢迎扫码关注哦~
- Node.js+Koa开发微信公众号个人笔记(三)响应文本
- 微信公众号系列(一) 10分钟快速搞定个人微信公众号
- 免费申请个人微信公众号,个人开通微信公众号的方法和费用
- 关于南通大学教务管理系统微信公众号的个人看法