mtl-js-sdk
Version:
ynf-fw-mtl-api
205 lines (183 loc) • 7.16 kB
JavaScript
/*
* @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}×tamp=${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 }