微信扫一扫错误提示realauthurl:xxx errmsg config:invalid signature

使用微信测试号 实现微信扫一扫功能时 出现的问题

1. 环境: springboot + js +微信测试号 + 花生壳穿透

2. 问题

ios系统 调用微信扫一扫时候出现 realauthurl:xxx errmsg config:invalid signature 错误
经过比对 生成和传递的signature 值是相同的,排除签名问题
微信 JS 接口签名校验:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
错误提示中有url 猜测是url 问题 , 一直没有搞懂这里的url到底是什么的url 。 此时的url应该是当前网页的url http://xxxx/xx.html
如果url是正确的会提示 errMsg: config:invalid url domain

3. 解决

url中从#号前边的都要有 通过js 获取当前网页的url

<script>
   		window.onload = function() {
   			var wx_invite_url = location.href.split('#')[0]; //获取当前网页的url !!!!
   			console.log("url",wx_invite_url);
   			$.get("jsapi/getSign",{url:wx_invite_url},function(data){

   				wx.config({
   				  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
   				  appId: data.appId, // 必填,公众号的唯一标识
   				  timestamp: data.timestamp, // 必填,生成签名的时间戳
   				  nonceStr: data.nonceStr, // 必填,生成签名的随机串
   				  signature: data.signature,// 必填,签名
   				  jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表
   				});
   				wx.error(function(res){
   					alert(res);
   					// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
   				});
   			});
   		}
   		function scaneMethod() {
   		 var ua = navigator.userAgent.toLowerCase()
   		 var isWeixin = ua.indexOf('micromessenger') !== -1
   		 if (!isWeixin) {
   		  alert('请用微信打开连接,才可使用扫一扫')
   		 }
   		 window.wx.scanQRCode({
   		 needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
   		 scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
   		 success: function (res) {
   		 // 扫码成功,跳转到二维码指定页面(res.resultStr为扫码返回的结果)
   		  var scan = res.resultStr
   		  alert(scan)
   		  }
   		 })}
   	</script>

完整的代码:

  1. 获取签名的接口:
@RequestMapping(value = "/getSign")
    @ResponseBody
    public Map tiaoma( HttpServletRequest request,String url) throws Exception {
        String Url=request.getRequestURL().toString();
        log.info("请求的url={}",Url);
        Map resMap = new HashMap();
        resMap = JsUtils.sign(url);
        log.info("=======map参数:{}",resMap);
        return resMap;

    }
  1. 签名的工具类 加密 获取token ticket … 直接修改appid appsecret 就可用
public class JsUtils {
    public static String accessToken = null;
    public static String ticket = null;


    private static final String appid=null;
    private static final String appsecret=null;

    public static Map sign(String url) {
        if(accessToken==null){
            String sendUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appsecret;

            String result = getHttpResult(sendUrl);
            JSONObject tokenJson = JSONObject.parseObject(result);
            accessToken= tokenJson.get("access_token").toString();
            log.info("toke={}",accessToken);
        }
        if(ticket==null){
            String signUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";

            String resultSign = getHttpResult(signUrl);
            JSONObject tokenJson = JSONObject.parseObject(resultSign);
            ticket= tokenJson.get("ticket").toString();
        }
        Map<String, Object> ret = new HashMap();

        String nonce_str = create_nonce_str();

        String timestamp = create_timestamp();

        String string1;

        String signature = "";

//注意这里参数名必须全部小写,且必须有序

        string1 = "jsapi_ticket=" + 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());

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();

        }

        ret.put("url", url);

        ret.put("nonceStr", nonce_str);

        ret.put("timestamp", Integer.parseInt(timestamp));

        ret.put("signature", signature);

        ret.put("jsapi_ticket", ticket);

        ret.put("appId", appid);

        return ret;

    }

    /**
     * 随机加密
     *
     * @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;

    }

    /*

     * 获取访问地址链接返回值

     */

    private static String getHttpResult(String url) {
        String result = "";

        HttpGet httpRequest = new HttpGet(url);

        try {
            HttpResponse httpResponse = HttpClients.createDefault().execute(httpRequest);

            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                result = EntityUtils.toString(httpResponse.getEntity());

            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();

            result = e.getMessage().toString();

        } catch (IOException e) {
            e.printStackTrace();

            result = e.getMessage().toString();

        }

        return result;

    }

    /**
     * 产生随机串--由程序自己随机产生
     *
     * @return
     */

    private static String create_nonce_str() {
        return UUID.randomUUID().toString();

    }

    /**
     * 由程序自己获取当前时间
     *
     * @return
     */

    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);

    }

}

微信测试号地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
微信js sdk 文档地址:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据你提供的引用内容,出现"config:fail,invalid signature"错误是因为微信分享的签名错误。根据引用和引用的信息,这个错误可能是由于没有正确解码或修改签名导致的。为了解决这个问题,你应该确保正确解码签名并进行相应的修改。 引用中提到了修改代码后的解决方案,你可以根据这个引用中给出的示例代码进行相应的修改。此外,引用中提到了使用VUE框架时出现类似错误的情况,你可能需要根据官方文档或其他资源来排查和解决问题。 综上所述,要解决微信分享出现"config:fail,invalid signature"错误,你需要确保正确解码签名并进行相应的修改,并可能需要参考相关的文档和资源来解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [微信分享报错:config:fail,invalid signature](https://blog.csdn.net/weixin_44312227/article/details/127636999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [微信分享invalid signature签名错误踩过的坑](https://download.csdn.net/download/weixin_38618315/13131031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值