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

article/2025/10/16 21:57:34

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

关于微信公众号中的订阅号和服务的区别这里不多加讨论,网上有很多资源可以搜到,这里直接进入正题,如果是个人开发者,这里建议使用测试号进行开发学习,测试号的权限要比个人订阅号要多的多,而本篇博客也是基于测试号进行开发的。

 

在开始微信号开发之前需要准备好两样东西,1、需要一个测试号,2、需要一个拥有域名的服务器,下面将分别介绍怎样获取这两样东西。

1、测试号

点击此链接测试号登录可直接用微信扫一扫注册一个测试号,相应的界面如下所示

 

进入测试号界面之后可以获得一些开发所需要的东西,以及关注者列表和开发权限等,如下所示

 

2、服务器

微信号开发需要一个第三方服务器来和微信服务器沟通,这里我使用的是一个百度云的BAE虚拟主机,理由有以下几点:

1、性价比高,该主机一天只需要2毛钱,而且不限制充值金额,如果你只是用来学习微信公众号开发,而且预计一个月学会的话,那么你只需要充值6元钱就可以,相比其他最低充值一年的平台相比,要划算的多。

2、可以免去购买域名的费用,该BAE可免费设置一个二级域名,可用于微信公众号开发,并且数据库的使用也是免费的。

3、该BAE的代码可以使用git或svn管理,我们在本地写好代码之后,直接push上去就可以了,相当方便,而且可以设置快捷发布,提交代码当即发布。

缺点就是它的日志系统不够完善,不过这个缺点很容易解决,我们可以自己打印信息到文件里,然后读取出来,下面将会介绍到。

 

百度云网址是:https://login.bce.baidu.com/?account=,登录之后,点击BAE后如图

 

好了,这样我们就准备好了微信开发的两个必备的东西。接下来就要配置接口了。

 

3、配置接口

上面进入测试号界面的时候我们可以看到有一个接口配置信息的模块,如下所示

 

 

这里的URL就是填写以上BAE中的域名就好了,当然了要注意加上http://前缀,以后用户发送的消息都会经过微信服务器转发到该接口。Token可以随便填写一些东西,这里填写了weixin。关于Token的用途下面会讲到。

好了,现在先别急着点击提交,因为我们还没有在URL指向的服务器里编写任何的代码,还不能正确响应微信服务器的请求。

 

在编写任何的代码之前,我先说一下本博客的一些习惯,为了便于理解,我会先将文件的结构和代码先贴出来,然后才解释具体代码的含义,这样如果熟悉的人就可以直接跳过该部分了。

 

文件结构如下

 

index.php用于处理消息。

output_log.php和output_query.php分别用来输出post过来的数据和请求的查询字符串,Utils.php主要用来将数据输出到文件中,看了下面的代码你就明白了,其实相当简单,这三个东西是我用来调试用的,相比起微信公众号提供的在线调试接口而言(需要设置一堆的信息),我觉得这样更加简单。

 

Utils.php,提供了两个函数,traceHttp()将请求的时间、远程主机地址和查询字符串输出到query.xml文件中。logger()将类型、时间和post数据输出到log.xml中。

<?php
class Utils
{public static function traceHttp(){$content = date('Y-m-d H:i:s')."\n\rremote_ip:".$_SERVER["REMOTE_ADDR"]."\n\r".$_SERVER["QUERY_STRING"]."\n\r\n\r";$max_size = 1000;$log_filename = "./query.xml";if (file_exists($log_filename) and (abs(filesize($log_filename))) > $max_size){unlink($log_filename);}else {}file_put_contents($log_filename, $content, FILE_APPEND);}public static function logger($log_content, $type = '用户'){$max_size = 3000;$log_filename = "./log.xml";if (file_exists($log_filename) and (abs(filesize($log_filename)) >$max_size)) {unlink($log_filename);}file_put_contents($log_filename, "$type  ".date('Y-m-d H:i:s')."\n\r".$log_content."\n\r",FILE_APPEND);}
}

 

