1. 程式人生 > >微信小程式--訊息推送配置Token令牌錯誤校驗失敗如何解決

微信小程式--訊息推送配置Token令牌錯誤校驗失敗如何解決

<h1 id="微信小程式訊息推送配置token令牌錯誤" style="margin: 0.8em 0px; padding: 0px; box-sizing: border-box; font-weight: 100; line-height: 1.3em;">[微信小程式]訊息推送配置Token令牌錯誤
@Author GQ 20170726日  

本想在微信小程式中接入上傳圖片到阿里雲功能,小程式中查詢很多資料還是沒能將圖片轉成流上傳,
所以無奈只能藉助小程式官方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);
        }