PHP微信定制开发-消息的识别和消息工具类的封装

企业微信自建应用通过PHP进行收发消息 我们在企业微信的使用中肯定会用到自建应用,自建应用使用最多的功能就是消息的推送,使用的场景也有很多,例如在公司内网的程序上,想要监控员工在什么时候做了一些敏感操作,可以在进行操作时候推送一条消息到自建应用上。同样包括了3个通过GET方式传递的参数,消息体签名(msg_signature),时间戳(timestamp)以及随机数字串(nonce),还有一个POST请求的数据,需要进行xml解析,并将。企业的接收消息服务器接收到验证请求后,需要作出正确的响应才能通过URL验证。方法来解析返回的XML。... 阅读详情

对于消息管理,服务器被动回复消息是比较重要且需要好好掌握的知识点,在这个模块中我们需要接收到用户发送过来的消息,并识别出消息类型,最后把识别结果以文本消息的形式响应给用户,下面是文档地址

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

从文档中我们可以看出通过MsgType来判断消息类型,通过Content取得发送过来的消息(仅文本),为了把消息响应给用户方便开发我们需要先写一个工具类用来处理消息,因消息体的格式比较统一,这里的工具类封装对于xml选用最简单的方式,类似simplexml就不适用了,有兴趣的自己尝试

一 消息工具类的封装

<?php
namespace  util;


define("TEXTMESSAGE","text");
define("NEWSMESSAGE","news");

/** 消息工具类
 * @author chenwill2
 *
 */
class MessageUtil{
    
    /** 生成文本消息字符串
     * @param $toUserName
     * @param $fromUserName
     * @param $content
     * @return string
     */
    function textMessageToXml($toUserName,$fromUserName,$content="你发送的是文本消息"){
        $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        <FuncFlag>0</FuncFlag>
                        </xml>";
        $resultStr=sprintf($textTpl,$toUserName,$fromUserName,time(),TEXTMESSAGE,$content);
       
        return $resultStr;
    }
    
    /** 生成图文消息字符串
     * @param $toUserName
     * @param $fromUserName
     * @param $article
     * @return string
     */
    function articleMessageToXml($toUserName,$fromUserName,$article){
        $childArticle="";
        foreach ($article as $item){
            $child="<item>
                        <Title><![CDATA[%s]]></Title> 
                        <Description><![CDATA[%s]]></Description>
                        <PicUrl><![CDATA[%s]]></PicUrl>
                        <Url><![CDATA[%s]]></Url>
                     </item>";
            $childInfo=sprintf($child,$item["title"],$item["description"],$item["picurl"],$item["url"]);
            $childArticle.=$childInfo;
        }
        
        $textTpl = "<xml>
                       <ToUserName><![CDATA[%s]]></ToUserName>
                       <FromUserName><![CDATA[%s]]></FromUserName>
                       <CreateTime>%s</CreateTime>
                       <MsgType><![CDATA[%s]]></MsgType>
                       <ArticleCount>%s</ArticleCount>
                       <Articles>
                          $childArticle
                        </Articles>
                      </xml>";
                          
        $resultStr=sprintf($textTpl,$toUserName,$fromUserName,time(),NEWSMESSAGE,count($article));
      
        return $resultStr;
    }
   
}

?>

这里只封装了2种比较常用的消息分别是文本消息、图文消息;其他的如有需要可以自己编写,反正封装方式都差不多

二  消息类型识别并回复类型结果给用户

<?php
namespace handler;

include_once __DIR__.DIRECTORY_SEPARATOR."util".DIRECTORY_SEPARATOR."MessageUtil.php";


define("TOKEN", "weixinCourse");

// 1 判断请求方法,get请求一般为消息验证,post为其他消息交互
// 2 验证signature是否正确(消息来自微信服务器)
$handler = new \handler\WeixinHandler();

