UNPKG

orcrist-wechat

Version:

for Orcrist Wechat sdk

107 lines (89 loc) 3.61 kB
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, };