dodgepudding / wechat-php-sdk

微信公众平台php开发包, weixin developer SDK.
4.44k stars 2.32k forks source link

接入验证提示“配置失败”,有返回echostr #223

Open coneo opened 9 years ago

coneo commented 9 years ago

如题,我的使用用例为:

$weObj = new Wechat($options);
$ret = $weObj->valid();//明文或兼容模式可以在接口验证通过后注释此句,但加密模式一定不能注释,否则会验证失败
if (!$ret) {
    server_logger("验证失败!");
    var_dump($ret);
    exit;
}

我在valid函数中die($echostr)时加了日志, 如下:

public function valid($return=false)
    {
        $encryptStr="";
        if ($_SERVER['REQUEST_METHOD'] == "POST") {
            $postStr = file_get_contents("php://input");
            $array = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $this->encrypt_type = isset($_GET["encrypt_type"]) ? $_GET["encrypt_type"]: '';
            if ($this->encrypt_type == 'aes') { //aes加密
                $this->log($postStr);
                $encryptStr = $array['Encrypt'];
                $pc = new Prpcrypt($this->encodingAesKey);
                $array = $pc->decrypt($encryptStr,$this->appid);
                if (!isset($array[0]) || ($array[0] != 0)) {
                    if (!$return) {
                        die('decrypt error!');
                    } else {
                        return false;
                    }
                }
                $this->postxml = $array[1];
                if (!$this->appid)
                    $this->appid = $array[2];//为了没有appid的订阅号。
            } else {
                $this->postxml = $postStr;
            }
        } elseif (isset($_GET["echostr"])) {
            $echoStr = $_GET["echostr"];

            if ($return) {
                if ($this->checkSignature())
                {
                    return $echoStr;
                }
                else
                {
                    $this->log("valid return false");
                    return false;
                }
            } else {
                if ($this->checkSignature())
                {
                    $this->log("die with echoStr : " . $echoStr);
                    die($echoStr);
                }
                else
                    die('no access');
            }
        }

        if (!$this->checkSignature($encryptStr)) {
            if ($return)
                return false;
            else
                die('no access');
        }
        return true;
    }

当我在微信中接入该服务器时,有日志显示: 101.226.62.16 [17/Apr/2015:12:12:01 +0800] SAE_DEBUG: die with echoStr : 7181269883986168093 in index.php on line 9 yq48

但是微信那面依然给我提示 “配置失败”。求解这是什么情况

mr-liusg commented 9 years ago

$options 是否正确配置了? 直接使用DEMO试试?

binsee commented 9 years ago

你直接访问sae上的页面地址,然后右键查看源代码,看看是否除了“no access”外还有其他内容。sae的可能会在你页面的返回结果另外增加内容,就会导致返回的信息不合规范,导致失败

coneo commented 9 years ago

我看了下,我的sae没有认证,在返回echostr的时候有返回另外的 “未认证的sae balabala”。等我的sae认证之后我再试试。 但是很奇怪,我用sae之前有接入成功过,这是为什么。

mr-liusg commented 9 years ago

之前用SAE也试过代码出错但是接入成功。可能是微信方面的偶然性问题?

coneo commented 9 years ago

已经确定了,就是SAE有返回额外的东西的原因。如下: image1

我申请了实名认证之后,就能成功接入了。