$reqMethod = strtolower($_SERVER["REQUEST_METHOD"]);
if ("get" == $reqMethod && !empty($_GET["echostr"])) {
    if ($handler->isValid()) {
        $echostr = $_GET["echostr"];
        echo $echostr;
        exit();
    }
} else {
    //判断消息类型,返回"你发送的是xxx消息"
    $handler->responseMessage();
}

class WeixinHandler
{

    function checkSignature()
    {
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $tmpArr = array(
            TOKEN,
            $timestamp,
            $nonce
        );
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

        if ($tmpStr) {
            return $tmpStr;
        } else {
            return "";
        }
    }

    function isValid()
    {
        $signature = $_GET["signature"];
        if ($signature == $this->checkSignature()) {
            return true;
        } else {
            return false;
        }
    }
    function responseMessage(){
        $msgUtil = new \util\MessageUtil();
        $defaultMsgType="text";
        //从请求数据获取FromUserName和ToUserName以及消息类型
        $postStr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");
        
        if(!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            //发送方账号(openId)
            $fromUsername = $postObj->FromUserName;
            //开发者微信号
            $toUsername = $postObj->ToUserName;
            //消息类型
            $MsgType = strtolower($postObj->MsgType);
            //消息内容
            $keyword = trim($postObj->Content);
          
            
            $msgUtil = new \util\MessageUtil();
            $typeResult="";
            $resultStr="";
           
            if("text"==$MsgType){
               $typeResult="你发送的是文本消息";
            }else if("image"==$MsgType){
                $typeResult="你发送的是图片消息";
            }else if("voice"==$MsgType){
                $typeResult="你发送的是语音消息";
            }else if("video"==$MsgType){
                $typeResult="你发送的是视频消息";
            }else if("shortvideo"==$MsgType){
                $typeResult="你发送的是短视频消息";
            }else if("location"==$MsgType){
                $typeResult="你发送的是地理位置消息";
            }else if("link"==$MsgType){
                $typeResult="你发送的是链接消息";
            }else if("event"==$MsgType){
                //事件推送处理
                $typeResult="事件推送消息";
            }else{
                $typeResult="你发送的是其他类型的消息";
            }
            
            if("text"==$defaultMsgType){
                $resultStr=$msgUtil->textMessageToXml($fromUsername, $toUsername,$typeResult);
            }
           
            echo $resultStr;
           
        }else{
           echo "";
           exit;
       }
    
    }
}

?>

需要注意的是如果使用名称空间,new一个类的时候要注意带上名称空间,否则会出现错误

 

到此为止微信就能正常响应消息给用户了,对于事件推送这里没有做详细区分,后面会针对这块分享几篇博客给大家,下次分享的内容是 微信菜单接口和微信根据城市调用百度API查天气预报的小例子

QClaw:基于微信IPC的本地化AI Agent封装工具 AI Agent是让大模型具备自主执行能力的关键范式,其核心在于任务编排、工具调用与环境交互。然而,开源Agent框架如OpenClaw虽功能强大,却因依赖命令行、环境配置复杂、权限管理松散而难以落地办公场景。QClaw并非新模型或新框架,而是面向终端用户的轻量级本地封装工具——它通过复用微信PC客户端的本地IPC通信机制,绕过开放平台限制,实现零配置、双击即用、微信直控;结合模型路由层与三重安全沙箱,兼顾灵活性与可控性。本文聚焦QClaw的技术本质:如何以操作系统级进程通信为支点,撬动AI Agent在真 阅读详情

相关推荐

基于PHP的微信助手系统(含微信机器人)Web管理平台实战项目

微信助手采用典型的四层架构模式:前端交互层负责用户操作入口与可视化控制,业务逻辑层封装核心自动化流程,数据存储层基于MySQL持久化消息与配置信息,外部接口层实现与微信Web协议的通信交互。各层级通过RESTful API进行解耦协作,提升系统的可维护性与扩展性。

weixin_42168902的博客 1242

php微信一次性订阅消息demo,微信一次性订阅消息

