一、首先要准备接口资料
1、宜搭应用的应用参数和秘钥
2、钉钉开发者 AppKey和AppSecret
开发者中心记得开放权限
3、最后还需要准备一个钉钉的userid,随意一个组织内成员的userid都可以,需要登录钉钉OA后台:钉钉管理后台 - 钉钉统一身份认证
切换到旧版
二、下面开始上代码
1、登录阿里云账号,开通云函数计算FC
把下面代码丢进去
这个是getToken函数,获取token鉴权接口
var getRawBody = require('raw-body');
const Url = require('url');
const API_SERVER = 'https://api.dingtalk.com';
const API_VERSION = 'v1.0';
exports.handler = (req, resp, context) => {
resp.setHeader('Content-type', 'application/json');
getRawBody(req, function (err, body) {
post(
`${API_SERVER}/${API_VERSION}/oauth2/accessToken`,
{
appKey: 'dinglg-xxxxxx', //钉钉开发者appkey
appSecret: 'h1g7F3-xxxxxx', //钉钉开发者appsecret
},
function (data) {
data = JSON.parse(data);
if (data.expireIn) {
var respBody = new Buffer.from(JSON.stringify(data));
resp.setStatusCode(200);
resp.send(respBody);
} else {
var respBody = new Buffer.from(
JSON.stringify({
success: 'false',
errMsg: '获取失败',
errCode: '400',
})
);
resp.setStatusCode(200);
resp.send(respBody);
}
}
);
});
};
function post(url, data, fn) {
data = data || {};
let parse_u = Url.parse(url, true);
let isHttp = parse_u.protocol == 'http:';
let options;
options = {
host: parse_u.hostname,
port: parse_u.port || (isHttp ? 80 : 443),
path: parse_u.path,
method: 'POST',
json: true,
headers: {
'Content-Type': 'application/json',
},
};
let req = require(isHttp ? 'http' : 'https').request(options, function (res) {
let _data = '';
res.on('data', function (chunk) {
_data += chunk;
});
res.on('end', function () {
fn != undefined && fn(_data);
});
});
req.write(JSON.stringify(data));
req.end();
}
这个是getData函数,获取数据接口
var getRawBody = require('raw-body');
const Url = require('url');
const API_SERVER = 'https://api.dingtalk.com';
const API_VERSION = 'v1.0';
const systemToken = '9F766B81QLK3FUZ2FZB7-xxxxx'; //宜搭应用秘钥
const userId = '165-xxxxx'; //以宜搭平台的身份访问接口
exports.handler = (req, resp, context) => {
resp.setHeader('Content-type', 'application/json');
getRawBody(req, function (err, body) {
let pageSize = req.queries.pageSize ? req.queries.pageSize : 10;
let currentPage = req.queries.currentPage ? req.queries.currentPage : 1;
post(
`${API_SERVER}/${API_VERSION}/yida/forms/instances/search`,
{
appType: req.queries.appType,
formUuid: req.queries.formUuid,
searchFieldJson: req.queries.searchFieldJson,
systemToken: systemToken,
userId: userId,
currentPage: currentPage,
pageSize: pageSize
},
function (data) {
data = JSON.parse(data);
//将searchFormDatas接口的返回值直接塞到response中。
var respBody = new Buffer.from(JSON.stringify(data));
resp.setStatusCode(200);
resp.send(respBody);
},
req.queries.accessToken
);
});
}
function post(url, data, fn, accessToken) {
data = data || {};
let parse_u = Url.parse(url, true);
let isHttp = parse_u.protocol == 'http:';
let options;
options = {
host: parse_u.hostname,
port: parse_u.port || (isHttp ? 80 : 443),
path: parse_u.path,
method: 'POST',
json: true,
headers: {
'Content-Type': 'application/json',
'x-acs-dingtalk-access-token': accessToken
},
};
let req = require(isHttp ? 'http' : 'https').request(options, function (res) {
let _data = '';
res.on('data', function (chunk) {
_data += chunk;
});
res.on('end', function () {
fn != undefined && fn(_data);
});
});
req.write(JSON.stringify(data));
req.end();
}
这个是saveData函数,存数据接口
var getRawBody = require('raw-body');
const Url = require('url');
const API_SERVER = 'https://api.dingtalk.com';
const API_VERSION = 'v1.0';
const systemToken = '9F766B81QLK3FUZ-xxxxxx'; //应用秘钥
const userId = '165459-xxxxxxx'; //以宜搭平台的身份访问接口,Userid
exports.handler = (req, resp, context) => {
resp.setHeader('Content-type', 'application/json');
getRawBody(req, function (err, body) {
post(
`${API_SERVER}/${API_VERSION}/yida/forms/instances`,
{
appType: req.queries.appType,
formUuid: req.queries.formUuid,
formDataJson: req.queries.formDataJson,
systemToken: systemToken,
userId: userId,
},
function (data) {
data = JSON.parse(data);
//将saveFormDatas接口的返回值直接塞到response中。
var respBody = new Buffer.from(JSON.stringify(data));
resp.setStatusCode(200);
resp.send(respBody);
},
req.queries.accessToken
);
});
}
function post(url, data, fn, accessToken) {
data = data || {};
let parse_u = Url.parse(url, true);
let isHttp = parse_u.protocol == 'http:';
let options;
options = {
host: parse_u.hostname,
port: parse_u.port || (isHttp ? 80 : 443),
path: parse_u.path,
method: 'POST',
json: true,
headers: {
'Content-Type': 'application/json',
'x-acs-dingtalk-access-token': accessToken
},
};
let req = require(isHttp ? 'http' : 'https').request(options, function (res) {
let _data = '';
res.on('data', function (chunk) {
_data += chunk;
});
res.on('end', function () {
fn != undefined && fn(_data);
});
});
req.write(JSON.stringify(data));
req.end();
}
保存后,获取公网接口URL,三个接口连接保存下来,以备后用
三、宜搭上代码
新建两个数据源
请求函数didfetch上代码
function didFetch(content) {
if (content.expireIn) {
this.setCookie('accessToken', content.accessToken, content.expireIn);
} else {
this.utils.toast({
title: 'accessToken获取失败!',
type: 'error',
});
}
}
需要封装cookie方法,把token存起来
/*********************封装cookie方法***************************************/
export function setCookie(name, value, time) {
// 存储cookie
let d = new Date();
d.setTime(d.getTime() + time * 1000);
let expires = 'expires=' + d.toGMTString();
document.cookie = `${name}=${value}; ${expires}; path=/`;
}
export function getCookie(name) {
// 获取cookie
let newName = name + '=';
let ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i].trim();
if (c.indexOf(newName) == 0) {
return c.substring(newName.length, c.length);
}
}
return '';
}
然后新建一个方法,实现免登把数据存起来,查询方式一样的,少一个参数
export async function onClick(){
if (!this.getCookie('accessToken')) {
await this.dataSourceMap.getToken.load();
}
let obj = {
"textField_laqhmmhk": this.$('textField_a').get("value"),
"textField_laqhmmhl": this.$('textField_b').get("value")
}
let subData = {
accessToken: getCookie('accessToken'),// 获取openid返回的accessToken
formUuid: "FORM-XN966G7160Z46N-xxxxx", //表单id、访客信息表
appType: "APP_M8516-xxxxxx",//应用app id
formDataJson: JSON.stringify(obj)
}
dataSourceMap.savedata.load(subData).then(res => {
console.log('res', res);
})
}