微信JSSDK,分享代码安卓正常, IOS出现config fail是怎么回事

<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js&quot;></script>

$.getJSON("http://******/Wxopen/signature?url="+window.location.href+"&callback=?",function(data){
$.each(data,function(k,v){
wx.config({
debug: true,
appId: '*****',
timestamp:v.time,
nonceStr:v.noncestr,
signature: v.signature,
jsApiList: [
'onMenuShareTimeline',//分享朋友圈
'onMenuShareAppMessage',//分享给好友
'onMenuShareQQ',//分享到QQ
'onMenuShareWeibo',//分享腾讯微博
]
});
});
});
var wxtitle="标题标题";//标题
var wxlink="";//默认为空
var wximg="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";//图标
var wxdesc="描述描述描述";//描述(分享给微信/QQ好友/微博时显示)
wx.ready(function () {
    wx.onMenuShareTimeline({
        title: wxtitle, // 分享标题
        link: wxlink, // 分享链接
        imgUrl: wximg, // 分享图标
        success: function () { 
            // 用户确认分享后执行的回调函数
        },
        cancel: function () { 
            // 用户取消分享后执行的回调函数
        }
    });
    wx.onMenuShareAppMessage({
        title: wxtitle,
        desc: wxdesc,
        link: wxlink,
        imgUrl: wximg,
        type: '', // 分享类型,music、video或link,不填默认为link
        dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
        success: function () {},
        cancel: function () {}
    });
    wx.onMenuShareQQ({
        title: wxtitle,
        desc: wxdesc,
        link: wxlink,
        imgUrl: wximg,
        success: function () {},
        cancel: function () {}
    });
    wx.onMenuShareWeibo({
        title: wxtitle,
        desc: wxdesc,
        link: wxlink,
        imgUrl: wximg,
        success: function () {},
        cancel: function () {}
    });
});

用微信 JS 接口签名校验工具已经验过签名没问题...为什么IOS不行呢, 就是安卓能用, IOS不行

debug:
"errorMsg":"config fail"
"checkResult":"onMenuShareTimeline:true,onMenuShareAppMessage:true,";" errMsg :checkJsApi:ok"

阅读 24.8k
12 个回答

我做过分享的SJSDK,安卓苹果都可以的。你可以在调用接口的时候弹出参数,一步一步去分析错误

具体为什么让微信JS-SDK的开发者来解答也肯定说不出来,因为这些接口的设计实在是太烂了。
我说几点很可能的原因吧,即使用微信JS接口签名校验工具已经验过也没什么软用...

1、timestamp字段的数据类型是string不是int类型,否则有时会报错
2、微信文档说全局access_tocken和jsapi_ticket的有效期为7200秒,其实是不确定的,我测试时大约在3、4千左右就失效了,得重新刷新...
3、要善于处理错误,如wx.errorGET方式请求获得jsapi_ticket错误提示

最后讲讲我在代码层面上做的一些自我修复的思想

首先,access_tocken和jsapi_ticket我都是全局缓存的,前后台都是javascript写的

1、用wx.error来捕获接口注入权限验证配置错误的异常

// 微信错误处理
// times用来统计配置发生错误的次数
// 错误时将刷新jsapi_ticket,最后再生成新的配置,三次未有成功将通过后台发短信通知开发人员
// 在这里获取配置有两种方式,POST和GET。
// GET是通过后台缓存的jsapi_ticket来生成配置的,POST将重新刷新jsapi_ticket后再生成配置
wx.error(function (err) {
  if (++times <= 2) { // 连续两次用新生成的ticket
    handleWx('POST', data, resolve, reject);
  } else {
    kit.notify('微信接口调用失败');
  }
});

2、后台做的错误处理

token = yield base.getAccessToken(); // 获取缓存的access_token
url = resource.genTicket(token.value); // 用获得的token生产请求url
response = yield request.get(url); // 向微信服务器请求ticket

try {
  ticket = JSON.parse(response.body);
} catch(error) {
  console.dir(error);
}

