该公众号提供的服务出现故障,请稍后再试

这几天遇到的问题,直教人,生不如死。

公众号开发(公众号:iSoftFine),“自定义被动回复用户消息”这一步,对应的文档是https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

按照正常的开发步骤,登录公众号以后,左侧菜单,“开发-->基本配置-->服务器地址(URL)”中设置了这个链接“http://123.206.xx.xx/wx”,然后在我的公众号中发消息留言,然后得到了非常快非常快的回复“该公众号提供的服务出现故障,请稍后再试”,而不是官方文档所描述的尝试5秒的请求。

服务器上的页面代码如下:

<?php

    require("visitorinfor.php");
    //$ToUserName = $_GET["ToUserName"];
    $a = new visitorInfo();
    $b = $a->getIp();
    #echo $b;
    logger($b);
    logger("==日志开始==");
    
#    echo "success " . date('Y-m-d H:i:s',time());
    echo "success";

    //定义 token
    define("TOKEN", "sabre");

    //实例化对象
    $wechatObj = new wechatCallbackapiTest();

    //调用函数
    if (isset($_GET['echostr'])) {
        $wechatObj->valid();
    }else{
        $wechatObj->responseMsg();
        logger("wechatObj:");
    };

    function logger($msg){
        $file = "messager.txt";
        file_put_contents($file, $msg . date('Y-m-d H:i:s',time()) . PHP_EOL, FILE_APPEND);
    };

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            ob_clean();
            echo $echoStr;
            exit;
        }else{
            write_log('认证失败');
            exit;
        }
    }

    public function responseMsg()
    {
        //$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
        
        //$postStr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");
        
        if(isset($GLOBALS['HTTP_RAW_POST_DATA'])){
            $postStr = $GLOBALS['HTTP_RAW_POST_DATA'];
            #echo "GLOBALS['HTTP_RAW_POST_DATA']";
            logger("GLOBALS['HTTP_RAW_POST_DATA']不空");
        }
        else{
            $postStr = file_get_contents('php://input');
            //echo "file_get_contents:".$postStr->FromUserName;
            logger("GLOBALS['HTTP_RAW_POST_DATA']为空");//.gettype($postStr));
        }
        
        
        if (!empty($postStr)){  
            //libxml_disable_entity_loader(true);//安全防护
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);  
            $fromUsername = $postObj->FromUserName;  
            $toUsername = $postObj->ToUserName;
            $createTime = $postObj->CreateTime;
            $msgType = $postObj->MsgType;
            $content = $postObj->Content;
            $msgId = $postObj->MsgId;
            
            if($msgType == 'text'){
                $textTpl = "<xml>  
                        <ToUserName><![CDATA[%s]]></ToUserName>  
                        <FromUserName><![CDATA[%s]]></FromUserName>  
                        <CreateTime>%s</CreateTime>  
                        <MsgType><![CDATA[text]]></MsgType>  
                        <Content><![CDATA[%s]]></Content>  
                        <FuncFlag>0</FuncFlag>  
                        </xml>";
                $time = time();
                $contentStr = "您发的是消息包含以下信息:\n发信人OpenID:".$fromUsername."\n收信人微信号:".$toUsername."\n发信时间:".$createTime."\n消息类型:".$msgType."\n消息内容:".$content."\n消息ID:".$msgId;  
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);  
                ob_clean();
                echo $resultStr;  
            }else{
                $textTpl = "<xml>  
                        <ToUserName><![CDATA[%s]]></ToUserName>  
                        <FromUserName><![CDATA[%s]]></FromUserName>  
                        <CreateTime>%s</CreateTime>  
                        <MsgType><![CDATA[text]]></MsgType>  
                        <Content><![CDATA[%s]]></Content>  
                        <FuncFlag>0</FuncFlag>  
                        </xml>";
                $time = time();
                $contentStr = "您发的消息类型不是文本。而是".$msgType;
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
                ob_clean();
                echo $resultStr;  
            }
        }
    }
        
    private function checkSignature()
    {
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}

    logger("==日志结束==")

?>

 

根据现象来看,一定是哪里报错了。

  • 按照最低要求,只回复了一个success,不行。
  • 把页面上所有的echo输出都删除,不行。
  • 使用ob_clean();清除其它输出,不行。
  • 更换页面,尝试网上的各种解决方案,不行。
  • 设置第三方授权,不行。
  • 开启微信开发的警报,“开发-->运维中心-->接口告警”,把下面的阈值设置为1次/5分钟。事实证明,正是这个告警帮我解决了问题。但是这个告警不怎么灵,最初的时候,我连续发了41个消息的时候,自动成立的群中,出现了一条告警消息。后来不确定次数会发一个选区消息。再后来,第三、四天以后,无论怎样发消息,也不再告警了,不知原因。

  告警中回复的消息如下:

  

Appid: ***
昵称: ***
时间: 2018-03-29 02:04:41
内容: 微信服务器向公众号推送消息或事件后,得到的回应不合法
次数: 5分钟 17次
错误样例: [OpenID=***][Stamp=1522260281][3rdUrl=http://123.206.xx.xx/wx][Msg=Text][ip=123.206.xx.xx}[response_length=367][response_content=<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved < a href="http://123.206.xx.xx/wx/?signature=604fbc39b06d70eef96776f18f723ec8ebe75bdd&amp;timestamp=1522260281&amp;nonce=416143100&amp;openid=o8Cfj1VZELLnqs0uBNvxBVZOa6jY">here</ a>.</p>
</body></html>]
报警排查指引,请见: http://url.cn/ab0jnP

