公众号后台,每一个帐号只能授权给两个域名,用户授权登录验证,这对于小项目来说足够了,一个h5,一个pc,两个域名足够应付了,但是如果大型企业,拥有多个项目,又分别是不同的二级域名,都需要调用微信授权,那么就不够了。
网上我也搜了下,基本上都是把授权单独做一个项目,所以需要授权的项目都去请求此项目,然后由此项目再去请求微信客户端,最后返回用户信息,再返回到请求的项目中。
这样一个逻辑就比较麻烦了,我也是结合自己项目中实际需求,找到一个最简单的实现办法,整体思路也是新建一个单独项目,这个项目并不直接参与微信的授权,仅仅是接受redirect_uri之后的请求,即所有项目中发送微信的请求,仍然是请求微信,但是redirect_uri这个参数,跳转到这个授权项目中。
这样,只要在公众号后台,只填写一个授权项目的域名即可,具体代码如下了。
以下是代码是node+ts写的,要用到express中路由功能部分,其他语言也是同样的原理。
授权项目,只要新建这样一个路由,没错,就这样一个路由即可。
假设此项目域名是 https://auth.shuanghei.com
import express from 'express'
import { Request, Response, NextFunction } from 'express'
import {decrypt} from '@/utils/crypto'
const Router = express.Router()
Router.get('/:url', (req: Request, res: Response, next: NextFunction) => {
res.redirect(`${decrypt (req.params.url)}?code=${req.query.code}&state=${req.query.state}`)
})
export default Router
url参数是在实际请求微信认证后,redirect_uri参数传递过来的,但是这个url需要加密一下,否则参数中有url字符串会显示错误,加密后就是只有数字和英文了,就不会报错。
在需要发送微信认证的项目中,redirect_uri所需要传递的参数必须这样设置。
let callback = encodeURIComponent(`https://auth.shuanghei.com/wx/gongzhonghao/
${encrypt(location.href.split('?')[0])}`)
这样在auth项目中就可以通过:url这params参数获得,然后再跳转到原请求页面即可,后续逻辑在原页面进行处理。
至此完美实现微信授权多域名的问题,亲测有效。