宜搭免登获取表单数据详细教程(含源码)

本文档介绍了如何使用Node.js编写云函数,实现与钉钉接口的交互,包括获取OAuth2访问令牌、获取数据和保存数据的接口。首先,需要准备宜搭应用、钉钉开发者AppKey和AppSecret以及钉钉userid。然后,通过示例代码展示了getToken、getData和saveData三个函数,分别用于获取鉴权token、查询数据和保存数据。最后,将云函数部署并获取公网接口URL,以便后续使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先要准备接口资料

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);
  })

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值