output_query.php,输出query.xml的内容

<?php
@header('Content-type: text/plain;charset=UTF-8');
$filepath = './query.xml';
readfile($filepath);


output_log.php,输出log.xml的内容。

<?php
@header('Content-type: text/plain;charset=UTF-8');
$filepath = './log.xml';
readfile($filepath);


是不是非常简单,然后我们开始写处理消息index.php

<?php
//设置时区
date_default_timezone_set("Asia/Shanghai");
//定义TOKEN常量,这里的"weixin"就是在公众号里配置的TOKEN
define("TOKEN", "weixin");require_once("Utils.php");
//打印请求的URL查询字符串到query.xml
Utils::traceHttp();$wechatObj = new wechatCallBackapiTest();
/*** 如果有"echostr"字段,说明是一个URL验证请求,* 否则是微信用户发过来的信息*/
if (isset($_GET["echostr"])){$wechatObj->valid();
}else {$wechatObj->responseMsg();
}class wechatCallBackapiTest
{/*** 用于微信公众号里填写的URL的验证,* 如果合格则直接将"echostr"字段原样返回*/public function valid(){$echoStr = $_GET["echostr"];if ($this->checkSignature()){echo $echoStr;exit;}}/*** 用于验证是否是微信服务器发来的消息* @return bool*/private function checkSignature(){$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$token = TOKEN;$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr);$tmpStr = implode($tmpArr);$tmpStr = sha1($tmpStr);if ($tmpStr == $signature){return true;}else {return false;}}/*** 响应用户发来的消息*/public function responseMsg(){//获取post过来的数据,它一个XML格式的数据$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//将数据打印到log.xmlUtils::logger($postStr);if (!empty($postStr)){//将XML数据解析为一个对象$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType);//消息类型分离switch($RX_TYPE){case "event":$result = $this->receiveEvent($postObj);break;default:$result = "unknow msg type:".$RX_TYPE;break;}//打印输出的数据到log.xmlUtils::logger($result, '公众号');echo $result;}else{echo "";exit;}}/*** 接收事件消息*/private function receiveEvent($object){switch ($object->Event){//关注公众号事件case "subscribe":$content = "欢迎关注微微一笑很倾城";break;default:$content = "";break;}$result = $this->transmitText($object, $content);return $result;}/*** 回复文本消息*/private function transmitText($object, $content){$xmlTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime><![CDATA[%s]]></CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content>
</xml>";$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);return $result;}
}


这几个文件写好之后,直接通过git push到BAE上,如果设置了快捷发布,过1、2秒钟就会自动发布了,状态里面会显示绿色的"正常",如果没有设置快捷发布,上传代码后需要手动点击右边的快捷发布按钮。

 

这时我们就可以点击测试号界面里面的那个提交按钮了。

 

 

如果配置正确,则会提示配置成功。

 

4、调试

在浏览器地址栏上输入,xxx/output_query.php,xxx是你的域名。则会出现你点击提交后发送过来的请求,类似如下

 

 

可以看到该查询字符串有4个字段

  • signature:微信加密签名
  • echostr:随机字符串
  • timestamp:时间戳
  • nonce:随机数

只有在验证URL的时候查询字符串中才会有“echostr”这个字段,验证的方法是

  1. 将token、timestamp、nonce三个参数进行字典序排序
  2. 将三个参数字符串拼接成一个字符串进行sha1加密
  3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

 

验证通过之后,我们可以用微信扫一扫,扫描测试号里面的公众号二维码,关注该公众号,关注之后,公众号列表会显示出关注者的列表。

 

此时微信应该会回复一条文本消息,也就是以上在index.php中设置的“欢迎关注XXX”。

 

这时我们重新刷新一下xxx/output_query.php,发现没有“echostr”这个字段了,因为这个是用户发来的消息,而不是验证URL的消息。多出来的openid字段是用户的微信号,如果采用的是加密模式,还会有encrypt_type和msg_signature等字段。测试号只有明文模式。

