以下是使用 PHP 重写的微信公众号订阅事件回复的示例代码。这个代码实现了用户订阅(关注)公众号时,自动回复一条欢迎消息。


PHP 实现代码

<?php
// 微信公众平台的Token
define("TOKEN", "your_token"); // 验证消息的确来自微信服务器
function checkSignature() {
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"]; $tmpArr = array(TOKEN, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr); if ($tmpStr == $signature) {
return true;
} else {
return false;
}
} // 处理用户订阅事件并回复消息
function responseMsg() {
// 获取POST数据
$postStr = file_get_contents("php://input"); // 如果数据不为空
if (!empty($postStr)) {
// 解析XML数据
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $msgType = $postObj->MsgType; // 消息类型
$event = $postObj->Event; // 事件类型 // 如果是订阅事件
if ($msgType == "event" && $event == "subscribe") {
$fromUser = $postObj->FromUserName; // 用户OpenID
$toUser = $postObj->ToUserName; // 公众号原始ID // 回复的文本内容
$content = "欢迎关注我们的公众号!"; // 构造回复的XML消息
$response = "<xml>
<ToUserName><![CDATA[$fromUser]]></ToUserName>
<FromUserName><![CDATA[$toUser]]></FromUserName>
<CreateTime>" . time() . "</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[$content]]></Content>
</xml>";
echo $response;
}
} else {
echo "";
exit;
}
} // 主逻辑
if (checkSignature()) {
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
// 验证服务器地址有效性
echo $_GET['echostr'];
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 处理用户消息
responseMsg();
}
} else {
echo "Invalid signature.";
}
?>

代码说明

  1. Token 配置

    • TOKEN 是你在微信公众号后台配置的 Token,需要与代码中的 define("TOKEN", "your_token"); 一致。
  2. 签名验证

    • checkSignature() 函数用于验证消息是否来自微信服务器。
    • 微信服务器会发送 signaturetimestampnonceechostr 参数,通过校验签名确认请求的合法性。
  3. 处理订阅事件

    • 当用户关注公众号时,微信服务器会发送一个 XML 格式的事件消息。
    • 解析 XML 数据,判断 MsgType 是否为 event,且 Event 是否为 subscribe
    • 如果是订阅事件,构造一个文本消息回复用户。
  4. 回复消息

    • 回复的消息是一个 XML 格式的文本消息,包含用户的 OpenID、公众号的原始 ID、消息类型和内容。
  5. GET 和 POST 请求处理

    • GET 请求用于验证服务器地址有效性。
    • POST 请求用于处理用户消息和事件。

部署与测试

  1. 将代码上传到你的服务器,确保可以通过公网访问。
  2. 在微信公众号后台配置服务器地址(URL)和 Token。
    • URL 是你的服务器地址,例如:https://yourdomain.com/wechat.php
    • Token 需要与代码中的 TOKEN 一致。
  3. 关注你的公众号,测试是否能收到欢迎消息。

注意事项

  1. 服务器响应时间

    • 微信服务器会在 5 秒内等待响应,如果超时会重试 3 次。因此,确保你的服务器能够快速处理请求。
  2. 安全性

    • 确保代码中的 Token 与微信公众号后台配置一致,避免被恶意请求攻击。
  3. 日志记录

    • 可以在代码中添加日志记录功能,方便调试和排查问题。

通过以上代码,你可以实现微信公众号的订阅事件回复功能。如果有更复杂的需求(如图文消息、菜单事件等),可以在此基础上扩展。

