利用云函数做一个钉钉机器人提醒功能教程
今天在业务开发中帮助客户实现了一个通过钉钉实时提醒平台订单的功能发现还挺好使的而且接入也比较简单分享一下这个功能的泛用性挺强的基本所有的需要实时提醒通知一类的都可以通过这个来实现。首先就是你需要有一个企业的钉钉实测钉钉甚至都不需要认证然后在钉钉开放平台创建一个应用并添加机器人应用能力最后发布一下前置条件就搞定了。接近进入钉钉APP创建一个群企业钉钉创建完成后会默认有一个全体人员的群可以直接使用然后右上方进入群设置下滑可以看到机器人添加我们刚刚创建的机器人最后进入机器人列表点击我们刚刚添加的机器人可以看到一个webhook复杂一下前置任务就都完成了。接着就是云函数代码部分可以参考一下代码use strict;const crypto require(crypto);/** * 钉钉机器人配置Webhook、加签、可选内部密钥。 * type {{ WEBHOOK: string, SIGN_SECRET: string, INTERNAL_SECRET: string }} */const DINGTALK_CONFIG { WEBHOOK: , SIGN_SECRET: , INTERNAL_SECRET: };/** * 为钉钉加签机器人拼接 timestamp、sign。 * param {string} webhookUrl 原始 Webhook * param {string} secret 加签密钥 * returns {string} 完整 URL */function buildSignedWebhookUrl(webhookUrl, secret) { const timestamp Date.now(); const stringToSign ${timestamp}\n${secret}; const hmac crypto.createHmac(sha256, secret); hmac.update(stringToSign); const sign encodeURIComponent(hmac.digest(base64)); const sep webhookUrl.includes(?) ? : ?; return ${webhookUrl}${sep}timestamp${timestamp}sign${sign};}/** * 解析出本次请求使用的完整 Webhook URL含加签参数。 * returns {string} 空字符串表示未配置 */function getWebhookRequestUrl() { const webhookUrl String(DINGTALK_CONFIG.WEBHOOK || ).trim(); if (!webhookUrl) { return ; } const secret String(DINGTALK_CONFIG.SIGN_SECRET || ).trim(); return secret ? buildSignedWebhookUrl(webhookUrl, secret) : webhookUrl;}/** * 校验服务端互调密钥配置了才校验。 * param {Object} args 入参 * returns {boolean} 是否通过 */function checkInternalSecret(args) { const expected String(DINGTALK_CONFIG.INTERNAL_SECRET || ).trim(); if (!expected) { return true; } const got String((args args.internalSecret) || ).trim(); return got expected;}/** * 金额格式化为两位小数展示。 * param {number|string|null|undefined} v 元 * returns {string} */function formatAmountYuan(v) { if (v null || v ) { return -; } const n Number(v); if (!Number.isFinite(n)) { return String(v); } return n.toFixed(2);}/** * 组装新订单提醒的正文Markdown。 * param {Object} p * param {string} p.businessLabel * param {string} p.orderNo * param {number|string} [p.amountYuan] * param {string} p.mobileText * param {string} [p.userId] * param {string} p.timeStr * returns {string} */function buildOrderCardMarkdown(p) { const { businessLabel, orderNo, amountYuan, mobileText, userId, timeStr } p; const blocks [ ## 新订单 · ${businessLabel}, , 后台有新的订单请注意查看。, , ---, , **订单号**\n\n\${orderNo}\, , **应付金额**\n\n**¥ ${formatAmountYuan(amountYuan)}**, , **用户手机**\n\n${mobileText} ]; if (userId) { blocks.push(, **用户标识**\n\n\${userId}\); } blocks.push(, ---, , *${timeStr}*); return blocks.join(\n);}/** * POST 任意钉钉机器人消息体。 * param {Object} body msgtype 及对应字段 * returns {Promise{ errCode: number|string, errMsg: string, detail?: Object }} */async function postToDingTalk(body) { const url getWebhookRequestUrl(); if (!url) { return { errCode: CONFIG, errMsg: WEBHOOK 未配置 }; } try { const httpRes await uniCloud.httpclient.request(url, { method: POST, contentType: json, data: body, dataType: json, timeout: 10000 }); const status httpRes.status; const data httpRes.data; if (status ! 200 || (data data.errcode ! 0)) { console.error( [dingtalk-notify-co] webhook failed, status, data JSON.stringify(data) ); return { errCode: UPSTREAM, errMsg: dingtalk webhook failed, detail: data }; } return { errCode: 0, errMsg: ok }; } catch (e) { console.error([dingtalk-notify-co] request error, e e.message ? e.message : e); return { errCode: UPSTREAM, errMsg: e e.message ? e.message : request error }; }}module.exports { /** * 新订单创建后向管理员推送简要提醒用户端通常只留了手机号完整信息在管理后台查看。 * 本地调试在 dingtalk-notify-co.param.js 里调用本方法并传入模拟参数即可。 * param {Object} args * param {string} args.businessLabel 业务名称如「工商注册」「代理记账」 * param {string} args.orderNo 订单号 * param {number|string} [args.amountYuan] 金额元 * param {string} [args.userId] 用户标识后台查单用 * param {string} [args.contactMobile] 用户下单时填写的手机号 * param {string} [args.internalSecret] 与 DINGTALK_CONFIG.INTERNAL_SECRET 一致时方可调用若已填写该配置 * returns {Promise{ errCode: number|string, errMsg: string }} */ async notifyOrderCreated(args {}) { if (!checkInternalSecret(args)) { return { errCode: FORBIDDEN, errMsg: forbidden }; } if (!getWebhookRequestUrl()) { return { errCode: 0, errMsg: skipped_no_webhook }; } const { businessLabel, orderNo, amountYuan, userId, contactMobile } args || {}; if (!businessLabel || !orderNo) { return { errCode: PARAM_INVALID, errMsg: 缺少 businessLabel 或 orderNo }; } const mobileText String(contactMobile || ).trim() || 未填写; const timeStr new Date().toLocaleString(zh-CN, { hour12: false }); const cardText buildOrderCardMarkdown({ businessLabel, orderNo, amountYuan, mobileText, userId, timeStr }); return postToDingTalk({ msgtype: markdown, markdown: { title: 新订单 · ${businessLabel}, text: cardText } }); }};钉钉消息是以md格式来进行的所以使用场景还是挺方便的编辑起来也很简单。将webhook的链接放入就行了其他两个参数可以不填写当然如果为了信息安全配置一下更好。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2544409.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!