咨询下。有人消息推送的验证服务器通过了吗?
发布于 5 年前 作者 mengyang 11158 次浏览 来自 问答

企业微信,公众号的验证都没问题。 不知道为什么小程序验证一直提示token不正确,我方服务器日志排查报错的错误码是-40001

是不是我们小程序的验证不能和其他的企业微信和公众号用一样逻辑,有没有php的范例代码我们核对下错误原因?

目前发现小程序的差异如下:验证时候企业号,企业微信用msg_signature, 小程序用signature。

其他还有差异吗? SHA1的加密我看是一样的

6 回复
public function VerifyURL($sMsgSignature, $sTimeStamp, $sNonce, $sEchoStr, &$sReplyEchoStr)
{
    if (strlen($this->m_sEncodingAesKey) != 43) {
        return JOrigin_Wechat_Model_ErrorCode::$IllegalAesKey;
    }
 
    $pc=Mage::getModel('jorigin_wechat/prpcrypt');
    $pc->setKey($this->m_sEncodingAesKey);
    //verify msg_signature
    $array = $this->getSHA1($this->m_sToken, $sTimeStamp, $sNonce, $sEchoStr);
    $ret = $array[0];
 
    if ($ret != 0) {
        return $ret;
    }
 
    $signature = $array[1];
    if ($signature != $sMsgSignature) {
        return JOrigin_Wechat_Model_ErrorCode::$ValidateSignatureError;
    }
 
    $result = $pc->decrypt($sEchoStr, $this->m_sCorpid);
    if ($result[0] != 0) {
        return $result[0];
    }
    $sReplyEchoStr = $result[1];
 
    return JOrigin_Wechat_Model_ErrorCode::$OK;
}
 
 
 
/**
 * 用SHA1算法生成安全签名
 * [@param](/user/param) string $token 票据
 * [@param](/user/param) string $timestamp 时间戳
 * [@param](/user/param) string $nonce 随机字符串
 * [@param](/user/param) string $encrypt 密文消息
 */
public function getSHA1($token, $timestamp, $nonce, $encrypt_msg)
{
    //排序
    try {
        $array = array($encrypt_msg, $token, $timestamp, $nonce);
        sort($array, SORT_STRING);
        $str = implode($array);
        return array(JOrigin_Wechat_Model_ErrorCode::$OK, sha1($str));
    } catch (Exception $e) {
        print $e . "\n";
        return array(JOrigin_Wechat_Model_ErrorCode::$ComputeSignatureError, null);
    }
}

加密的消息报文验证下一行应该是这样对吗?

            $array = array($encrypt_msg, $token, $timestamp, $nonce);

根据您的范例,我看了和我们现在的对比不一样。 是否有加密的范例?

楼上是正确的

可否取消这个解决问题的标签,加密的方式官方还没在文档标注,我们的加密用的是其他微信方案。其他都能通过。

你的url返回的内容是echostr的字符串,我开始用的是json格式返回,要用text格式


说明文档有待提高,明明说的是json/xml格式(其实应该是请求),

响应却没有说明,一般人都理解成和请求一样的json/xml格式,结果特么的返回竟然是text格式,擦

[@ResponseBody](/user/ResponseBody)
[@RequestMapping](/user/RequestMapping)("/sendTips")
public String message1(HttpServletRequest request){
//后期数据处理
   String echostr = request.getParameter("echostr");
return echostr;
}

我配成功了

public function index() {

if ($this->checkSignature()) {

echo $_GET['echostr'];

} else {

echo 'error';

}

}

private function checkSignature() {

$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;

}

}

回到顶部