如图配置两个参数:javascript
url:配置一个后台接口,微信会带4个参数访问这个接口,后台须要拿到参数作验证后返回参数中的echostr才能验证成功前端
token: 自定义的字符串,后台作验证时须要用到java
如图配置的话微信的访问连接以下:web
http://245691q6b5.zicp.vip/wx...后端
//http://245691q6b5.zicp.vip/wx接口操做以下 //个人后台使用koa2 router.get('/wx', async (ctx, next) => { //1.解析参数 const querystring = ctx.querystring; const tokenParams = getParams(querystring); const signature = tokenParams['signature']; const echostr = tokenParams['echostr']; const timestamp = tokenParams['timestamp']; const nonce = tokenParams['nonce']; const token = 'wanglaowu'; //如图配置的自定义token //2.token, timestamp, nonce排序后的字符串经过sha1加密 let str = [token, timestamp, nonce].sort().join(''); let sha = sha1(str); //3.加密后的字符串和signature比对,若是相等说明是微信的访问,返回echostr,便可验证成功,返回其余值验证失败。 if (sha == signature) { ctx.body = echostr; } else { ctx.body = 'wrong'; } //ps:能够不进行验证直接返回echostr也能够验证成功,但不建议这样作。 }) function getParams(querystring) { const rs = {} const kvArr = querystring.split('&'); kvArr.forEach(item => { const temp = item.split('=') const key = temp[0]; const val = temp[1]; rs[key] = val }) return rs }
作好这些准备后,点击提交会有配置成功的提示。api
如图不须要http://或https://,点击提交便可安全
router.get('/wxapiconfig', async (ctx, next) => { //1.获取accessToken,用于获取访问wx的api的凭证; const accessToken = await getAccessToken() //2.获取jsapiTicket 用于访问wx的api的凭证 const jsapiTicket = await getJsapiTicket(accessToken) //3.生成时间戳和随机字符串 const nonceStr = randomString(16)//随机字符串 const timestamp = (Date.now()/1000).toFixed();//时间戳 const url = 'http://245691q6b5.zicp.vip/wx' //4.按照微信官方要求拼接字符串 const str = `jsapi_ticket=${jsapiTicket}&noncestr=${nonceStr}×tamp=${timestamp}&url=${url}` //5.sha1加密后得到signature参数 const signature = sha1(str); //6.经过官方工具验证signature的正确性://https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign //7.将参数返给前端 ctx.body = JSON.stringify({ jsapiTicket, nonceStr, timestamp, signature, jsApiList: ['updateAppMessageShareData'] //须要请求的接口,也能够在前端使用时增长此参数 }) }) function getAccessToken() { const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}` return Superagent.get(url).then(res => { return JSON.parse(res.text).access_token }) } function getJsapiTicket(accessToken) { const url = `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${accessToken}&type=jsapi` return Superagent.get(url).then(res => { return JSON.parse(res.text).ticket }) } function randomString(len) { len = len || 32; var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; var maxPos = chars.length; var pwd = ''; for (i = 0; i < len; i++) { pwd += chars.charAt(Math.floor(Math.random() * maxPos)); } return pwd; }
wx.config({ debug: true, // 开启调试模式,调用的全部api的返回值会在客户端alert出来,若要查看传入的参数,能够在pc端打开,参数信息会经过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的惟一标识 timestamp: , // 必填,生成签名的时间戳(上一步中后端返回的参数) nonceStr: '', // 必填,生成签名的随机串(上一步中后端返回的参数) signature: '',// 必填,签名(上一步中后端返回的参数) jsApiList: [] // 必填,须要使用的JS接口列表(上一步中后端返回的参数,也可在前端配置此参数) });