接着我们重新打开一个标签,访问XXX/log.xml,查看发送的post数据,下面是一个关注公众号的事件,和我们返回给微信的XML数据。

 

现在不比纠结这些数据格式的问题,以后我们会提到,这样我们的微信公众号开发就准备好了,记得把这两个日志URL保存为浏览器的标签方便下次访问,以后调试只要F5一下就可以了,是不是比微信提供的在线调试容易多了。

注意:必须在5秒内响应微信的服务器,否则会导致重传或者报错

 

下一章我们将会尝试微信的基本消息接口,那时候就会理解这些数据结构了。

相关博客

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

微信公众号开发(二)基础接口

微信公众号开发(三)获取access_token

微信公众号开发(四)自定义菜单

微信公众号开发(五)个性化菜单

微信公众号开发(六)素材管理

微信公众号开发(七)发送客服消息

微信公众号开发(八)用户管理

微信公众号开发(九)群发消息接口

微信公众号开发(十)模板消息

微信公众号开发(十一)生成带参数二维码

微信公众号开发(十二)OAuth2.0网页授权


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

相关文章

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

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; 第一步…

Tomcat闪退问题解决

概述 在使用Tomcat进行部署应用时&#xff0c;有时候会遇到闪退的情况&#xff0c;如下图示&#xff1a; 闪退原因&#xff1a; 1.内存配置错误&#xff1b; 2.参数配置错误&#xff1b; 3.系统内存不足。 二、解决方案 先在记事本中打开startup.bat&#xff0c;找到最后一…

tomcat闪退

原因&#xff1a;①首先考虑端口占用问题 ②环境变量问题 startup.bat 文件默认读取的是系统配置的环境变量 可以修改其环境变量 (1) startup.bat开头加上两句话 SET JAVA_HOMEC:\Program Files\Java\jdk1.8.0_60//这里是jdk的安装目录       (2)同上面一样的打开shutdow…

解决Tomcat闪退问题

第一次使用Tomcat的小伙伴可能会出现闪退问题。就是双击startup.bat会快速弹出命令窗口&#xff0c;然后就没了&#xff0c;Tomcat也没启动。 解决方案&#xff1a; 1.检查是否安装jdk&#xff08;一般都安装了&#xff09; 2.检查Tomcat的版本和jdk是否匹配&#xff0c;比如…

tomcat闪退错误排查

大家是不是有这样一个问题。每次tomcat闪退不知道错误在哪里&#xff1f;然后只能疯狂的百度&#xff0c;去猜测错误的可能性。 也许能够百度解决问题&#xff0c;也许百度了一天问题还是没有解决。 今天我们来通过修改tomcat的配置&#xff0c;来让tomcat暂停闪退&#xff0c;…

tomcat闪退原因分析

tomcat闪退原因分析 tomcat闪退原因分析第一种端口被占用第二种jdk不匹配第三种运行环境配置分析tomcat环境变量配置tomcat闪退总结 tomcat闪退原因分析 在学习javaweb阶段&#xff0c;作为学员&#xff0c;我们一般使用的是tomcat最为我们的学习服务器&#xff0c;tomcat它是…

tomcat闪退问题

一、 可以在tomcat的bin目录下的startup.bat文件夹&#xff0c;最上放方加上 tomcat位置配置和jdk位置的配置&#xff08;jdk的路劲参考自己环境变量里配置的路劲&#xff09;&#xff1b; set JAVA_HOMED:\jdk set CATALINA_HOMED:\task_core_tomcat9022 二、可以在tomcat的b…

c dbhelper类下载mysql_[C#]实现任何数据库类型的DbHelper帮助类

本文章为原创内容&#xff0c;如需转载&#xff0c;请注明作者及出处&#xff0c;谢谢&#xff01; 一、在System.Data.Common命名空间下&#xff0c;存在这样的一个类&#xff1a; // //摘要://表示一组方法&#xff0c;这些方法用于创建提供程序对数据源类的实现的实例。 pub…