Reactjs,微信公众平台, config:invalid signature一直爆这个错误的解决方法

本文介绍了解决iOS微信分享时出现的invalidsignature错误的方法。通过对比安卓与iOS的处理方式,提出使用页面初始URL来配置微信API的解决方案。

今天在做微信转发的时候,在微信开发工具中转发始终都是可以的,但是到ios手机上就不行,总是报invalid signature错误

问题描述:

单页面应用(使用pushState更新url),iOS 10或Android 6.0
同样的web代码和网址,
使用安卓访问,能正常调用微信API注册并分享;
使用iOS 10则注册失败,返回’invalid signature’
signature生成算法没有问题。(将输入和输出贴到微信提供的验证网页上,都一致)

调查发现:

安卓需要使用当前URL进行微信API注册(即当场调用location.href.split(’#’)[0])
iOS需要使用进入页面的初始URL进行注册,(即在任何pushstate发生前,调用location.href.split(’#’)[0])

解决(规避):

保存进入页面最初的URL,假设为INIT_URL
根据客户端的不同:
2.1 安卓:在准备分享前(或发生URL跳转后)使用当前URL进行wx.config, 如果失败,则尝试使用INIT_URL注册
2.2 iOS:在准备分享前(或发生URL跳转后)使用INIT_URL进行wx.config, 如果失败,则尝试使用当前URL注册

结论:

其实问题就是IOS微信里的current page url(微信右上角“复制链接”的结果)等于初始化进入页面的url,而用document.href获取却是真实的url,这样url不一样,导致签名失败。所以你使用INIT_URL解决了IOS里面的问题。

贴上我的代码

import React from 'react';
import './App.css';

class App extends React.Component {
    constructor() {
        super();
    }
   
    componentDidMount() {
       
        const init_url=window.location.href;
        if(init_url){
            sessionStorage.setItem('init_url',init_url);
        }
      
    }
  
//首先判断是否完成初始化
    render(){
       
        return (
            <div>
                {
                    this.state.initDone ? this.props.children : <div>正在加载</div>
                }
            </div>
        );
    }
}
export default App

export function jsSdkConfig(obj) {
    const host=config.DEV_URL;
    let token=util.storageToken();
    let u = window.navigator.userAgent;
    let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
    let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
    //安卓需要使用当前URL进行微信API注册(即当场调用location.href.split('#')[0])
    //iOS需要使用进入页面的初始URL进行注册,(即在任何pushstate发生前,调用location.href.split('#')[0])
   let url = '';
    if (isiOS) {
        if(sessionStorage.getItem("init_url")){
            url=encodeURIComponent(sessionStorage.getItem('init_url'))
        }else{
            url = encodeURIComponent(window.location.href.split('#')[0]);
        }
        //url = encodeURIComponent(`http://www.qq.com/home/index?op=${window.sessionStorage.getItem('option')}`);//获取初始化的url相关参数
    } else {
        url = encodeURIComponent(window.location.href.split('#')[0]);
    }
   //let url = encodeURIComponent(window.location.href.split('#')[0]);

    let time = Math.round(new Date().getTime() / 1000); //获取10位时间戳
    // alert(window.location.href.split('#')[0]);]
    alert(`${host}/service/wechat/forward?token=${token}&url=${url}`);

    axios.get(`${host}/service/wechat/forward?token=${token}&url=${url}`).then(function (response) {

        alert(response.data.data.appId);
        alert(response.data.data.timestamp);
        alert(response.data.data.nonceStr);
        alert(response.data.data.signature);
        alert(response.data.data.jsApiList);


        if (response.status === 200) {
            /*配置微信jssdk*/
            window.wx.config({
                debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: response.data.data.appId, // 必填,企业号的唯一标识,此处填写企业号corpid
                timestamp: response.data.data.timestamp, // 必填,生成签名的时间戳(10位)
                nonceStr: response.data.data.nonceStr, // 必填,生成签名的随机串,注意大小写
                signature: response.data.data.signature,// 必填,签名,见附录1(通过https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 验证)
                jsApiList: response.data.data.jsApiList // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
            });
            window.wx.ready(function () { //必须写在wx.ready里面
                var link =  obj.link||"";
                var imgPath =obj.img||"";  // 不大于300*300
                var title =obj.title||"";
                var desc = obj.desc||"";
                window.wx.onMenuShareTimeline({
                    title: title, // 分享标题
                    link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                    imgUrl: imgPath, // 分享图标
                    success: function () {
                    },
                    cancel: function () {
                    // 用户取消分享后执行的回调函数
                    }
                });
                window.wx.onMenuShareAppMessage({
                    title: title, // 分享标题
                    link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                    imgUrl: imgPath, // 分享图标
                    desc: desc,
                    success: function () {
                    },
                    cancel: function () {
                    // 用户取消分享后执行的回调函数
                    }
                });
            });
        }
    }).catch(function (errors) {
        console.log('errors', errors);
    });
}
这个错误提示是由于在Vue H5页面分享到微信时,分享链接的签名无效导致的。 在微信分享中,需要对分享链接进行签名,以确保链接的完整性和安全性。签名的原理是利用配置的appID、appSecret、noncestr(随机字符串)和timestamp(时间戳)等参数,通过特定的算法生成一个字符串,再将这个字符串进行加密得到签名signature。微信客户端在收到分享链接时,会根据这个签名来验证链接的合法性。 出现"invalid signature"的错误提示,通常是由以下几个原因导致的: 1. 参数配置错误:检查在使用微信分享API时,是否正确配置了appID和appSecret等参数。需要确保这些参数的值是有效的,并且与微信开放平台中的配置一致。 2. 签名生成错误:签名算法可能有误。可以参考微信提供的官方文档,了解签名算法的具体步骤和规则,确保在生成签名时没有遗漏或错误处理相关参数。 3. 随机字符串和时间戳:noncestr和timestamp参数可能未传递或传递错误。在生成签名时,需要使用正确的noncestr和timestamp值。 4. URL编码问题:分享链接中如果包含特殊字符或需要URL编码的字符,需要在生成签名时进行正确的编码处理。 如果还是无法解决错误,可以尝试在开发者工具中调试,查看具体的错误信息,以便定位问题所在。同时,可以参考微信开放平台的相关文档和社区中的讨论,寻找其他开发者遇到类似问题的解决方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值