deepseek:如何用php写微信公众号订阅回复事件的更多相关文章

  1. 用Markdown写微信公众号文章

    目前微信公众号的编辑器是不支持Markdown语法的,那怎么办呢? 有一款叫Markdown Here的插件可以解决这个问题(支持Chrome.Firefox.Safari). 官方网站:http:/ ...

  2. vue 仿写微信公众号自定义菜单

    先看效果图 代码参考 <template> <div> <!-- 公众号设置 --> <el-col :span="24" style=& ...

  3. 微信公众号订阅号以及服务号通过网页授权获取用户openid方法

    微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 官方流程 网页授权流程分为四步: 1.引导用户 ...

  4. Java获取微信公众号新增用户事件

    一.新建项目工程 新建一个spring项目 填写 Group 和 Artifact 信息 这步可以直接跳过,后面再按需导入 选择工程地址 二.配置 pom.xml <dependencies&g ...

  5. ios微信公众号分享回调事件

    IOS手机在分享成功后,回调事件无法正常执行,在回调方法里面加入: setTimeout(function () { //todo }, ); 例如: //分享 Share({ title: &quo ...

  6. C#微信公众号/订阅号开发 接口源码

    using System; using System.Web; using System.IO; using System.Text; using System.Web.Security; using ...

  7. 微信公众号开发(一)--验证服务器地址的Java实现

    现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...

  8. 小技巧,把Markdown文本发布到微信公众号文章

    估计很多人都是这样,平常工作在github,等到有成果要发布,又要写微信公众号. github用Markdown,微信公众号,至少截止今天,还是沿用富文本的方式.不是说富文本不好,但每次精心撰写的内容 ...

  9. 微信公众号DOM的一个坑

    最近不知道写什么,node的源码有点不知道怎么入手,还在努力学习C++中…… 在写微信公众号的时候遇到了一个小bug,有一个tab栏,在开发者工具.IOS手机上都OK,但是一到我的小米note上就GG ...

  10. Django实现微信公众号简单自动回复

    在上篇博客阿里云部署django实现公网访问已经实现了了django在阿里云上的部署,接下来记录django实现微信公众号简单回复的开发过程,以方便日后查看 内容概要: (1)微信公众号声请 (2)微 ...

随机推荐

  1. ng-alain: 配置开发环境

    配置 ng-alain 开发环境 安装 1. Yarn 官方文档实际上是基于 Yarn 1 的,请从 Yarn 1 开始.在创建项目之后,可以升级到 Yarn 3. 注意:直接通过 npm 安装 ya ...

  2. Postgresql使用触发器实现同步插入两张表

    在有一个陈旧的系统的情况下,如果升级API可以优先使用微服务的形式,将数据库进行独立拆分,将原来的数据库原原本本地固定在旧系统中,然后在独立的微服务中运行与部署新系统. 如果原有的数据需要在更换结构的 ...

  3. 【NAS】绿联NAS+alist+lsky+natfrp 实现图床服务

    alist 安装与配置 值得一提的就是,映射的data是配置相关的,让绿联直接默认路径就行,不需要手动设置 但是文件保存位置的映射的话,为了方便,可以单独映射到一个方便访问的文件夹,(但是要注意下权限 ...

  4. archlinux 显卡驱动

    https://arch.icekylin.online/guide/rookie/graphic-driver.html archlinux 显卡驱动# 接天莲叶无穷碧,映日荷花别样红# 近年来,a ...

  5. Qt编写的项目作品6-可视化大屏电子看板系统

    一.功能特点 采用分层设计,整体总共分三级界面,一级界面是整体布局,二级界面是单个功能模块,三级界面是单个控件. 子控件包括饼图.圆环图.曲线图.柱状图.柱状分组图.横向柱状图.横向柱状分组图.合格率 ...

  6. 综述😋Security and Privacy Challenges of ✌Large Language Models A Survey

  7. VS2008新建MFC程序时提示:当前页面的脚本发送错误 不是有效的Win32应用程序的解决办法

    错误现象: 解决方案: 1.根据错误信息中的url,找到对应文件夹下的htm文件 2.使用notepad++打开default.htm文件,找到错误提示地方,注释掉其中两句语句,如433和434行所示 ...

  8. TagHelper中获取当前Url

    在自定义TagHelper时,我们无法通过TagHelperContext 和 TagHelperOutput 获取到当前路由的信息,我们需要添加注入ViewContext [HtmlAttribut ...

  9. [megatron代码阅读] 1. 初始化和组网

    以pretrain_gpt.py为例, 看megatron的整体逻辑. 本章主要包括megatron初始化相关逻辑, 核心函数为initialize_megatron, setup_model_and ...

  10. 直播预览层添加滤镜效果(CIFilter使用场景)

    直播预览层添加滤镜效果 原理,在显示之前,提前对图片进行滤镜处理,把处理后的图片展示出来就好了. CIFiter(滤镜类):给图片添加特殊效果(模糊,高亮等等). CIFiter滤镜分类(一个滤镜可能 ...