是个301重定向的错误。

足足困扰了两天,决定要放弃了。

但是没有放弃,心里一直惦记着这个事儿。

今天,偶然又翻了一下这个告警消息,发现了一点端倪。

回复的消息中<p>The document has moved < a href="http://123.206.xx.xx/wx/?signature=604fbc39b06d70eef96776f18f723ec8ebe75bdd为什么wx后面会有个斜杠?我设置的网址中似乎没有斜杠。灵光乍现,赶紧回去看了一下,果然没有斜杠,加上,测试,通过。

这就是暗时间的力量,念念不忘,必有回响。

同时建议微信开发团队,加上一个URL的示例,会节约不少社会生产力。你们的一言一行,都涉及广大人民群众。

 

本项目通过STM32F103C8T6单片机最小系统,连接正点原子ESP8266 WiFi模块,将模块设置为Station模式,并与电脑连接到同一个WiFi网络。随后,STM32F103C8T6单片机将数据发送到电脑所在的IP地址。 功能概述 硬件连接: STM32F103C8T6单片机与正点原子ESP8266 WiFi模块通过串口连接。 ESP8266模块通过WiFi连接到电脑所在的WiFi网络。 软件配置: 在STM32F103C8T6上配置串口通信,用于与ESP8266模块进行数据交互。 通过AT指令将ESP8266模块设置为Station模式,并连接到指定的WiFi网络。 配置STM32F103C8T6单片机,使其能够通过ESP8266模块向电脑发送数据。 数据发送: STM32F103C8T6单片机通过串口向ESP8266模块发送数据。 ESP8266模块将接收到的数据通过WiFi发送到电脑所在的IP地址。 使用说明 硬件准备: 准备STM32F103C8T6单片机最小系统板。 准备正点原子ESP8266 WiFi模块。 将STM32F103C8T6单片机与ESP8266模块通过串口连接。 软件准备: 下载并安装STM32开发环境(如Keil、STM32CubeIDE等)。 下载本项目提供的源代码,并导入到开发环境中。 配置与编译: 根据实际需求配置WiFi网络名称和密码。 配置电脑的IP地址,确保与ESP8266模块在同一网络中。 编译并下载程序到STM32F103C8T6单片机。 运行与测试: 将STM32F103C8T6单片机与ESP8266模块上电。 在电脑上打开网络调试工具(如Wireshark、网络调试助手等),监听指定端口。 观察电脑是否接收到来自STM32F103C8T6单片机发送的数据。
在电子测量技术中,示波装置扮演着观测电信号形态的关键角色。然而,市售标准示波器往往定价较高,使得资源有限的入门者或教学环境难以配备。为此,可采用基于51系列微控制器的简易示波方案进行替代。该方案虽在性能上不及专业设备,但已能满足基础教学与常规电路检测的需求。下文将系统阐述该装置的主要构成模块及其运行机制。 本装置以51系列单片机作为中央处理核心,承担信号数据的运算与管理任务。该单片机属于8位微控制器家族,在嵌入式应用领域使用广泛。其控制程序可采用C语言进行开发,得益于C语言在嵌入式编程中的高效性与适应性,它成为实现该功能的合适选择。 波形显示部分采用了由ST7565控制器驱动的128×64点阵液晶模块。ST7565是一款图形液晶驱动芯片,支持多种像素规格的显示输出;此处所指的12864即表示屏幕具有128列、64行的像素阵列。该屏幕能以图形方式实时绘制信号曲线,从而提供直观的观测界面。 在模拟至数字信号转换环节,系统集成了TLC0820型模数转换芯片。该芯片具备8位分辨率及双输入通道,最高采样速率可达每秒10万次。这样的转换速度对于捕获快速变动的信号波形具有重要意义。 实现该示波装置需综合运用嵌入式软硬件技术。开发者需掌握51单片机的指令系统与编程方法,熟悉ST7565控制器的显示驱动配置,并能对TLC0820芯片进行正确的采样编程。此外,还需设计相应的模拟前端电路,包括信号调理、放大与滤波等部分,以确保输入ADC的信号质量满足测量要求。 通过C语言编写的控制程序,可完成系统各模块的初始化、数据采集、数值处理以及图形化显示等完整流程。开发过程中需借助调试工具对代码进行验证,保证程序执行的正确性与稳定性。 应当指出,受限于51系列单片机的运算能力与资源,该自制装置的功能相对基础,例如难以实现多通道同步测量、高级触发模式或高容量波形存储等复杂特性。尽管如此,对于绝大多数基础电子实验与教学演示而言,其性能已足够适用。 综上所述,结合51单片机、ST7565液晶控制器与TLC0820转换芯片,可以构建出一套成本低廉、结构清晰的简易示波系统。该装置不仅可作为电子爱好者、在校学生及教师的有益实践平台,帮助理解示波测量的基本原理,还能通过动手组装与调试过程,深化对电路分析与嵌入式系统设计的认识。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值