2017-11-02 10:16:23 s31213 阅读数 256
1、php文件编码问题

用NotPad++打开,是否为UTF-8无BOM编码格式,不是专为UTF-8无BOM编码格式
2、检查微信后台Token(令牌)前后是否有空格

有空格把空格去掉
3、检查微信后台Token与服务器后台Token是否一致
不一致无法进行sha1算法验证
4、通过sha1算法验证,还是token验证失败

通过日志参查看信服务器访问路径,在浏览器里面打开一遍,发现有echostr内容输出。
方法一、在输出echo $echostr前添加 header('content-type:text');
方法二、最后在echo $echoStr前面加一句ob_clean();

给几个看到的解决方案链接:
http://bbs.csdn.net/topics/390991193
2019-08-09 22:13:11 dreamstone_xiaoqw 阅读数 80

刚注册公司搞了个资质,学习开发微信企业号“寻溯科技”。

在提交服务器配置时,报错 token 验证失败,在segmentfault找到了@苏生不惑的回答,经验证可以解决问题。

if($_GET[echostr]){

$wechatObj->valid();

}else {
    $wechatObj->responseMsg();//?
}

如果是静态函数调用,可以这样:

if ((new self())->checkSignature()) {
	echo $echoStr;
	exit;
} else {
	(new self())->responseMsg(); //?
}

答案原始链接:https://segmentfault.com/q/1010000003042662

附:微信公众平台文档

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();

if($_GET[echostr]){

$wechatObj->valid();
    
}else {
    
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    public function responseMsg()
    {
        //get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //extract post data
        if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
                $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>";             
                if(!empty( $keyword ))
                {
                    $msgType = "text";
                    $contentStr = "Welcome to wechat world!";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }else{
                    echo "Input something...";
                }

        }else {
            echo "";
            exit;
        }
    }
        
    private function checkSignature()
    {
        // you must define TOKEN by yourself
        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);
        // use SORT_STRING rule
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}

?>

2016-01-07 17:19:00 weixin_34252090 阅读数 106

 问题:微信公众账号 开发过程中配置  token 提示 验证失败

如下图:

点击修改配置:

填写相关url与token(自定义):点击提交,会出现

出现这种情况,主要是对相关参数不熟悉,要了解url与token的关系

url可以访问:页面中有Token的定义。url地址如:http://www.***.com/pay/wx_token.aspx

Token:根据说明自定义即可,要与url对应页面上的Token一致。

示例文件:

using System;
using System.Web.Security;
using System.Web.UI;
using WxPayAPI;

namespace Alipay
{
    public partial class wx_token : Page
    {
        /// <summary>
        /// 要与基本配置中的Token一致
        /// </summary>
        public string Token = "Token";

        protected void Page_Load(object sender, EventArgs e)
        {
            string echoStr = Request.QueryString["echoStr"];
            Log.Debug("Token", "测试输出: echoStr = " + echoStr);
            if ( CheckSignature() && !string.IsNullOrEmpty(echoStr))
            {
                Response.Write(echoStr);
                Response.End();
            }
        }

        /// <summary>
        /// 验证微信签名
        /// </summary>
        /// * 将token、timestamp、nonce三个参数进行字典序排序
        /// * 将三个参数字符串拼接成一个字符串进行sha1加密
        /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
        /// <returns></returns>
        private bool CheckSignature()
        {
            string signature = Request.QueryString["signature"];
            string timestamp = Request.QueryString["timestamp"];
            string nonce = Request.QueryString["nonce"];
            Log.Debug("Token", "测试输出: signature = " + signature);
            Log.Debug("Token", "测试输出: timestamp = " + timestamp);
            Log.Debug("Token", "测试输出: nonce = " + nonce);
            string[] arrTmp = { Token, timestamp, nonce };
            Array.Sort(arrTmp);
            string tmpStr = string.Join("", arrTmp);
            tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            if (tmpStr != null)
            {
                tmpStr = tmpStr.ToLower();
                return tmpStr == signature;
            }
            return false;
        }
    }
}

 

示例文件中所用类库可以从公众号支付开发文档页面下载:https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=11_1

2019-07-17 21:11:49 u010268820 阅读数 3303

