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

article/2025/10/16 19:39:11

文章目录

  • 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

欢迎大家关注,里面有很多资源分享:
这里写图片描述


http://chatgpt.dhexx.cn/article/BpQZg0bo.shtml

相关文章

python 微信公众号开发[1] 后台服务器端配置与公众号开发配置

更新时间&#xff1a;2020年3月7日 微信公众号开发的硬件必备条件&#xff1a;&#xff08;1&#xff09;申请一个公众号 &#xff08;2&#xff09;有公网ip的服务器&#xff08;最好是阿里云&#xff0c;腾讯云等的云服务器&#xff09;&#xff08;3&#xff09;解析到&…

微信小程序微信服务号开发微信公众平台开发前端开发框架

1、Frozen UI 手Q出品&#xff0c;组件更丰富&#xff0c;视觉舒适度也不错&#xff0c;适合我这种前端较生疏&#xff0c;需要开箱即用的程序员。 推荐度&#xff1a;5星 演示地址&#xff1a;FrozenUI Demo 2、WeUI 官方出品&#xff0c;情怀满满&#xff0c;但是组件不够用。…

微信公众号开发流程指南

微信公众号开发流程指南 一.物料准备二.开发须知0.接入验证1.消息类型概括(MsgType)2.申请服务号的原因为账号类型所支持功能不同,职能不同3.当开启服务器配置后,公众号的原始菜单将会失效, 会以自定义菜单为准4.如下文介绍Api中出现Token字样, 则统一为通过AppId和AppSecret获…

微信公众号开发

文章目录 一、微信公众号简介二、注册/登录微信公众号三、功能介绍1、编辑模式&#xff08;个人开发者&#xff0c;无需服务器&#xff09;2、开发模式 四、实战开发1、配置服务器2、模块化 五、获取 access_token1、access_token 是什么&#xff1f;2、获取 access_token 功能…

公众号开发配置,服务号对接第三方服务器配置方法

很多公司企业在注册服务号后&#xff0c;通常需要对接第三方的开发平台&#xff0c;进行一些功能的完善补充。 市面上第三方平台非常之多&#xff0c;但是因微信官方限制&#xff0c;所需要的配置总结下来就这么几点&#xff0c;下面给大家讲解下配置的要点&#xff1a; 一、…

公众号开发

1.本地调试:打开微信开发者工具——》微信开发者工具选项——》更换开发模式——》公众号网页调试 2.使用 http://127.0.0.1:8080 本地调试会 the permission value is offline verifying 解决方法:先在输入框输入 http://demo.open.weixin.qq.com/jssdk&#xff0c;再输入你之…

微信公众号开发(一)服务器及接口的配置

微信公众号开发&#xff08;一&#xff09;服务器及接口的配置 关于微信公众号中的订阅号和服务的区别这里不多加讨论&#xff0c;网上有很多资源可以搜到&#xff0c;这里直接进入正题&#xff0c;如果是个人开发者&#xff0c;这里建议使用测试号进行开发学习&#xff0c;测…

微信公众号开发相关流程及功能介绍

1. 开发前准备 1.1 注册微信公众平台账号 进入的网址&#xff1a;https://mp.weixin.qq.com。 测试号&#xff08;网址&#xff1a;https://mp.weixin.qq.com/debug/cgi-bin/sandbox?tsandbox/login&#xff09;&#xff0c;用户在开发之前可以通过测试号快速测试开发&#…

微信小程序开发 公众号/服务号 方法

微信小程序嵌入公众号/服务号方法 1.公众号开发方法 先去微信公众平台开启公众号选项 然后在页面中加入组件 <official-account bindload"bindload" class"official-account"></official-account> 组件细节 可查 官网文档 文档地址 本地调试…

微信服务号开发说明:测试号申请、自定义菜单添加第三方连接

微信服务号开发方式多种多样&#xff0c;本文对接触过的一种微信服务号开发模式进行记录&#xff0c;作为今后参考的依据。 1.开发模式 本文描述的开发模式如下&#xff1a; 客户或者市场部等申请服务号。开发部开发并发布移动端服务的测试版本至互联网上。使用测试号进行微…

微信公众平台-微信服务号开发

文章目录 背景:一、微信各个平台介绍二、公众平台介绍三、开发前准备四、服务器配置五、服务器验证六、消息接收七、客服消息八、获取素材九、相关工具十、最终效果展示总结 背景: 近期接到了涉及微信开放平台和微信公众平台相关的开发需求&#xff0c;开发过程中踩了许多坑&a…

启动Tomcat闪退的问题

之前启动一直没有问题&#xff0c;今天配置conf/server.xml文件&#xff0c;把我要打开的文件更改了一下就发现它要闪退了&#xff01;然后我去百度搜它闪退的原因&#xff0c;都说是环境变量没有配置好&#xff0c;可是我的是好的啊 然后其实&#xff01;&#xff01;&#x…

windows本地启动tomcat闪退

da开cmd&#xff0c; 进入tomcat所在目录的bin目录&#xff1a; 执行startup.bat 查看设置的环境变量是否正确&#xff1b;如果不正确则在windows中设置正确的相关环境变量即可&#xff1b; 转载于:https://www.cnblogs.com/YuyuanNo1/p/10341340.html

tomcat 闪退/一闪而过 问题

结论 去官网重新下载对应JDK的新版本tomcat&#xff0c;安装解压即可使用。无需配置路径。 资源 tomcat官网下载地址 JDK对应版本 实际经验 原来装好能用的tomcat&#xff0c;上课打开就闪退。 各种查bug找的解决方案都没用&#xff0c;除开最常见的尝试配环境变量和路径…

Tomcat闪退解决方案

问题 Tomcat启动后闪退, tomcat可以通过命令行startup或直接双击startup.bat执行 通常发生闪退时,我们可以尝试在命令行中执行一下startup命令 出现图片上的情况请点击这里 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 如果执行命令行没有明确信息提示,如下图这种…

tomcat闪退问题一些解决办法

1.找不到环境变量 这应该是大多数人遇到的问题&#xff0c;网上有很多配置教程就不多说了 我一开始也是这个问题然后配置完jdk和jre后&#xff0c;发现根本没有jre&#xff0c;然后在网上找了解决办法把jre弄出来了&#xff0c;这个也自行百度&#xff0c;之后依旧还在这个界面…

Tomcat 闪退问题

方法一&#xff1a;应为tomcat是依赖于jdk环境&#xff0c;首先查看环境变量是否配置 然后cmd中查看8080有没有被占用&#xff0c;找出占用8080端口的进程 发现8080端口被占用了&#xff0c;后发现是IDEA启动了tomcat. 关掉idea&#xff0c;手动启startup.bat &#xff0c;成功…

tomcat闪退问题解决办法

免安装的tomcat双击startup.bat后&#xff0c;启动窗口一闪而过&#xff0c;而且tomcat服务未启动。 原因是&#xff1a;在启动tomcat是&#xff0c;需要读取环境变量和配置信息&#xff0c;缺少了这些信息&#xff0c;就不能登记环境变量&#xff0c;导致了tomcat的闪退。 解…

解决tomcat闪退问题,亲测有效~

第一步&#xff1a;设置CATALINA_HOME的值&#xff0c;如下所示&#xff1a; 第二步&#xff1a;在path中添加CATALINA_HOME;,注意分号不要丢掉&#xff0c;如下所示&#xff1a; 重新启动tomcat&#xff0c;如果还是一闪而退&#xff0c;可以试试下述方法&#xff1a; 第一步…