文章目录

  • 1 如何把微信公众号授权给开发者服务器
  • 2 如何使用代码把开发者服务器与微信服务器进行关联

很多人都有自己的服务器,特别是对于大学生而言,很多服务器公司都对学生有优惠,例如腾讯云只要1元每月:http://blog.csdn.net/tiandixuanwuliang/article/details/56494528 ,那么我们作为一名程序员,总想把一切掌控在自己手中,<哈哈>,那么如何使用我们开发者服务器去管理微信公众号呢?这就是本文介绍的内容。
本文介绍以下内容:

  • (1)如何把微信公众号授权给开发者服务器
  • (2)如何使用代码把开发者服务器与微信服务器进行关联
  • (3)实现接受和发送消息
  • (4)自定义菜单

1 如何把微信公众号授权给开发者服务器

  • (1)进入微信公众号平台,https://mp.weixin.qq.com/,首先请取消其他第三方服务器的授权,方法如下:



    注:这里也可以不取消第三方服务器的授权,不取消的话,公众号粉丝发送的数据会同时1发送到第三方服务器和开发者服务器,本人已经验证了,有兴趣可以自行研究
  • (2)回到微信公众号管理平台首页,页面往下拉,选择“基本配置”,如图:
  • (3)添加ip白名单
  • (4)选择修改配置
  • (5)下图中的url,指向你自己的服务器中正在运行的php地址,这是本文代码开发的重点,具体内容请看下一章。token可以随便写,但是需要与上述php文件中配置的一样,具体内容请看下一章

2 如何使用代码把开发者服务器与微信服务器进行关联

  • (0)这一章讲解代码的开发。第一章第5小节中的url指向自己的服务器中正在运行的php文件,本章将介绍这一个文件的内容。关于如何运行这个php文件,请看php教程http://blog.csdn.net/tiandixuanwuliang/article/category/7344088
  • (1)该php文件内容如下,下面的代码实现了连接开发者服务器、关键字回复、图灵机器人功能,注:请把下面的token填写为第一章第5小节中截图中设置的token
<?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"];//从微信用户端获取一个随机字符赋予变量echostrif($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);//简历数组变量tmpArrsort($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);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 关闭curlcurl_close($ch);return $outoptArr;}
}
?>
  • (2)上面代码可以用下面的结构图进行分析:
  • (3)下面是自定义菜单的代码(不建议使用,原因请看下面的第5小节)
//获取access_tokenprivate function getAccessToken(){//获取微信接口凭证$appid="wxb4----xxx";//请在第一章第5小节的图片中看$appsecret="21d---xxx";//请在第一章第5小节的图片中看$data=json_decode(file_get_contents('./access_token.json'));if ($data->expires_time <time()){$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";$outoptArr=$this->htts_request($url,array(),false);$access_token=$outoptArr['access_token'];if (!empty($access_token)){//把access_token写入文件$data->access_token=$outoptArr['access_token'];$data->expires_time=time()+7000;$fp=fopen('access_token.json','w');fwrite($fp,json_encode($data));fclose($fp);}else{echo '请求access_token错误';}}else{$access_token=$data->access_token;}
//        echo $access_token;return $access_token;}
//实现自定义菜单public function menu_create(){$access_token=$this->getAccessToken();$url="https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";$data='{"button": [{"type": "click","name": "java","key": "learn_java"},{"name":"chengxu","sub_button":[{"type": "view","name": "CSDN","url": "http://blog.csdn.net/tiandixuanwuliang/"},{"type": "view","name": "Github","url": "https://github.com/wllfengshu/"},{"type": "view","name": "jianshu","url": "https://www.jianshu.com/users/4d12e03d0a5f/timeline/"},{"type": "view","name": "kaifazhe","url": "https://toutiao.io/u/431066/"},{"type": "view","name": "yuyan","url": "http://www.baidu.com"}]},{"name":"jiaoliu","sub_button":[{"type": "view","name": "shuji","url": "http://blog.csdn.net/tiandixuanwuliang/"},{"type": "view","name": "ziyuan","url": "https://github.com/wllfengshu/"},{"type": "view","name": "sucai","url": "https://www.jianshu.com/users/4d12e03d0a5f/timeline/"},{"type": "view","name": "daxuesheng","url": "https://toutiao.io/u/431066/"},{"type": "click","name": "zuozhe","key": "about_author"}]}]}';echo $url." / ".$data;$outoptArr=$this->htts_request($url,json_decode($data,true),true);echo '***';print_r($outoptArr);}
  • (4)下面是网页授权,授权后我们才可以在代码中调用(不建议使用,原因请看下面的第5小节)
    //网页授权-base型public function snsapi_base($redirect_uri){//以下是测试账号$appid="wxb4----xxx";//请在第一章第5小节的图片中看$appsecret="21da56-----xxx";//请在第一章第5小节的图片中看//准备scope$snsapi_base_url="https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appid}&redirect_uri={$redirect_uri}&response_type=code&scope=SCOPE&state=123#wechat_redirect";$code=$_GET['code'];//获取codeif (!isset($code)){header("Location:{$snsapi_base_url}");}//获取access_token$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$code}&grant_type=authorization_code";return $this->htts_request($url);}
  • (5)但是由于个人注册的订阅号没有自定义菜单的开发权限,所以我建议大家自定义菜单的功能交给第三方服务处理,这也是一个窍门,就是微信公众号同时授权给第三方服务器和开发者服务器,这是一个bug,哈哈。请注意,一定要先授权给开发者服务器,再授权给第三方服务器,否则将不成功。原理图如下:
  • 上图中的第三方服务器具有关键字功能,我建议一些常用的关键字都交给第三方服务器做。一些具有逻辑性的关键字、需要存放到数据库的关键字、或者私密性的关键字可以由开发者服务器做。但是由于微信公众号粉丝发送的数据会同时发送到两个服务器,而且开发者服务器还具有图灵机器人功能,可以采取屏蔽的方法,在任意一方屏蔽一次,这样就避免了一条消息,回复了两次的问题。
  • (6)请把上述php文件,放到AppServ软件安装的根目录下的www文件夹下,然后重启AppServ中的服务,最后再把 http://服务器ip地址/index.php 填写到第一章第5节的url中即可。可以开始玩了

