资讯专栏INFORMATION COLUMN

微信消息处理

leoperfect / 2340人阅读

摘要:配置首先登录微信公众平台,在开发基本配置中填写服务器配置接收处理微信消息的地址保存好你的配置,在加解密时需要使用。若确认此次请求来自微信服务器,请原样返回参数内容,则接入生效,成为开发者成功,否则接入失败。

配置

首先登录微信公众平台 https://mp.weixin.qq.com,在开发->基本配置中填写服务器配置(接收处理微信消息的地址)

保存好你的配置,在加解密时需要使用。

验证

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

开发者通过检验 signature 对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回 echostr 参数内容,则接入生效,成为开发者成功,否则接入失败。

加密/校验流程如下:

tokentimestampnonce 三个参数进行字典序排序

将三个参数字符串拼接成一个字符串进行 sha1 加密

开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信

public function validate() {
    $echoStr = Input::get("echostr");
    if (!empty($echoStr)) {
        $signature = Input::get("signature");
        $timestamp = Input::get("timestamp");
        $nonce = Input::get("nonce");
        $tmpArr = [
            "你配置的Token",
            $timestamp,
            $nonce
        ];
        sort($tmpArr);
        $tmpStr = implode("", $tmpArr);
        $tmpStr = sha1($tmpStr);
        if ($tmpStr == $signature) {
            echo $echoStr;
            exit;
        }
    }
}

PHP示例代码下载:下载

消息加解密

微信官方文档:加密解密技术方案

首先获取微信发送的XML数据:

$xmlString = file_get_contents("php://input");

使用下载的示例代码解密消息:

//提供提取消息格式中的密文 XmlParse类在xmlparse.php里
$secretData = (new XmlParse())->extract($xmlString);
//对密文进行解密 Prpcrypt类在pkcs7Encoder.php里
$result = (new PrpCrypt("你配置的EncodingAESKey"))->decrypt($secretData[1]);

之后就根据具体业务来实现了:

$xmlFormatData = simplexml_load_string($result[1], "SimpleXMLElement", LIBXML_NOCDATA);
$event = (string)$xmlFormatData->Event;
$eventKey = isset($xmlFormatData->EventKey) ? (string)$xmlFormatData->EventKey : "";
$openId = (string)$xmlFormatData->FromUserName;
$toUserName = (string)$xmlFormatData->ToUserName;

//事件处理
if ($event === "VIEW" || $event == "CLICK") {
    //自定义菜单事件
}
if (!$eventKey && $event == "subscribe") {
    //扫描公众号二维码关注事件
}
if ($eventKey && $event == "subscribe") {
    //扫描二维码关注事件
}
if ($eventKey && $event == "SCAN") {
    //扫描生成的二维码
}
if ($event == "unsubscribe") {
    //取消关注事件
}
if ($event === "card_pass_check" || $event === "card_not_pass_check") {
    //卡券审核通过或审核未通过事件
}
if ($event === "user_get_card") {
    //卡券领取事件
}
if ($event === "user_consume_card") {
    //卡券核销事件
}

//其他事件不处理
return false;

需要发送加密消息时:

$wxBizMsg = new WxBizMsgCrypt("你配置的Token", "你配置的EncodingAESKey", "你公众号的APPID");
//加密后的消息,传引用
$encryptMsg = "";
//未加密的消息为XML格式的字符串
echo $wxBizMsg->encryptMsg("未加密的消息", time(), str_random(16), $encryptMsg);

假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复),否则,将出现严重的错误提示。
详见下面说明:

直接回复success(推荐方式)

直接回复空串(指字节长度为0的空字符串,而不是XML结构体中content字段的内容为空)

一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:

开发者在5秒内未回复任何内容

开发者回复了异常数据,比如JSON数据等

具体的各种XML格式见:被动回复用户消息

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28745.html

相关文章

  • 【Node.js 微信公众号实战】4.Node.js 微信消息管理

    摘要:消息推送也是微信公众号开发更为有趣的功能,涉及到文本消息图片消息语音消息视频消息音乐消息以及图文消息。在文件中创建文件用于消息的管理。 一、写在前面的话   当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应。   消息推送也是微信公众号开发更为有趣的功能,涉及到文本消息、图片消...

    lewinlee 评论0 收藏0
  • 【实战教程】使用知晓云完成微信卡券消息处理

    摘要:此教程将带领大家体验这个新功能,实现一个微信消息推送类型的触发器。进入公众号后台点击开发基本配置服务器配置,同步配置成知晓云消息推送的相关配置,完成配置后,微信消息推送类型的触发器方可使用。 知晓云新推出「消息推送」功能,该功能通过「消息推送」类型的触发器接收微信推送过来的消息,开发者可以对此消息实行相关操作。 此教程将带领大家体验这个新功能,实现一个「微信消息推送」类型的触发器。 该...

    Karrdy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<