UNPKG

mtl-js-sdk

Version:

ynf-fw-mtl-api

205 lines (183 loc) 7.16 kB
/* * @Author: wangyingliang@yonyou.com * @Date: 2024-06-20 14:31:17 * @LastEditors: wangyingliang wangyingliang@yonyou.com * @LastEditTime: 2025-09-02 20:29:38 * @FilePath: /mtl-api-project/src/platforms/wx/wx.proxy.js * @Description: 微信鉴权模块 * Copyright (c) 2024 by Yonyou, All Rights Reserved. */ import xaxios from 'axios' import sha1 from 'sha1' import permission from '../../common/permission' const axios = xaxios?.default || xaxios const SUCCESS_CODE = 200 const FAIL_CODE = 1 const wxURL = "ht" + "tps://c2.yonyou" + "cloud.com/iuap-yonbuilder-mobile/rest/v1/wechat/api/getticket" const qywxURL = "ht" + "tps://c2.yonyou" + "cloud.com/iuap-yonbuilder-mobile/rest/v1/wechat/api/enterGetticket" /** * @description: wx、企微平台 JSSDK 鉴权 * @param {String} url - getTicket 接口地址 * @param {String} pageUrl - 待授权网页 url * @param {String} domain - * @param {String} agentId - 企业内部应用 AgentId 必传 * @param {String} corpId - 企业 ID 必传 * @param {String} appId - 企业内部应用的 Client ID 必传 * @param {String} secret - 企业内部应用的 Client Secret 必传 * @param {String[]} apiList - 待授权 api 列表 * @param {Function} success - 鉴权成功执行 * @param {Function} fail - 鉴权失败执行 */ // function configPermission(url, pageUrl = "", domain = "", appId, secret = "", agentId = "", apilist, debug = false, success, fail) { function configPermission(params) { // 增加从 localstorage 和 url 中获取鉴权参数的逻辑 let localParams = permission.getConfigParams() // 获取 ticket 地址 var serverUrl = params?.url || localParams?.url || (window.navigator.userAgent.indexOf("wxwork") !== -1 ? qywxURL : wxURL) const appId = params?.appId || params?.appid || params?.aKey || localParams?.appId || localParams?.appid || localParams?.aKey if (!appId || appId == "") { params?.fail && params?.fail({ code: FAIL_CODE, msg: "appId is null!" }) return } const agentId = params?.agentId || localParams?.agentId const secret = params?.secret || params?.sKey || localParams?.secret || localParams?.sKey const corpId = params?.corpId || localParams?.corpId // 第三方平台私有化场景下, 需要指定第三方平台部署域名 const domain = params?.domain || localParams?.domain const apiList = params?.apiList || localParams?.apiList let obj = { ...localParams, source: "secret", domain: domain, server: serverUrl, appId: appId, corpId: corpId, secret: secret, agentId: agentId, debug: params?.debug || localParams?.debug, apiList: apiList } getTicket({ ...obj, success: function (res) { console.log("getTicketRes", res) if (res.status != 200 || res.data.code != 0) { throw { errCode: 0, errMsg: "getTicketRes fail" } } // 生成前端 let { appid, ticket } = res.data.data || res.data let authPageUrl = params?.pageUrl || localParams?.pageUrl || location.href.split("#")[0] let nonceStr = "Wm3WZYTPz0wzccnW" let timestamp = Math.round(new Date().getTime() / 1000) let encodingStr = `jsapi_ticket=${ticket}&noncestr=${nonceStr}&timestamp=${timestamp}&url=${authPageUrl}` console.log("encodingStr", encodingStr) let signature = sha1(encodingStr) const nWx = window?.wx || window.top?.wx nWx.config({ beta: true, debug: obj?.debug, appId: appid, timestamp: timestamp, nonceStr: nonceStr, signature: signature, jsApiList: apiList, }) nWx.ready(function (res) { console.log("config success: ", res) params?.success && params?.success(res) }) nWx.error(function (err) { console.log("config failed: ", err) params?.fail && params?.fail(err) }) }, fail: function (err) { console.log("ticket failed: ", err) if (err && err.errCode == 0) { params?.fail && params?.fail(err) } }, }) } function getTicket(object) { let params = { ...object, access_token_source: "secret", host: object?.domain, appid: object?.appId, secret: object?.secret, agentId: object?.agentId } delete params?.success delete params?.fail axios.get(object.server, { params }).then(function (res) { object?.success && object?.success(res) }).catch(function (err) { object?.fail && object?.fail(err) }) } function execProxy(fn) { return function (object = {}) { let _object = { ...object } delete _object.success delete _object.fail delete _object.complete _object.complete = function (res) { console.log("wx complete= ", res) let data = { ...res } let code = res.errCode || SUCCESS_CODE let message = res.errMsg || JSON.stringify(res) delete data.errCode delete data.errMsg if (data?.localData) { if (data.localData.indexOf("\n") != -1 || data.localData.indexOf("\r") != -1 || data.localData.indexOf(" ") != -1) { // 包含\n,可以直接替换, 解决android机器base64编码后带有\n问题 data.localData = data.localData.replace(/(\r\n)|(\n)|(\s)/g, "") } } const result = { code, message, data, } if (code === SUCCESS_CODE) { object.success && object.success(data) } else { object.fail && object.fail(result) } console.log("wx complete: ", result) object.complete && object.complete(result) } fn(_object) } } function generateFunc(name) { let wxObj = wx if (Object.keys(wx).length == 0) { wxObj = window?.wx || window?.top?.wx || window?.parent?.wx } // let fn = wx[name] || (wx.miniProgram && wx.miniProgram[name]) || (window.wx && window.wx[name]) || (window.top.wx && window.top.wx[name]) || (parent.wx && parent.wx[name]); let fn = function (params) { console.log(`${mtl.platform} nonsupport!`); } if (Object.hasOwnProperty.call(wxObj, name)) { fn = wxObj[name]; } if (wxObj?.miniProgram) { if (Object.hasOwnProperty.call(wxObj?.miniProgram, name)) { fn = wxObj?.miniProgram[name]; } } return execProxy(fn); } // 小程序生成函数. function generateMiniProgramFunc(name) { console.log("name = ", name) console.log("wx = ", wx) let fn = wx.miniProgram && wx.miniProgram[name] return execProxy(fn) } export default { configPermission, generateFunc }