真的是真的是,我都弄的崩溃了差点,卡了三天的问题,各种留言各种找人还是不行,为了不再让各位体验那种感觉,zkhh666我的wx
首先说,我用的hbuilderx的uni做的,使用了推荐的插件jweixin-module,
ps:**我的问题是url后面少了/,**因为会自动默认有/的,其他往下看,**我还遇到了url填当前页面不行,**但首页的就可以的为
很好的一个插件,首先是history和hash都可以的
我的后端用了集成的一个方法,说是经过检验,上百家企业用过的方法,所以一直不敢往他那边想问题,但还是怕他jsapi_ticket获取失败,一再让他检查是不是问题,因为看到一个帖子是这个问题,楼主都快急哭了(我已经急哭了)
再说一下我的问题:
1、使用了history
2、前后端分离,使用的测试公众号(看b站上都是一个人写,使用的也是自己公众号)所以没法照着写
3、我是由于url不正确导致的:(据说百分之八十都是)
4、对了有可能是encodeURI() 。需要编译一下(我是没用到)
alert(location.href.split(’#’)[0])我弹了一下,好家伙,url里面有个’/'没有加上,好了,直接上截图比较明显了
使用映射地址是可以的
好了再上代码,借鉴https://blog.csdn.net/weixin_39793790/article/details/108767478
jws.js文件
import request from './request.js' //请求
// jwx.js
//#ifdef H5
const jweixin = require('jweixin-module')
//#endif
export function configWeiXin(callback) {
//我弹了一下,真的管用 alert(location.href.split('#')[0])
//因为我没结构出来,太激动了,以后再说
request.request('/wechat/getJsapiTicket',{url: 'http://b7h4km.natappfree.cc/',appId: 'wx873ee40d6bbd9b4e'},'GET')
.then(res=>{
console.log(res,'调用原功能参数')
// 可能需要用到的能力 需要啥就写啥。多写也没有坏处
let apiList = [
'onMenuShareAppMessage',
'onMenuShareTimeline',
'hideOptionMenu',
'scanQRCode',
'showOptionMenu',
'chooseWXPay',
'checkJsApi',
'openLocation',
'getLocation',
'uploadImage',
'updateAppMessageShareData',
];
console.log(jweixin,res.result.timestamp,res.result.nonceStr,res.result.signature,apiList,'222222')
let info = {
// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
debug: true, // 调试是true,发布的时候改为false
appId: res.result.appId, // 必填,公众号的唯一标识
timestamp: res.result.timestamp, // 必填,生成签名的时间戳
nonceStr: res.result.nonceStr, // 必填,生成签名的随机串
// signature: res.result.signature.toLowerCase(),// 必填,签名
signature: res.result.signature,// 必填,签名
jsApiList: apiList
};
jweixin.config(info);
jweixin.error(err => {
console.log('config fail:', err);
});
jweixin.ready(res => {
if (callback) callback(jweixin);
});
})
.catch(err=>{
console.log(err,'调用签名错误拉!')
})
}
vue页面里面
import * as jwx from '../../utils/jws.js'
methods: {
fn(val){
console.log(wx.config)
console.log(jwx.configWeiXin)
switch(val){
case '调用扫码':
jwx.configWeiXin(jweixin => {
jweixin.scanQRCode({
needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
success: function (res) {
console.log(res)
var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
},
fail: function (err){
console.log(err)
}
});
})
break
}
},
}
先贴一下排查方法吧,下面再说问题:
invalid signature签名错误建议按如下顺序检查:
(1)确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
(2)确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。
(3)确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。
(4)确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
(5)确保一定缓存access_token和jsapi_ticket。
(6)确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。