mtl-js-sdk
Version:
ynf-fw-mtl-api
115 lines (101 loc) • 4.5 kB
JavaScript
/*
* @Author: liucongw
* @Date: 2023-12-13 15:53:17
* @LastEditors: wangyingliang wangyingliang@yonyou.com
* @LastEditTime: 2025-09-02 20:31:48
* @FilePath: /mtl-api-project/src/platforms/dingtalk/dd.proxy.js
* @Description:
*/
import permission from '../../common/permission'
const ddGetticketUrl = `${location.origin}/iuap-yonbuilder-mobile/rest/v2/mobile/dingtalk/signature`
/**
* @description: 钉钉平台 JSSDK 鉴权
* @param {String} url - getTicket 接口地址
* @param {String} pageUrl - 待授权网页 url
* @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(params) {
const defaultApiList = [
// 默认授权 api 列表
"device.base.getUUID",
"biz.util.chooseImage",
"device.geolocation.get",
"biz.map.view",
"device.audio.startRecord",
"device.audio.stopRecord",
"device.audio.onRecordEnd",
"device.audio.play",
"device.audio.pause",
"device.audio.resume",
"device.audio.stop",
"device.audio.onPlayEnd"
]
// 增加从 localstorage 和 url 中获取鉴权参数的逻辑
const localParams = permission.getConfigParams()
// 获取 ticket 地址
let serverUrl = params?.url || localParams?.url || ddGetticketUrl
// 调用config接口的当前网页url
let url = encodeURIComponent(window.location.href.split("#")[0])
if ((params?.pageUrl && params?.pageUrl !== "") || (localParams?.pageUrl && localParams?.pageUrl !== "")) {
url = encodeURIComponent(params?.pageUrl || localParams?.pageUrl)
}
const appId = params?.appId || params?.appid || params?.aKey || localParams?.appId || localParams?.appid || localParams?.aKey
if (!appId || appId === "") {
params?.fail && params?.fail({
code: -1,
msg: "appId is null!"
})
return
}
const agentId = params?.agentId || localParams?.agentId
const sKey = params?.secret || params?.sKey || localParams?.secret || localParams?.sKey
const corpId = params?.corpId || localParams?.corpId
// 处理参数
serverUrl = `${serverUrl}?url=${url}&appId=${agentId}&appKey=${appId}&appSecret=${sKey}`
// 第三方平台私有化场景下, 需要指定第三方平台部署域名
const domain = params?.domain || localParams?.domain
if (domain && domain !== "") {
serverUrl = `${serverUrl}&domain=${domain}`
}
let apiList = defaultApiList
if (params?.apiList) {
apiList = [...new Set([...apiList, ...defaultApiList])]
}
console.log("Authorized API List is ", apiList)
fetch(serverUrl).then((response) => response.json().then((res) => {
console.log("getTicket res: ", res)
if (res?.result?.appid) {
const { appid, noncestr, timestamp, signature } = res?.result
window.dd?.config({
agentId: appid, // 必填,微应用ID
corpId, // 必填,企业ID
timeStamp: timestamp, // 必填,生成签名的时间戳
nonceStr: noncestr, // 必填,自定义固定字符串。
signature, // 必填,签名
type: 0, // 选填。0表示微应用的jsapi,1表示服务窗的jsapi;不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
jsApiList: apiList // 必填,需要使用的jsapi列表,注意:不要带dd。
})
window.dd?.error((err) => {
console.log("config failed: ", err)
params?.fail && params?.fail(err)
}) // 该方法必须带上,用来捕获鉴权出现的异常信息,否则不方便排查出现的问题
window.dd?.ready(() => {
console.log("config ready")
params?.success && params?.success()
})
} else {
console.log("ticket failed: ", res)
params?.fail && params?.fail(res)
}
})).catch((err) => {
console.log("getTicket failed: ", err)
params?.fail && params?.fail(err)
})
}
export default { configPermission }