You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
6.0 KiB
240 lines
6.0 KiB
2 years ago
|
/**
|
||
|
* Wechat v1.2.1
|
||
|
* @Class Wechat
|
||
|
* @description shopro-wechat 1.2.1 wehcat第三方登录组件
|
||
|
* @Author lidongtony
|
||
|
* @Date 2022-12-12
|
||
|
* @Email lidongtony@qq.com
|
||
|
*/
|
||
|
import api from "@/shopro/request/index";
|
||
|
import $platform from "@/shopro/platform";
|
||
|
import store from "@/shopro/store";
|
||
|
import {
|
||
|
API_URL
|
||
|
} from "@/env";
|
||
|
|
||
|
export default {
|
||
|
eventMap(event) {
|
||
|
let map = "";
|
||
|
switch (event) {
|
||
|
case "login":
|
||
|
map = "登录中...";
|
||
|
break;
|
||
|
case "refresh":
|
||
|
map = "更新中...";
|
||
|
break;
|
||
|
case "bind":
|
||
|
map = "绑定中...";
|
||
|
break;
|
||
|
}
|
||
|
return map;
|
||
|
},
|
||
|
|
||
|
async login(payload) {
|
||
|
let token = "";
|
||
|
// #ifdef MP-WEIXIN
|
||
|
token = await this.wxMiniProgramOauth("login", payload);
|
||
|
return token;
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
this.wxOfficialAccountOauth("login");
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
token = await this.wxOpenPlatformOauth("login");
|
||
|
return token;
|
||
|
// #endif
|
||
|
},
|
||
|
async refresh() {
|
||
|
let token = "";
|
||
|
// #ifdef MP-WEIXIN
|
||
|
token = await this.wxMiniProgramOauth("refresh");
|
||
|
return token;
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
this.wxOfficialAccountOauth("refresh");
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
token = await this.wxOpenPlatformOauth("refresh");
|
||
|
return token;
|
||
|
// #endif
|
||
|
},
|
||
|
async bind(payload) {
|
||
|
let token = "";
|
||
|
// #ifdef MP-WEIXIN
|
||
|
token = await this.wxMiniProgramOauth("bind", payload);
|
||
|
return token;
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
this.wxOfficialAccountOauth("bind");
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
token = await this.wxOpenPlatformOauth("bind");
|
||
|
return token;
|
||
|
// #endif
|
||
|
},
|
||
|
|
||
|
// #ifdef H5
|
||
|
// 微信公众号网页登录&刷新头像昵称&绑定
|
||
|
wxOfficialAccountOauth(event = "login") {
|
||
|
if ($platform.get() !== "wxOfficialAccount") {
|
||
|
uni.showToast({
|
||
|
title: "请在微信浏览器中打开",
|
||
|
icon: "none"
|
||
|
});
|
||
|
throw false;
|
||
|
}
|
||
|
let host = $platform.host();
|
||
|
let payloadObject = {
|
||
|
host: host,
|
||
|
event,
|
||
|
token: (event !== "login" && store.getters.isLogin) ? uni.getStorageSync("token") : ""
|
||
|
};
|
||
|
let payload = encodeURIComponent(JSON.stringify(payloadObject));
|
||
|
let redirect_uri = encodeURIComponent(`${API_URL}user/wxOfficialAccountOauth?payload=${payload}`);
|
||
|
let oauthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + store.getters.initWechat.appid +
|
||
|
`&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=1`;
|
||
|
uni.setStorageSync("lastPage", window.location.href);
|
||
|
window.location = oauthUrl;
|
||
|
},
|
||
|
|
||
|
// 微信公众号网页静默登录:临时登录获取OpenId 不入库不绑定用户
|
||
|
wxOfficialAccountBaseLogin() {
|
||
|
let state = encodeURIComponent(window.location.href);
|
||
|
window.location = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + store.getters.initWechat
|
||
|
.appid +
|
||
|
`&redirect_uri=${API_URL}user/wxOfficialAccountBaseLogin&response_type=code&scope=snsapi_base&state=${state}`;
|
||
|
throw "stop";
|
||
|
},
|
||
|
// #endif
|
||
|
|
||
|
// #ifdef APP-PLUS
|
||
|
// 微信开放平台登录
|
||
|
async wxOpenPlatformOauth(event = "login") {
|
||
|
let that = this;
|
||
|
const loginResult = await uni.login({
|
||
|
provider: 'weixin',
|
||
|
onlyAuthorize: true,
|
||
|
});
|
||
|
if (loginRes.errMsg !== 'login:ok') {
|
||
|
uni.showToast({
|
||
|
title: loginRes.errMsg,
|
||
|
icon: 'none',
|
||
|
});
|
||
|
return Promise.reject('');
|
||
|
}
|
||
|
const authResult = loginRes.authResult;
|
||
|
const res = await api("user.wxOpenPlatformOauth", {
|
||
|
authResult,
|
||
|
event
|
||
|
}, that.eventMap(event));
|
||
|
if (res.code === 1) {
|
||
|
return Promise.resolve(res.data.token);
|
||
|
} else {
|
||
|
uni.showToast({
|
||
|
title: res.msg,
|
||
|
icon: 'none',
|
||
|
});
|
||
|
}
|
||
|
return Promis.reject('');
|
||
|
},
|
||
|
// #endif
|
||
|
|
||
|
// #ifdef MP-WEIXIN
|
||
|
// 微信小程序静默登录
|
||
|
async getWxMiniProgramSessionKey(autoLogin = true) {
|
||
|
const loginResult = await uni.login();
|
||
|
if (loginResult[1].errMsg !== 'login:ok') {
|
||
|
uni.showToast({
|
||
|
title: loginResult[1].errMsg,
|
||
|
icon: "none"
|
||
|
});
|
||
|
return Promise.reject(loginResult[1].errMsg);
|
||
|
}
|
||
|
|
||
|
const res = await api("user.getWxMiniProgramSessionKey", {
|
||
|
code: loginResult[1].code,
|
||
|
autoLogin: autoLogin
|
||
|
});
|
||
|
if (res.code === 1) {
|
||
|
uni.setStorageSync("session_id", res
|
||
|
.data.session_id);
|
||
|
if (autoLogin) {
|
||
|
if (res.data.token) {
|
||
|
return Promise.resolve(res.data.token);
|
||
|
} else {
|
||
|
return Promise.resolve('');
|
||
|
}
|
||
|
}
|
||
|
return Promise.resolve(res.data.session_id);
|
||
|
} else {
|
||
|
return Promise.reject(res.msg);
|
||
|
}
|
||
|
|
||
|
},
|
||
|
|
||
|
// 微信小程序获取用户手机号登录
|
||
|
async wxMiniProgramOauth(event = "login", payload) {
|
||
|
let that = this;
|
||
|
uni.showLoading({
|
||
|
title: that.eventMap(event)
|
||
|
});
|
||
|
if (payload.detail.errMsg !== 'getPhoneNumber:ok') {
|
||
|
uni.showToast({
|
||
|
title: payload.detail.errMsg,
|
||
|
icon: "none"
|
||
|
});
|
||
|
return Promise.reject(payload.detail.errMsg);
|
||
|
}
|
||
|
|
||
|
const res = await api("user.wxMiniProgramOauth", {
|
||
|
event,
|
||
|
code: payload.detail.code,
|
||
|
iv: payload.detail.iv,
|
||
|
encryptedData: payload.detail.encryptedData,
|
||
|
session_id: uni.getStorageSync("session_id"),
|
||
|
});
|
||
|
|
||
|
if (res.code === 1) {
|
||
|
return Promise.resolve(res.data.token);
|
||
|
} else {
|
||
|
uni.removeStorageSync("session_id");
|
||
|
that.getWxMiniProgramSessionKey(false);
|
||
|
return Promise.resolve(false);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// 小程序更新
|
||
|
checkMiniProgramUpdate() {
|
||
|
if (uni.canIUse("getUpdateManager")) {
|
||
|
const updateManager = uni.getUpdateManager();
|
||
|
updateManager.onCheckForUpdate(function (res) {
|
||
|
// 请求完新版本信息的回调
|
||
|
if (res.hasUpdate) {
|
||
|
updateManager.onUpdateReady(function () {
|
||
|
uni.showModal({
|
||
|
title: "更新提示",
|
||
|
content: "新版本已经准备好,是否重启应用?",
|
||
|
success: function (res) {
|
||
|
if (res.confirm) {
|
||
|
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
|
||
|
updateManager.applyUpdate();
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
updateManager.onUpdateFailed(function () {
|
||
|
// 新的版本下载失败
|
||
|
uni.showModal({
|
||
|
title: "已经有新版本了哟~",
|
||
|
content: "新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~"
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
// #endif
|
||
|
|
||
|
|
||
|
};
|