簽名錯誤的終極解決方案!jsapi 錯誤碼:63002,invalid signature

問題效果如下

返回錯誤詳細信息

errMsg: "config:fail,Error: 系統錯誤,錯誤碼:63002,invalid signature [20201105 15:06:48][]"

通過config接口注入權限驗證配置ready方法一直返回錯誤。
接口文檔地址: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#4
遺憾這裏這有前端的文檔調用說明,沒找到後臺調用獲取jsapi_ticket的方法。
後臺用java調用獲取如下參數:

wx.config({
  debug: true, // 開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時纔會打印。
  appId: '', // 必填,公衆號的唯一標識
  timestamp: , // 必填,生成簽名的時間戳
  nonceStr: '', // 必填,生成簽名的隨機串
  signature: '',// 必填,簽名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

後臺java調用

package com.cciinet.shop.controller.common.wechat;

import com.alibaba.fastjson.JSONObject;
import com.cciinet.shop.util.HttpRequest;
import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.UUID;

/**
 * @Author: 
 * @Date: 2020/6/10
 * @ClassName: Sign
 * @Description: TODO
 **/
@Slf4j
public class Sign {
    /**
     * jsSdk 獲取微信config
     *
     * @param url
     * @return
     */
    public  JsSdk sign(String url,String appId, String appsecret) {
        String jsapi_ticket = getJsapiTicket(appId,appsecret);
        JsSdk jsSdk = new JsSdk();
        jsSdk.setAppid(appId);
        jsSdk.setUrl(url);
        String nonce_str = create_nonce_str();
        jsSdk.setNoncestr(nonce_str);
        String timestamp = create_timestamp();
        jsSdk.setTimestamp(timestamp);
        String signature = "";
        //注意這裏參數名必須全部小寫,且必須有序
        String string1 = "jsapi_ticket=" + jsapi_ticket +
                "&noncestr=" + nonce_str +
                "&timestamp=" + timestamp +
                "&url=" + url;
        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
            jsSdk.setSignature(signature);
        } catch (NoSuchAlgorithmException e) {
            jsSdk = null;
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            jsSdk = null;
            e.printStackTrace();
        }
        return jsSdk;
    }

    /**
     * 生成隨機數
     *
     * @return
     */
    private static String create_nonce_str() {
        return UUID.randomUUID().toString().substring(0, 20);
    }

    /**
     * 當前日期字符串生成
     *
     * @return
     */
    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }

    /**
     * @param hash
     * @return
     */
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }

    public  String getJsapiTicket(String appId, String appsecret) {
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token";
        String params = "grant_type=client_credential&appid=" + appId + "&secret=" + appsecret+ "";
        String result = HttpRequest.sendGet(requestUrl , params);
        String access_token = JSONObject.parseObject(result).getString("access_token");
        requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
        params = "access_token=" + access_token + "&type=jsapi";
        result = HttpRequest.sendGet(requestUrl , params);
        String jsapi_ticket = JSONObject.parseObject(result).getString("ticket");
        log.info("jsapi_ticket=" + jsapi_ticket);
        return  jsapi_ticket;
    }

    public static void main(String[] args) {
        Sign sign = new Sign();
        String appId = "";
        String appSecret = "";
//        String jsapiTicket = sign.getJsapiTicket(appId, appSecret);
//        System.out.println(jsapiTicket);
        String url = "";
        JsSdk jsSdk = sign.sign(url, appId, appSecret);
        System.out.println(jsSdk.toString());
    }
}

其中main方法裏輸入自己公衆號的appid,secret,和分享要調用的url。調用即可拿到返回值。 大坑來了,我的問題是用後代代碼生成的signature和用微信在線調試工具生成的signature是一樣的。
微信在線調試地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
但仍然提示簽名錯誤。奇了怪了。
最後發現是我程序後臺調用生成簽名傳入的url不對。
傳入的url應該是當前要分享的頁面的完整url,網上還有好多說要在url後邊加上個“/”個,這個也不對,不應該加斜槓的。
總結一下: 這個報簽名不對的原因,並不是後臺代碼調用微信接口返回signature和在線微信調試生成的signature對不上。而是實際調用微信接口頁面地址和生成簽名傳入的url對不上導致的。
看下接口說明,後臺調用微信接口的文檔沒找到o(╯□╰)o
這裏明確說明了是發起頁面的完整url.。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章