本文地址:http://blog.csdn.net/tiandixuanwuliang/article/details/79438662

欢迎大家看我的另一篇文章,这篇文章从需求分析、系统设计、代码实现等方面进行讲解,欢迎大家批评指正,http://blog.csdn.net/tiandixuanwuliang/article/details/79438738

欢迎大家关注,里面有很多资源分享:

如何使用开发者服务器运维微信公众号相关推荐

  1. 云服务器有token_配置node服务器并且链接微信公众号接口配置

    配置node服务器并且链接微信公众号接口配置 配置node服务器 在购买好服务器后,用Xshell链接到服务器. 1.安装nvm curl -o- https://raw.githubusercont ...

  2. 微信连接服务器错误代码1500,微信公众号错误代码10003的解决方法

    微信公众号错误代码10003的解决方法 发布时间:2021-01-18 09:07:41 来源:亿速云 阅读:422 作者:小新 这篇文章将为大家详细讲解有关微信公众号错误代码10003的解决方法,小 ...

  3. 华为云服务器如何搭建微信公众号后台-收发文本信息?

    概述 在本教程中,您将学会使用弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果给最终用户,如图 ...

  4. 配置node服务器并且链接微信公众号接口配置(超详细)

    配置node服务器 在购买好服务器后,用Xshell链接到服务器. 1.安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.3 ...

  5. 开发者如何解绑微信公众号解绑微信小程序

    问题描述: 以前开发过几个微信公众号和微信小程序,还可以登录到微信后台,但是我阿星解绑,因为一个微信号绑定微信小程序和微信公众号的数量是有限制的,在微信后台里解绑需要又管理员的权限,早离职了,联系不上 ...

  6. 微信公众号服务器端脑图,微信公众号中隐藏的思维导图工具,帮你随时随地高效思考...

    「有什么好用的思维导图工具推荐呢?」后台里收到了很多小伙伴类似的问题. 事实上,市面上的思维导图工具真的非常多.无论是老牌的 XMIND,还是在线版的 百度脑图或者 ProcessOn 都可以帮你制作 ...

  7. 微信开发者和其他服务器区别,求教微信公众号开发中两种认证技术的区别?

    本人对微信开发中2个认证方式有些不解,求各位大佬给解释一番. 众所周知,在微信开发者进行开发时,有两个角色和两个场景存在,我分别描述如下: 第一个场景:微信服务器------>我的服务器. 在我 ...

  8. 服务器无法接收微信公众号xml,得不到易信服务器POST的XML信息

    得不到易信服务器POST的XML信息 温馨提示:欲查看和探讨更多关于公众平台开发技术,请访问[微信易信●开发者论坛中心] 在手机端发送消息,日志中能够显示有返回信息 223.252.198.73--[ ...

  9. 微信公众号url服务器在哪里,微信公众号url认证(服务器认证)

    把下面的代码复制 路由需指定到wx方法 namespace App\Http\Controllers\Wx; use Illuminate\Http\Request; use App\Http\Con ...

最新文章

  1. BZOJ1747 [Usaco2005 open]Expedition 探险
  2. (转)linux运行tomcat时JRE_HOME显示不对怎么办?
  3. Visual stuidio 快捷键的修改、查询
  4. Angular Schematics 学习笔记
  5. Exchange 2016部署实施案例篇-01.架构设计篇(上)
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 11丨产品销售分析 III【难度中等】
  7. ASP.NET连接SQL、Access、Excel数据库(三)——工厂模式
  8. html 模糊匹配,CSS 属性选择器 模糊匹配的使用
  9. 【博主推荐】HTML5响应式手机WEB(附源码)
  10. 专业版谷歌地球地图永久版带手机版App
  11. python vim插件_有哪些好用到爆的vim插件?
  12. 导航栏渐变方案收录一
  13. 【python教程入门学习】拒绝反爬虫!教你搞定爬虫验证码
  14. python设置字体_python操作word设置字体
  15. Linux内核网络:实现与理论--介绍
  16. 车辆保险详细说明举例介绍
  17. Linux内核版本主要有,Linux内核版本号主要有几部分组成? 各代表什么含义?
  18. BI工具是什么,有什么用,怎么用?
  19. 在Linux中利用backtrace信息解决程序崩溃问题
  20. golang扫描端口

热门文章

  1. Arachni安装及网站扫描
  2. 【 地图系列 】 旋转地球仪
  3. 如何选择合适的触摸芯片以及触摸芯片的发展趋势
  4. 用计算机解决问题 评课稿,解决问题评课稿
  5. 优雅的玩转Fast-DDS
  6. 【满分】【华为OD机试真题2023 JAVAJS】寻找相似单词
  7. 免费WordPress主题-图片摄影作品展示自适应主题带手机端
  8. chrome代理插件下载安装
  9. 第18章 请勿陷入对技术的狂热之中
  10. 基于C3D网络的视频分析与动作识别