微信网页开发JS-SDK说明文档之通过config接口注入权限验证配置
根据步骤完成步骤一和二,今天主要讲的是步骤三
先上代码,根据代码说流程
get_data () {
var that = this
var urlNow = encodeURIComponent('需要调用Api的静态页面路径')
that.$ajax({
method: 'post',
url: 'api/auth/wechat/scanQRCode',
headers: {
contentType: 'application/json'
},
data: {
url: urlNow
}
}).then((res) => {
if (res.data.return_code === 0) {
this.appId = res.data.data.appid
this.timestamp = res.data.data.timestamp
this.noncestr = res.data.data.noncestr
this.url = res.data.data.url
this.sign = res.data.data.sign
this.scanQRCode()
} else {
MessageBox('提示', '关注失败');
}
}).catch((err) => {
console.log(err)
})
},
scanQRCode () {
wx.config({
debug: false, // 调试阶段建议开启
appId: this.appId,
timestamp: this.timestamp,
nonceStr: this.noncestr,
url: this.url,
signature: this.sign,
jsApiList: [
/*
* 所有要调用的 API 都要加到这个列表中
* 这里以图像接口为例
*/
'scanQRCode',// 扫描二维码
'updateAppMessageShareData'
]
})
wx.ready(function () { //需在用户可能点击分享按钮前就先调用
wx.updateAppMessageShareData({
title: 'Young-G秘诀,90后创业发家的秘籍', // 分享标题
desc: '2019年最有趣的赚钱方法都在这里,告诉你什么叫,躺着就把钱赚了,快点击查看~', // 分享描述
link: 'http://front.llldou.cn/home', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: '', // 分享图标
success: function () {
// 设置成功
}
})
})
/* 处理失败验证 */
wx.error(function (res) {
// config 信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名
// alert('配置验证失败: ' + res.errMsg)
})
}
分享接口在config之后的ready接口直接调用,扫描二维码手动调的话就写在调用的方法里,复制wx.方法名即可
以上代码最重要的不是config中的,反而是get_data方法中的,因为只要config所需的参数没问题,config验证才会通过,只要config验证通过,sdk中提供的功能就能随便用
规则如下:

接下来说config每个参数生成的方法,先上代码
"""
vue页面调用微信扫码功能接口
"""
@auth.route("/wechat/scanQRCode", methods=['GET', "POST"])
def scanQRCode():
url = parse.unquote(request.get_json()['url'])
noncestr, timestamp, sign, url = get_wx_conf_bk(url)
appId = current_app.config["WECHAT_APP_ID"]
data = {"appid":appId, "timestamp":timestamp, "noncestr":noncestr, "sign":sign, "url":url}
return json_response(0,data=data)
def get_wx_conf_bk(url):
ticket = get_wechat_ticket()
print(ticket)
noncestr = random_str(16)
timestamp = int(time.time())
data = "jsapi_ticket={ticket}&noncestr={noncestr}×tamp={timestamp}&url={url}".format(
ticket=ticket, noncestr=noncestr, timestamp=timestamp, url=url)
sha1 = hashlib.sha1()
sha1.update(data.encode('utf-8'))
// 签名是通过将ticket,noncestr:16位随机字符串,时间戳,url:调用页面网页路径拼接的字符串通过encode为utf-8格式进行sha1.hexdigest() sha1加密生成的
sign = sha1.hexdigest()
return noncestr, timestamp, sign, url
// 判读是否存在ticket,不存在则重新获取
def get_wechat_ticket():
ticket = get_file_content("jsapi_ticket")
if not ticket:
access_token = get_file_content('access_token')
if not access_token:
res = requests.get(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={appsecret}".format(
appid=current_app.config['WECHAT_APP_ID'], appsecret=current_app.config['WECHAT_APP_SCRECT']))
res = res.json()
access_token = res.get("access_token")
if not access_token:
current_app.log.error(str(res))
raise Exception("error config")
access_token, expires_in = res.get('access_token'), res.get('expires_in')
set_file_content("access_token", access_token, expires_in)
res = requests.get(
"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={access_token}&type=jsapi".format(
access_token=access_token))
res = res.json()
if res['errcode'] != 0:
current_app.log.error(str(res))
raise Exception("error access_token")
ticket, expires_in = res.get('ticket'), res.get('expires_in')
return ticket
// 判断ticket是否过期,已过期则让get_wechat_ticket通过重新获取token再重新获取ticket
def get_file_content(name):
if os.path.exists(WECHAT_APP_PATH[name]):
with open(WECHAT_APP_PATH[name], 'rb') as f:
exprie_time = pickle.load(f)
if exprie_time > int(time.time()):
return pickle.load(f)
return None
可能会出现的错误(爬坑史)
1.如果出现一直报签名错误的话记得用开发文档底部的验证工具验证一下,验证无误还是报签名的错的话,请检查域名是否已添加到微信公众平台“公众号设置”的“功能设置”里“JS接口安全域名”,即步骤一
2.若出现android手机正常调用,ios手机无法调用的情况,请尝试将跳转获取config配置的页面采用window.location.href的方法跳转,具体原因大概是ios系统跳转页面不会重新加载js(非官方用语...)