• 微信小程序--消息推送配置Token令牌错误校验失败如何解决


    微信开放第三方API接口,

    申请地址: 

    https://mp.weixin.qq.com/advanced/advanced?action=interface&t=advanced/interface&token=1865635074&lang=zh_CN

    官方提供PHP开发代码下载: 点此下载

    如果你的微信接口页面没有做好,提交保存的时候,会提示:验证Token失败。这个错误是因为,你的接口页面还没有反馈正确的信息给微信接口。微信在教程方面还做得不够成熟,就一个PHP示例,还是有问题的,在下篇文章我会讲到这个错误在哪。微信官方也没有跟大家说清楚怎么才能是token验证成功。下面我将给出示例告诉大家如何通过token验证。

    譬如:微信接口页面是http://bbhet.com  默认页面是weixin.php,我们只需要把weixin.php的代码改为, 然后放到你得网站根目录:

    官方下载地址 http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html

    方法一: 简单的PHP实现Token验证

    [php] view plain copy
     
    1. <?php  
    2. //1. 将timestamp , nonce , token 按照字典排序  
    3. $timestamp = $_GET['timestamp'];  
    4. $nonce = $_GET['nonce'];  
    5. $token = "你自定义的Token值 用于验证";  
    6. $signature = $_GET['signature'];  
    7. $array = array($timestamp,$nonce,$token);  
    8. sort($array);  
    9.   
    10. //2.将排序后的三个参数拼接后用sha1加密  
    11. $tmpstr = implode('',$array);  
    12. $tmpstr = sha1($tmpstr);  
    13.   
    14. //3. 将加密后的字符串与 signature 进行对比, 判断该请求是否来自微信  
    15. if($tmpstr == $signature)  
    16. {  
    17.     echo $_GET['echostr'];  
    18.     exit;  
    19. }  


    方法二: 封装类的代码实现Token验证

    [php] view plain copy
     
    1. <?php  
    2. /** 
    3.   * wechat php test 
    4.   */  
    5.   
    6. //define your token  
    7. define("TOKEN", "weixin");  
    8. $wechatObj = new wechatCallbackapiTest();  
    9. $wechatObj->valid();  
    10.   
    11. class wechatCallbackapiTest  
    12. {  
    13.     public function valid()  
    14.     {  
    15.         $echoStr = $_GET["echostr"];  
    16.   
    17.         //valid signature , option  
    18.         if($this->checkSignature()){  
    19.             echo $echoStr;  
    20.             exit;  
    21.         }  
    22.     }  
    23.   
    24.     public function responseMsg()  
    25.     {  
    26.         //get post data, May be due to the different environments  
    27.         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
    28.   
    29.         //extract post data  
    30.         if (!empty($postStr)){  
    31.                   
    32.                 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);  
    33.                 $fromUsername = $postObj->FromUserName;  
    34.                 $toUsername = $postObj->ToUserName;  
    35.                 $keyword = trim($postObj->Content);  
    36.                 $time = time();  
    37.                 $textTpl = "<xml>  
    38.                             <ToUserName><![CDATA[%s]]></ToUserName>  
    39.                             <FromUserName><![CDATA[%s]]></FromUserName>  
    40.                             <CreateTime>%s</CreateTime>  
    41.                             <MsgType><![CDATA[%s]]></MsgType>  
    42.                             <Content><![CDATA[%s]]></Content>  
    43.                             <FuncFlag>0</FuncFlag>  
    44.                             </xml>";               
    45.                 if(!empty( $keyword ))  
    46.                 {  
    47.                     $msgType = "text";  
    48.                     $contentStr = "Welcome to wechat world!";  
    49.                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);  
    50.                     echo $resultStr;  
    51.                 }else{  
    52.                     echo "Input something...";  
    53.                 }  
    54.   
    55.         }else {  
    56.             echo "";  
    57.             exit;  
    58.         }  
    59.     }  
    60.           
    61.     private function checkSignature()  
    62.     {  
    63.         $signature = $_GET["signature"];  
    64.         $timestamp = $_GET["timestamp"];  
    65.         $nonce = $_GET["nonce"];      
    66.                   
    67.         $token = TOKEN;  
    68.         $tmpArr = array($token, $timestamp, $nonce);  
    69.         sort($tmpArr);  
    70.         $tmpStr = implode( $tmpArr );  
    71.         $tmpStr = sha1( $tmpStr );  
    72.           
    73.         if( $tmpStr == $signature ){  
    74.             return true;  
    75.         }else{  
    76.             return false;  
    77.         }  
    78.     }  
    79. }  
    80.   
    81. ?>  


    版权声明:本文为博主原创文章,未经博主允许不得转载。

    http://www.wxapp-union.com/article-2771-1.html?utm_source=QQqun

    消息推送配置Token令牌错误@Author GQ 2017年07月26日 本想在微信小程序中接入上传图片到阿里云功能,小程序中查询很多资料还是没能将图片转成流上传, 所以无奈只能借助小程序官方API中客服转发功能上传素材间接实现: ...

     
     
     
    <h1 id="微信小程序消息推送配置token令牌错误" style="margin: 0.8em 0px; padding: 0px; box-sizing: border-box; font-weight: 100; line-height: 1.3em;">[微信小程序]消息推送配置Token令牌错误
    @Author GQ 2017年07月26日  
    
    本想在微信小程序中接入上传图片到阿里云功能,小程序中查询很多资料还是没能将图片转成流上传,
    所以无奈只能借助小程序官方API中客服转发功能上传素材间接实现:
    
    1.将小程序选择的照片上传至微信临时服务器并返回图片url;
    2.将url返回给自己的后台,后台通过url获取流再上传至阿里OSS;
    
    想法挺美好,然而一地坑...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Token校验失败,请检查确认 如下图

    配置

    • URL:填写自己写的接口路径,需要已经调试好并且发布到正式域名地址下才可以; 
      • 注意 : 当点击下方的 提交 按钮时,微信会请求一次数据给你的URL地址
    • Token(令牌): 自己随便起个名字就行英文数字3-32字符;
    • EncodingAESKey: 点随机生成吧,省的自己写;
    • 加密方式: 兼容就行
    • 数据格式: 看个人喜好一般Json

    然后就可以看着 消息配置指南 操作了,这里我详细在用大白话说下,官方给的是PHP的代码…

    1. 上面说到微信会请求你填写的URL地址,我们先来看下微信这个GET请求的参数

      请求方式 : GET

    参数描述
    signature 微信加密签名(不用管他是怎么来的,反正是很长的一串)
    timestamp 时间戳 eg:1501060062
    nonce 随机数 eg:2535181275
    echostr 随机字符串 eg:14324296167175543775

    2. 大概了解了参数我们这个接口就好写多了,我们屡一下这几个参数的处理逻辑;

    1) 还记得上面自己填写的token吧3-32字符的那个,这里要用到;

    2) 将timestamp nonce token 这三个参数对应的值进行字典排序;什么是字典排序?

    3) 排序后将这三个参数对应的值,只要值,拼接成string字符串;

    4) 将拼接好的字符串SHA1加密,注意要小写字母,假设返回的string我命名为 secret ;

    5) 比较参数 signature 和 secret 值是否相等;

    • 如果相等表示验证成功,并且原封不动的返回 echostr
    • 如果不相等表示验证失败,返回写不写哇,你爱咋咋

    将写好的接口发布到服务器上,然后在微信的消息配置页面填好信息,点击 提交 则会提示成功

    配置成功


    官方给的PHP,我这二吊子水平用.Net写的代码给大家做参考:

        /// <summary>
        /// 微信消息配置 
        /// </summary>
        public class GetWxMsg : IHttpHandler
        {
            private static Logger logger = LogManager.GetCurrentClassLogger();
            public void ProcessRequest(HttpContext context)
            {
                var signature = context.Request["signature"];
                var timestamp = context.Request["timestamp"];
                var nonce = context.Request["nonce"];
                var echostr = context.Request["echostr"];
    
                logger.Info("微信消息服务器验证传入数据" + string.Format("signature:{0},timestamp:{1},nonce:{2},echostr:{3}", signature, timestamp, nonce, echostr));
    
                var token = "aaaaaaa";//自定义字段(自己填写3-32个字符)
    
                //timestamp和token和nonce 字典排序
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add("token", token);
                dic.Add("nonce", nonce);
                dic.Add("timestamp", timestamp);
                var list = dic.OrderBy(s => s.Value);
                var conbineStr = "";
                foreach (var s in list)
                {
                    conbineStr = conbineStr + s.Value;
                }
                string data = conbineStr;
                //sha1加密
                string secret = FormsAuthentication.HashPasswordForStoringInConfigFile(conbineStr, "SHA1").ToLower();
                var success = signature == secret;
                if (success)
                {
                    data = echostr;
                }
                context.Response.ContentType = "text/plain";
                context.Response.Write(data);
            }
     
     
  • 相关阅读:
    前端开发聚合
    6. webRTC
    14.移动端图片浏览组件 react-wx-images-viewer
    windows下怎样使用md命令一次建立多级子目录
    mysql打印输出转csv格式
    Java Stream简介, 流的基本概念
    Linux使用Shell脚本实现ftp的自动上传下载
    在Linux中设置UMASK值
    SFTP+OpenSSH+ChrootDirectory设置
    导出php5.4支持的数组格式,即以[]为标识符而不是以array()标识
  • 原文地址:https://www.cnblogs.com/shenzikun1314/p/8031616.html
Copyright © 2020-2023  润新知