vite+ts+uniapp实现公众号授权登录
·
官方链接:微信网页开发 / 网页授权
前提:
在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头
流程概述
在需要授权登录的地方跳转官方给的链接从而获取code,拿到code后调用后端接口从而获取token即可。
步骤如下
官方给的链接(此链接可以由接口获取,也可以自己写死)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数说明:
Tip:前端最主要了解的就是redirect_uri和scope
redirect_uri:就是跳转官方给的链接后,官方需要跳回来的页面。
scope:可以理解为是否是静默登录;
值为snsapi_base无需用户点击授权直接跳到官网链接拿取code之后直接跳转回来,页面相当于会闪一下;
值为snsapi_userinfo是需要用户点击同意授权才会跳转官网链接拿取code值

主要代码
@/src/composables/useSetWechatToken.ts
import { getCurlOauth, getOpenidByCode } from "@/api/user"; //改成自己封装的api请求即可
import { useTokenStore } from "@/store/index"; //自己封装的store,用作存储token
async function setTokenHandler(redirect_url) {
const token = uni.getStorageSync("token");
// #ifdef H5
var url = window.location.href;
var theRequest: Record<string, string> = {};
if (url.indexOf("?") != -1) {
var str = url.substr(url.indexOf("?") + 1);
var strs = str.split("&");
for (var i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
}
}
if (theRequest.code) {
// 存在code时,调用接口获取token
// 使用code和state调用接口获取普通用户的token
// 后端获取toekn的接口根据自己的项目更换即可
let res = await getOpenidByCode({
code: theRequest.code,
state: theRequest.state,
});
let { data } = res;
let token = data.token.token;
const tokenStore = useTokenStore();
await tokenStore.setToken(token);
// 存储token后,根据自己的项目需求写自己的逻辑即可
return;
}
if (!token) {
//没有token 时,获取跳转链接让用户授权公众号登录获取code
getCurlOauthHandler();
return;
}
// 存在token时,根据自己的项目需求写自己的逻辑即可
// #endif
}
// 获取公众号授权链接并跳转(可根据项目而定)
async function getCurlOauthHandler(redirect_url) {
let redirect_uri = redirect_url || `自己项目的域名/pages/xxx/xxx`;
let params = { mode: 0, source: redirect_uri };
let res = await getCurlOauth(params);
let { auth_url } = res.data;
window.location = auth_url;
}
export default setTokenHandler;
在需要的页面使用
import setWechatToken from "@/composables/setWechatToken";
onShow(async () => {
//可能不止一个页面需要登录,所以要将此页面的路径传过去
let redirect_url = `${项目域名}/pages/xxx/xxx`;
setWechatToken(redirect_url); //设置token新用户直接跳到注册页面
});
更多推荐



所有评论(0)