开发者可以通过一次性订阅消息授权让微信用户授权第三方移动应用(接入说明)或公众号,获得发送一次订阅消息给到授权微信用户的机会。授权微信用户可以不需要关注公众号。微信用户每授权一次,开发者可获得一次下发消息的权限。对于已关注公众号的,消息将下发到公众号会话;未关注公众号的,将下发到服务通知。本篇文章主要讨论公众号1、确认是否有权限已认证的公众号即有权限,可登陆公众平台在接口权限列表处查看(如下图)。...

weixin_34025386的博客 546

thinkphp对接微信模板消息封装类(完美封装)

完美封装,在控制器调用定义就行

微信公众号判断用户发送类型php,php版微信公众平台接口参数调试实现判断用户行为的方法...

本文实例讲述了php版微信公众平台接口参数调试实现判断用户行为的方法。分享给大家供大家参考,具体如下:微信开发的时候,发现有个重要的变量$postObj,获得了一个xml结构装入的对象里因为用户发来的事件,之前只知道用户发送一个消息,我进行处理.今天要弄个用户订阅就给推送一个消息的功能,却发现不知道如何判断用户是订阅的操作,还是取消订阅,还是发消息,代码如下:?发现$postStr是之前没有封装的...

weixin_42530458的博客 258

一款完整的php微信开发类

一款完整的php微信开发类,一款完整的php微信开发类,一款完整的php微信开发类

PHP发送SMS消息的类

手机短信sms接入web页面php源代码类,全英文版

PHP微信SDK——Zebra-Wechat

PHP微信SDK——Zebra-Wechat

始终不够 7088

微信开发者工具

电脑端开发微信平台程序使用的客户端,可以模拟微信小程序和公众号等

remove-ai-watermarks 视频 SynthID 去除路径的质量研究:从 512px/12fps 认证画像到质量杠杆的量化拆解

> 本篇技术指南以 remove-ai-watermarks 仓库的研究档案 [docs/video-synthid-quality-research.md](https://link.gitcode.com/i/39e0cc6ffae9c33f5636b0e3deb6ecdd) 为主体骨架,结合 [video_invisible.py](https://link.gitcode.com/i/bf

gitblog_00448的博客 1040

微信公众平台各接口封装

自己总结的微信接口连接函数,适用于初学者。

php版微信开发之接收消息,自动判断及回复相应消息的方法

主要介绍了php版微信开发之接收消息,自动判断及回复相应消息的方法,涉及基于微信消息处理接口的调用相关操作技巧,需要的朋友可以参考下

PHP实现在线微信客服源码系统消息的实时推送与处理

本文介绍了一套基于PHP原创开发的智能客服系统解决方案。系统通过对接企业微信接口实现消息接收,采用三层语义引擎(精确匹配、语义相似度、AI生成)处理用户咨询,支持多媒体消息智能分析。利用Redis保持对话上下文,实现多轮交互,并提供多样化回复格式和人工转接功能。该系统具有代码安全可控、部署便捷、扩展灵活等优势,适用于电商咨询、技术支持等场景。该方案完整实现了微信客服消息的实时推送与处理流程,基于ThinkPHP6开发,可帮助企业快速搭建智能客服体系。

春哥开源研究所的博客 239

PHP微信开发之模板消息回复

微信公众平台上,有个模板消息回复接口:可以用来实现回复特定的消息—–比如用户下了订单之后,回复给用户您的订单正在处理中…比如下面这张图: 用户进行了一些操作之后,服务号能够返回特定的消息—-这就是模板消息。 要实现模板消息的回复,你的公众号必须是经过微信认证的,如果是个人的订阅号,暂时不支持微信认证。不过也不影响做测试—–你可以使用测试公众号: 使用测试号的时候,接口信息的配置就不讲了,可以参考我之前的博客。 使用维码登录测试号之后,需要用你的微信号去关注这个测试号,不然看不到模板消息的回复。 我在做测试的时候,用了chrome浏览器的一个插件:postman。该插件可以指定发送GET

基于PHP的微信AI智能客服系统源码:消息接收与自动回复的实现

本文介绍了一套基于PHP开发的微信AI智能客服系统,采用ThinkPHP6框架构建,整合MySQL和Redis实现数据存储与会话管理。系统核心功能包括:1)多类型消息接收模块,通过策略模式处理文本、图片等消息,并利用Redis维护对话上下文;2)三级回复策略的自动回复模块,结合精确匹配、语义分析和AI生成实现智能响应;3)特色功能如人工转接、知识库管理和系统监控等。文章还提供了消息处理的核心代码示例,展示了从接收消息到意图识别再到回复生成的完整流程。该系统为企业微信客服场景提供了完整的智能化解决方案。

