详解基于Node.js的微信JS-SDK后端接口实现代码

2020-06-17 06:52:34易采站长站整理

if (!err && success) {
console.log(' === 缓存已过期,从服务器中读取access_token: ' + access_token + ' ===')
cb1(null, access_token)
} else {
cb1(err || 'cache设置access_token时,出现未知错误')
}
})
} else {
cb1('1.3获取from_where时,from_where值为空')
}
})

waterfall(steps1, (err, access_token) => {
cb(err, access_token)
})
})

// 第二步,获取ticket
steps.push((access_token, cb) => {
let steps1 = []

// 第2.1步,从缓存中读取ticket
steps1.push((cb1) => {
let ticket = cache.get('ticket', (err, ticket) => {
cb1(err, ticket)
})
})

// 第2.2步,缓存中有ticket则直接返回,如果没有,则从服务器中读取ticket
steps1.push((ticket, cb1) => {
if (ticket) {
cb1(null, ticket, 'from_cache')
} else {
request('https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' + access_token + '&type=jsapi', (err, response, body) => {
cb1(err, JSON.parse(body).ticket, 'from_server')
})
}
})

// 第2.3步,如果新从服务器取的ticket,则缓存起来,否则直接返回
steps1.push((ticket, from_where, cb1) => {
if (from_where === 'from_cache') {
console.log(' === 成功从缓存中读取ticket: ' + ticket + ' ===')
cb1(null, ticket)
} else if (from_where === 'from_server') {
cache.set('ticket', ticket, (err, success) => {
if (!err && success) {
console.log(' === 缓存已过期,从服务器中读取ticket: ' + ticket + ' ===');
cb1(null, ticket)
} else {
cb1(err || 'cache设置ticket时,出现未知错误')
}
})
} else {
cb1('2.3获取from_where时,from_where值为空')
}
})

waterfall(steps1, (err, ticket) => {
cb(err, ticket)
})
})

// 第三步,生成签名
steps.push((ticket, cb) => {
let jsapi_ticket = ticket
let nonce_str = '123456'
let timestamp = new Date().getTime()
let url = req.query.url

let str = 'jsapi_ticket=' + jsapi_ticket + '&noncestr=' + nonce_str + '&timestamp=' + timestamp + '&url=' + url
let signature = sha1(str)

cb(null, {
appId: appid,
timestamp: timestamp,
nonceStr: nonce_str,
signature: signature,
ticket: ticket
})
})

waterfall(steps, (err, data) => {
if (err) {
res.send({status: 'error', data: err})
} else {
res.send({status: 'success', data: data})
}
})
})

app.use('/wxJssdk/public', express.static('public'))

app.listen(80, err => {
if(!err) console.log('connect succeed')
})