node服务器-微信jssdk-授权
微信官方授权
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
开发准备
1.填写服务器配置
2.验证消息的确来自微信服务器
3.node服务器配置
var express = require('express');
var compression = require('compression');
const {createHash}= require('crypto');
const encrypt = (algorithm, content) => {
let hash = createHash(algorithm)
hash.update(content)
return hash.digest('hex')
}
const sha1 = (content) => encrypt('sha1', content)
var app = express()
app.all("*",function(req,res,next){
//设置允许跨域的域名,*代表允许任意域名跨域
res.header("Access-Control-Allow-Origin","*");
//允许的header类型
res.header("Access-Control-Allow-Headers","content-type");
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods","POST,GET,OPTIONS");
if (req.method.toLowerCase() == 'options')
res.sendStatus(200); //让options尝试请求快速结束
else
next();
})
var apiRoutes = express.Router();
apiRoutes.get('/WxToken', function (req, res) {
if(req.query.signature){
var signature = req.query.signature;//微信加密签名
var timestamp = req.query.timestamp;//时间戳
var nonce = req.query.nonce;//随机数
var echostr = req.query.echostr;//随机字符串
var token = 'wxToken'; // wxToken 微信令牌token 手动配置
var str = [token,timestamp,nonce].sort().join('');//排序
var tmpStr = sha1(str);//sha1加密
//如果 tmpStr 等于 微信signature 校验成功
if(tmpStr == signature){
res.send(echostr);
}else{
return false
}
}
});
app.use('/api', apiRoutes)
app.use(compression())
app.use(express.static('./wxjssdk'))
var port = 80;
module.exports = app.listen(port, function (err) {
if (err) {
console.log(err)
return
}
console.log('服务器已启动:'+port)
})
验证成功之后,启用服务
微信授权
第一步:用户同意授权,获取code
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。
常见错误信息
10003: 前往微信公众平台->设置->域名 配置相关域名
第二步:通过code换取网页授权access_token
获取code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
正确返回数据
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
第三步:刷新access_token(如果需要)
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
获取第二步的refresh_token后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
返回值同第二步
第四步:拉取用户信息(需scope为 snsapi_userinfo)
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
请求方法
http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
返回值
{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
附:检验授权凭证(access_token)是否有效
http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID