orcrist-wechat
Version:
for Orcrist Wechat sdk
107 lines (89 loc) • 3.61 kB
text/typescript
import { getQueryMap, Toast } from "../utils/common";
import { msg } from "./msg";
import { WECHAT_REDIRECT_URL } from "../constants";
import { queryOpenID, queryUserInfo } from "../service";
/*
广州惠民保:wxf3a14e38ab145a0a
惠州惠民保:wx29f4535c209cf597
派健康测试环境:wx0d74e6b4fe6aba0b
http://spcare.medbanks-test.com/spcare-order/order-center/?sources=1100&saleChannelId=&isBack=true
http://spcare.medbanks-test.com/spcare-products/products_hz/?sources=1100&saleChannelId=&isBack=true&isDebug=true
*/
/**
* 微信授权
* @param redictURL 授权页URL
* @param isSilent 是否走用户授权
*/
export const authorize = async (
{ redirectURL, isVisible } = {
redirectURL: location.href,
isVisible: false,
}
) => {
const { sources = "", code = "" } = getQueryMap();
// * 是否显式授权状态位
const isVisibleFLAG = sessionStorage.getItem("SNSAPI_USERINFO");
// * 微信userINFO (包含了openid)
const userINFO = JSON.parse(sessionStorage.getItem("SP_WX_USERINFO") || null);
// * 微信公众号用户标识
const openID = sessionStorage.getItem("SP_WX_OPENID");
// ! 如果有openID说明已经授权成功,不在做任何操作直接返回
if (openID) return;
// URL中未能获取source
if (!sources && !openID) {
// css style font-size????
Toast("系统异常,URL未能正常获取渠道source (CODE: 60000)", 5);
console.error(
`[ ORCRIST-WECHAT SERVICE ERROR ]: URL未能正常获取渠道source (CODE: 60000)`
);
throw new Error(
"[ ORCRIST-WECHAT SERVICE ERROR ]: URL未能正常获取渠道source (CODE: 60000)"
);
}
const { APPID = "" } = (await msg()) || {};
// 未能准确获取有效APPID
if (!APPID) {
Toast(`系统异常,当前渠道${sources}未能正确获取公众号ID (CODE: 60001)`, 5);
console.error(
`[ ORCRIST-WECHAT SERVICE ERROR ]: 当前渠道${sources}未能正确获取公众号ID (CODE: 60001)`
);
throw new Error(
`[ ORCRIST-WECHAT SERVICE ERROR ]: 当前渠道${sources}未能正确获取公众号ID (CODE: 60001)`
);
}
// code一次有效 兑换 access_token 5分钟后过期
if (code) {
// 重置URL
history.replaceState(
{},
document.title || "",
location.href.split("code")[0].slice(0, -1)
);
// * 显式授权 -> 直接获取用户头像昵称等信息
if (isVisible) {
return userINFO
? Promise.resolve({ code: 20000, data: userINFO, type: "userINFO" })
: queryUserInfo(code, sources);
} else {
// * 隐式授权 -> 获取openID
// 获取OPENID
return openID
? Promise.resolve({ code: 20000, data: openID, type: "openID" })
: queryOpenID(code, sources);
}
} else {
const targetURL = WECHAT_REDIRECT_URL.replace("APPID", APPID)
.replace("REDIRECT_URI", encodeURIComponent(redirectURL))
// snsapi_base: 静默授权 用来获取进入页面的用户的openid的, snsapi_userinfo: 用户点击授权
.replace("SCOPE", isVisible ? "snsapi_userinfo" : "snsapi_base")
.replace("STATE", "");
console.info(`[ ORCRIST-WECHAT SERVICE REDIRECT URL ] : ${targetURL}`);
// 增加额外用户显式授权逻辑: 如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息
isVisible && sessionStorage.setItem("SNSAPI_USERINFO", "1");
window.location.replace(targetURL); //微信授权跳转
return Promise.resolve({ code: -1, data: "" });
}
};
export default {
authorize,
};