春哥开源研究所的博客 541

万达电影 com.wandafilm.app headers check

万达电影 安卓逆向 抓包 逆向 check

weixin_43786514的博客 1438

IMU预积分【SLAM】

预积分的推导过程比较多,所以这里只记录关键结论。 其实这些公式不太好记忆,因为预积分推导过程的想法来源很巧妙,无法看出物理意义。一切推导的来源: 最好记忆的旋转相对运动量: △Rij≐RiTRj=∏k=ij−1Exp((ω~k−bg,k−ηgd,k)△t)\triangle R_{ij} \doteq R_{i}^{T}R_{j} = \prod_{k=i}^{j-1}Exp((\tilde{\omega}_{k}-b_{g,k}-\eta_{gd,k})\triangle t) △Rij​≐RiT​Rj​

Tong_1024_的博客 1370

微信公众平台开发笔记(二)

大家好,新年好,废话不多说,上次我写了微信模板大致的的意思,在此基础我们继续探讨,今天我们尽量将代码模块化。接上次话题,其实消息被动回复主要是responseMsg(),所以我们主要修改它,此外,我将分responseMsg(),transmitText()两模块。先看第一个 public function responseMsg() //接收数据 { //使用 get

Shidoudou 1277

保姆级教程:用YOLOv5s训练PCB缺陷检测模型(附北大公开数据集)

本文提供了一份基于YOLOv5s的PCB缺陷检测模型从零开始的完整实战教程。详细解析了如何使用北大公开数据集,涵盖环境搭建、数据处理、模型训练、性能评估及优化部署全流程,并针对工业场景中常见的类别不均衡问题给出了具体解决方案,旨在帮助开发者快速构建高精度的自动化质检系统。

weixin_28285943的博客 308

[PHP]如何使用Face++接口开发微信公共平台的人脸识别系统

效果图如下: 具体步骤如下: 首先,先登录Face++的官网注册账号:官网链接 然后接下来的就是使用PHP脚本调用API了。 在使用PHP开发微信公共平台的时候,推荐使用Github上的一款不错的框架:wechat-php-sdk 对于微信的常用接口做了一些封装,核心文件wechat.class.php如下: <?php /** * 微信公众平台PHP

汪海的实验室 8954

手把手教你用ESP32驱动MAX30102心率血氧传感器(含完整代码)

本文详细介绍了如何使用ESP32微控制器驱动MAX30102心率血氧传感器,构建智能健康监测系统。内容涵盖PPG原理、硬件连接、驱动配置、信号处理算法以及Web服务器数据可视化,提供完整代码实现,帮助开发者快速上手物联网健康设备开发。

weixin_29208077的博客 586

HMC7044芯片模拟SPI配置

摘要: HMC7044是一款高性能双环路整数N分频抖动衰减器,支持SPI接口配置,适用于高速数据转换器时钟系统。该芯片采用双PLL级联架构,具有14路可配置输出,可满足GSM/LTE基站设计需求。SPI接口采用3线模式(SLEN/SCLK/SDATA),支持24位寄存器读写(13位地址+8位数据)。驱动实现基于Zynq EMIO模拟SPI,提供初始化、数据传输及寄存器配置功能,支持三线制工作模式和多种时钟参数设置。

toonyhe的博客 1095
上一篇: PHP微信定制开发-接口配置校验
下一篇: PHP微信定制开发-服务器被动回复消息之文本消息
青蛙小王子
博客等级 码龄16年 239粉丝 311原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值