if (ticket.errcode === 0) { // 请求成功则将ticket缓存至全局
  ticket = setGlobalTicket(ticket);
} else if (ticket.errcode === 40001) { // access_token无效
  token = yield base.fetchAccessToken(resource.TOKEN); // 从微信拉取新的access_token
  base.setGlobalToken(token);
  ticket = yield getTicket(1);
}

============= 分割线 ============
最后附一段代码,感觉好可以借鉴,感觉烂就忽略

// 采用requirejs,kit是我自己写的辅助工具
/*eslint no-console: 0*/

define('wechat', ['lodash', 'jquery', 'kit', 'jweixin'
], function (_, $, kit, wx) {
  var exports = {}; // 对外暴露的对象

  var times = 0; // 统计微信接口调用错误的次数

  // promsie default reject
  var defalutReject = function (data) {
    kit.hideSmallLoading(function () {
      kit.showSmallTips(data.msg || '发生网络异常');
    });
  };

  // 处理微信
  function handleWx (method, data, resolve, reject) {
    kit.showSmallLoading('配置中');
    $.ajax({
      url: '/api/jsapi_auth',
      data: data,
      method: method,
      dataType: 'json'
    }).done(function (res) {
      if (res.err) return reject(res);
      wx.config(_.assign({ debug: false }, res)); // 微信认证配置
      kit.hideSmallLoading();
      // 微信错误处理
      wx.error(function (err) {
        if (++times <= 2) { // 连续两次用新生成的ticket
          handleWx('POST', data, resolve, reject);
        } else {
          kit.notify('微信接口调用失败');
        }
      });
      wx.ready(function () { resolve(wx); }); // 微信认证成功
    });
  }

  exports.JsApiAuth = function (url) {
    return new Promise(function (resolve, reject) {
      reject = defalutReject;
      handleWx('GET', { url: url }, resolve, reject);
    });
  };

  return exports;
});

// 具体调用
wxPromise = new (wechat.JsApiAuth)(location.href);
wxPromise.then(function (wx) {
  // callback
});

可能是引入的微信sdk-js文件的http和https的关系吧…

页面有其他的jquery 语法吧?

签名的url与你应用的url不一致,一般签名的url为web应用的域名就行了,然后你可以在这个web应用的任意地方调用分享。还有就是你的config没有配对,按照官方文档仔细检查一下就可以了。

生成签名的随机字符串和时间戳一样生成的签名安卓上可以用, 但是在IOS上就config:fail,没其它提示,哪怕用签名校验工具都验不出签名有什么问题, 随机字符串换成随机的字母就好了, 没苹果手机没测试是因为两个一样,还是因为随机字符是数字类型

新手上路,请多包涵

我的是报config:invalid signature 但是我的android 中不会报 只在ios中会报这个问题 一样的代码 这是什么情况啊 大神解答图片描述

新手上路,请多包涵

我刚刚解决这个问题 我的情况是签名正确 接口有权限 但是依然提示config:fail 但是当我找到原因的时候心里顿时一万匹草泥马奔腾而过。。。。。。前端传到wx.config里面的参数key是区分大小写的,比如你传递noncestr就会出错,传递nonceStr就正常。。。。。。

我遇到的情况是这样的:

  1. 我使用的是react单页应用

  2. 一开始我只是在内页(只有两个详情页)注册了分享的sdk,即上文的 wx.config

  3. 结果,内页在IOS下一直签名失败,报的同样也是 config:invalid signature

解决方案:

  • 我直接在首页也进行分享的签名,就解决了这个问题了。

我遇到的问题是安卓手机微信内分享正常,ios分享获取不到标题,描述和图标,但是域名,签名等验证是通过的,分享成功后的方法也执行了,不知道问题出在哪里。
图片描述
图片描述

新手上路,请多包涵

最有后没有解决?

感谢楼主和层主。
已经解决:
此处引用他们的对话

非常感谢, 蛋疼的, 居然是因为我的随机字符串和时间戳一样, 改成随机的字母就好了

是的。我 noncestr 之前用的是随机数字,安卓一直正常,Ios一直fail。
租后讲签名的 noncestr后面加了 'test',结果就正常了!!!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