排查问题我将从以下几个步骤进行

  1. 自己编写的验证接口的问题
  2. 服务端配置问题
  3. 微信端出现的问题

一. 自己编写验证接口的问题

可能出现的情况
1.1 没有严格按照微信官方的要求进行token验证。
解决方案建议:详细多阅读几次官方文档,并达到理解的程度。这里我将文档中的重点位置摘录,以提醒注意:
验证消息的确来自微信服务器
开发者提交信息(如何配置不再累赘,参见官方文档)后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数

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

通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与SIGNATURE对比,标识该请求来源于微信

1.2 非正常编辑文件(记事本,在线编辑),导致添加了 utf8 的 bom 签名
解决方案: 使用多功能编辑器去除 bom。

1.3 接口文件(php)结束符后包含换行或其他字符


//文件开始
?>

//文件结束

解决方案:去除多余的字符。

如何排除不是自己代码编写出的问题:

申请微信公众平台接口测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,用自己写的接口去验证测试账号的token,如果验证能通过,基本能排除自己代码的问题。接下来就要开始怀疑自己服务器配置的问题,导致接收到微信服务器的响应不能正常传递给接口进行处理。

二. 服务器配置的问题

2.1 服务端缓存导致配置没有及时更新生效;
解决方案:在进行验证前清除缓存

# php
ob_clean();

2.2 程序 gzip 加密异常,导致token验证失效
解决方案: 可临时取消程序 gzip 功能排查测试。

2.3 服务安装了安全狗或者云盾可能会拦截腾讯服务器的请求(阿里云esc)。
解决方案:卸载安全狗,或者提示云盾设置白名单。如何处理,这里可以参考。https://www.feiniaomy.com/post/155.html

2.4 虚拟主机使用临时域名去验证导致被系统拦截(适用于万网的虚拟主机)
解决方案: 使用已经接入备案的正式域名来进行验证操作。

说明:如果上面的情况都排除了还没解决,这里还有一个方向去排除是服务器的配置问题,那就是确认微信服务器是否发送了请求到我们自己的服务器。如果能确认在确认修改配置时微信服务器没有发送请求到我们的服务器,就能确认是微信服务器的问题。

如何确认微信服务是否发送请求到我们服务器,这里有两种方法: 1. 查看日志,参考https://www.cnblogs.com/kenshinobiy/p/5433705.html, 后面讲到了如何进行写入日志; 2. 进行数据抓包, 参考https://blog.csdn.net/u012322855/article/details/52080071

通过最后抓包,我确认了微信服务器没有响应到我的开发服务器,我这个运气可去买彩票了,微信服务器出现故障既被我撞到了T_T, 既然确定是微信服务器没有请求发到开发服务器,接下来就需要跟微信客服进行沟通了。

三. 如果是微信服务器出现问题该么办?

  1. 如果不是很急,就可以在微信开发者论坛:https://developers.weixin.qq.com/community/develop/mixflow去提问题, 或主动的在论坛上找官方客服进行咨询。
  2. 如果比较急,就直接打微信平台的客服电话。

腾讯的事业部门及产品很多,一定要找对咨询的地方,要不会浪费双方的时间。
查寻腾讯不同产品客服的地方:http://kf.qq.com/product/weixinmp.html

注: 和微信公众平台客服在开发者社区提问的帖子:https://developers.weixin.qq.com/community/develop/doc/000e4208ad8670b2bbd8c0e2e53400?jumpto=reply&parent_commentid=00028266b1835097c3d87e8605ac&commentid=000a2c9bd3ccb02ac4d84aed6564

参考:

  1. https://help.aliyun.com/knowledge_detail/42508.html?spm=5176.2000002.0.0.60061073MSFZvK
  2. https://bbs.csdn.net/topics/390991193

我已经开通了我个人网站, 欢迎访问!

2018-04-17 11:30:55 u013781343 阅读数 293

在微信开发时,如果使用新浪SAE服务器时可能会一直出现 ,验证token 失败

这时候不妨试一试,在echo $echoStr;之前添加header(‘content-type:text’);一句就可以验证成功了;

如下图


如果上述方法失败的话,看看你的SAE有没有实名认证,因为未进行实名认证的SAE服务器,可能传递信息时会多出一段JS代码,导致TOKEN接收失败。

没有更多推荐了,返回首页