小程序、H5登录授权、分享、支付流程

router.get(’/getSession’, (req, res) => {
let code = req.query.code
if (!code) {
res.json(uril.handleFail(‘code不能为空’, 10001))
}
let sessionUrl = https://api.weixin.qq.com/sns/jscode2session?appid=${config.appId}&secret=${config.appSecret}&js_code=${code}&grant_type=authorization_code;
request(sessionUrl, (err, response, body) => {
let result = util.handleResponse(err, response, body)
res.json(result)
})
})复制代码
登录接口 的编写

// 小程序授权登录
router.get(’/login’,async function(req,res){
let userInfo = JSON.parse(req.query.userInfo);
if (!userInfo){
// 如果接口没有信息,则返回错误信息
res.json(util.handleFail(‘用户信息不能为空’,10002))
}else{
// 查询当前用户是否已经注册
let userRes = await dao.query({ openid: userInfo.openid},‘users_mp’);
if (userRes.code == 0){
// 如果已经注册,直接把查出来的信息返回给客户端
if (userRes.data.length >0){
res.json(util.handleSuc({
userId: userRes.data[0]._id
}))
}else{
// 如果这个用户之前没有注册,则在数据库插入用户信息
let insertData = await dao.insert(userInfo,‘users_mp’);
if (insertData.code == 0){
let result = await dao.query({ openid: userInfo.openid }, ‘users_mp’);
res.json(util.handleSuc({
userId: result.data[0]._id
}))
}else{
res.json(insertData);
}
}
}else{
res.json(userRes);
}
}
})复制代码
上述代码的 handleFail 和 handleResponse 是封装的对数据的统一处理,如果有兴趣,参见 github 地址。这里不展示代码。

需要注意的是,这种实现方式,获取 openid 的行为放在后端实现了。如果放在前端实现也可以,但是会相对比较麻烦一点。此时,suerId就已经在数据库存储,并且在本地保存了,下次登录的时候,如果有userId存在就不需要再次登录了。

H5的登录授权和分享流程

H5的登录授权略有不同。如果用户登录授权页面,发现该用户没有登录授权,则需要跳转到授权页面。 官方文档 给出的流程如下:

1 第一步:用户同意授权,获取code2 第二步:通过code换取网页授权access_token3 第三步:刷新access_token(如果需要)4 第四步:拉取用户信息(需scope为 snsapi_userinfo)5 附:检验授权凭证(access_token)是否有效

在项目中代码如下:(这里代码没有实现刷新access_token和拉取用户信息)

页面加载的时候,判断是否已经授权。

mounted(){
this.checkUserAuth();
},
methods:{
// 检查用户是否授权过
checkUserAuth(){
let openId = this.$cookie.get(‘openId’);
if(!openId){
// 如果没有登录授权,则跳转到微信提供的跳转页面。
window.location.href = API.wechatRedirect;
}else{
// 如果用户已经授权,则调用获取微信配置信息接口
this.getWechatConfig();
}
},复制代码
API.wechatRedirect:

wechatRedirect:’/api/wechat/redirect?url=http%3A%2F%2Fm.51purse.com%2F%23%2Findex&scope=snsapi_userinfo’,复制代码
「注意」

url地址需要 encodeURIComponent 编码才可以。
m.51purse.com 需要与你在微信公众号后台配置的 授权域名 一致!
nodejs 对登录授权回调接口的实现主要是拿到客户端的请求参数,请求微信提供的 接口

// 用户授权重定向
router.get(’/redirect’,function (req,res) {
let redirectUrl = req.query.url, scope = req.query.scope, callback = ‘http://m.51purse.com/api/wechat/getOpenId’;
cache.put(‘redirectUrl’, redirectUrl);
// 获取到客户端带过来的数据,请求微信接口
let authorizeUrl = https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.appId}&redirect_uri=${callback}&response_type=code&scope=${scope}&state=STATE#wechat_redirect;
res.redirect(autho

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值