產品介紹
什么是數環通
基礎概念講解
應用場景
多渠道數據融合
業務、財務、辦公自動化
產業鏈應用與數據集成
工業應用與設備互聯
智慧園區與未來社區
快速入門
創建LinkUp
應用授權
判斷用法
監控用法
分支用法
列表逐條處理
變量與表達式
流程管理
項目管理
流程創建
編輯器操作
單步測試與預覽
試運行
發布與版本管理
錯誤步驟重試
數據同步
JSON Path 使用
輸出處理
數據編排
1、功能使用手冊
2、腳本使用手冊
1 、簡單查詢
2、謂詞查詢
3、函數與表達式
4、構建結構結果
5、查詢組合
6、排序、分組和聚合
7、處理模型
8、函數式編程
9、正則表達式
10、日期、時間處理
11、路徑運算符
12、數字運算符
13、比較運算符
14、布爾運算符
15、其他運算符
16、字符串函數
17、數值函數
18、 數字聚合函數
19、布爾函數
20、數組函數
21、對象函數
22、日期/時間函數
23、高階函數
運行日志
運行記錄
開發工具
連接器工具
連接器源碼配置
控件類型配置
腳本配置說明
內置函數
應用講解
內置應用
瀏覽器插件
數據表
文本字符串
日期
數據篩選
數據處理
延時處理
數學計算器
定時觸發器
子流程調用
手動觸發器
物流地址解析
腳本執行器
自定義變量
文件讀取
Webhook
SMTP發送郵件
文件傳輸
JSON工具
網絡工具
消息處理
PDF水印工具
文件存儲
API服務
Http請求
循環控制
EDI 自定義標準數據轉換
對象類型判斷
瀏覽器操作
三方應用
簡道云
金山數據表
抖音
釘釘(自建應用)
語雀
金山表單
微信公眾號
企業微信群機器人
聚水潭
企業微信三方授權
MySQL
SqlServer
ChatGpt
快手
金山輕維表
抖店
維格表
巨量千川
飛書多維表
釘釘機器人
飛書(自建)
釘釘
百度網盤
QQ郵箱
金山工作表
易知微DTable
MQTT
Doirs
中通快遞
韻達速遞
企業微信(代開發)
知乎效果營銷平臺
飛書云文檔
騰訊企業郵箱
API管理
API管理概述
數據概覽
API服務
訪問憑證
API門戶
API安全密鑰簽名
API監控預警
擴展工具
代理網關
消息處理
管理中心
企業管理
操作日志
成員管理
開放平臺
開放平臺簡介
接入教程
常見問題
數環通ip白名單
最佳實踐
彥祖文化 |通過數環通實現全渠道數據融合打通
新石器|通過數環通實現跨系統、跨部門高效協同
幫助首頁
開發工具
腳本配置說明
腳本配置說明
## 一、新增腳本 點擊新增腳本,創建腳本。 ## 二、腳本配置 腳本名稱:可自定義腳本名稱 腳本使用場景碼:請輸入英文 腳本類型:支持 java、JS、python 腳本源代碼:可輸入或直接粘貼代碼 ## 三、腳本示例 ### 1、簽名腳本 如何使用簽名腳本: (1)首先在腳本管理中創建腳本   腳本名稱可以可以自己定義,腳本使用場景編碼使用英文命名,如:sign;腳本類型可以選擇自己使用的開發語言。 (2)編寫腳本 在應用 shuhuan-ipaas-app-libs 的 signer 目錄下開發簽名類,簽名算法改成通過 java 執行=腳本=的方案實現簽名算法,簽名類需要繼承 JavaScriptRunner 類重寫 execute 方法 ``` /** * @author yunmu * @date 2022-03-04 6:44 下午 */ public abstract class JavaScriptRunner { public abstract <T> T execute(Object params); } ``` params 是一個 Map 對象,Map 中會包含以下數據: * 上下文參數數據 * signRequest 待簽名的 http 請求獲取方式: ``` HttpApiRequest apiRequest = (HttpApiRequest) paramsMap.get(SignConfigConstant.SIGN_REQUEST); ``` * 簽名配置中的 signInField 中的信息 * signOutField 簽名的輸出字段 簽名=腳本=示例: ``` package com.shuhuan.ipaas.applibs.signer; import com.aliyun.unicorn.http.MultipartFormData; import com.aliyun.unicorn.http.MultipartFormValue; import com.aliyun.unicorn.http.QueryString; import com.aliyun.unicorn.sdk.HttpApiRequest; import com.aliyun.unicorn.type.Consumer; import com.aliyun.unicorn.type.Parameter; import com.shuhuan.ipaas.common.ResultCode; import com.shuhuan.ipaas.core.encryption.Md5Util; import com.shuhuan.ipaas.exception.IpaasException; import com.shuhuan.ipaas.meta.constants.SignConfigConstant; import com.shuhuan.ipaas.script.java.JavaScriptRunner; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; /** * @author yunmu * @date 2022-03-05 4:22 下午 */ public class BanniuScriptSigner extends JavaScriptRunner { private static final String METHOD = "method"; private static final String ACCESS_TOKEN = "access_token"; public static final String TIMESTAMP = "timestamp"; private static final String SIGN = "sign"; private static final String APP_KEY = "app_key"; private static final String APP_SECRET=app_secret @Override public <T> T execute(Object params) { if (!(params instanceof Map)){ throw new IpaasException(ResultCode.PARAM_ERROR, "params is not map"); } Map<String,Object> paramsMap = (Map<String, Object>) params; //固定寫法 ,獲取 rquest HttpApiRequest apiRequest = (HttpApiRequest) paramsMap.get(SignConfigConstant.SIGN_REQUEST); // 獲取參數 String appKey = (String) paramsMap.get(APP_KEY); String appSecret = (String) paramsMap.get(APP_SECRET); //獲取 http 請求的數據 QueryString queryString = apiRequest.getQueryString(); // ******開始業務邏輯,根據實際的簽名要求編寫 TreeMap<String, String> pmap = new TreeMap<>(); queryString.foreachValues((paramKey, value) -> { pmap.put(paramKey, value); }); MultipartFormData formData = apiRequest.getForm(); if (formData != null && !formData.isMultipart()) { apiRequest.getForm().foreach(new Consumer<Parameter<MultipartFormValue>>() { @Override public void accept(Parameter<MultipartFormValue> a) { String v = a.getFirstValue() != null ? a.getFirstValue().getValue() : null; if (METHOD.equals(a.getName())) { pmap.put(METHOD, v); } if (ACCESS_TOKEN.equals(a.getName())) { pmap.put(ACCESS_TOKEN, v); } if (TIMESTAMP.equals(a.getName())) { pmap.put(METHOD, v); } if (ACCESS_TOKEN.equals(a.getName())) { pmap.put(ACCESS_TOKEN, v); } } }); } String stringToSign = sign(pmap, appSecret); String signature = Md5Util.md5(stringToSign, "utf-8").toUpperCase(); //把簽名放入 http 參數 queryString.add(SIGN, signature); // ****結束業務邏輯 //以下為固定格式,不要動 Map<String, String> resultMap = new HashMap<>(); resultMap.put(SignConfigConstant.SIGNATURE, signature); resultMap.put(SignConfigConstant.STRING_TO_SIGN, stringToSign); return (T) resultMap; } // 代碼一, 簽名排序代碼. // pmap 為所有參數, TreeMap 表示為樹形結構的哈希容器 // appSecret 班牛分配給您的密鑰 private String sign(TreeMap<String, String> pmap, String appSecret) { StringBuilder sb = new StringBuilder(appSecret); Iterator i$ = pmap.entrySet().iterator(); while (i$.hasNext()) { Map.Entry<String, String> entry = (Map.Entry) i$.next(); String name = entry.getKey(); String value = entry.getValue(); if (StringUtils.isNoneEmpty(new String[]{name, value})) { sb.append(name).append(value); } } sb.append(appSecret); return sb.toString(); } } ``` (3)在執行動作中使用簽名 點擊簽名配置,選擇新增   選擇已經創建好的腳本,且可以向腳本中傳遞參數,參數的 key 可以自己命名,參數的值可以自己寫成固定的,也可以使用授權時寫入的變量; 如授權時的參數:  則可以通過如下形式獲取變量:  在腳本簽名代碼中通過如下方式獲取到數據: private static final String APP_KEY = "app_key"; private static final String APP_SECRET="app_secret";  ### 2、觸發器腳本 有些應用會推送消息,需要接收消息并處理接收到的數據,譬如解密數據、判斷數據是否符合要求,這時需要通過腳本來處理。 (1)定義觸發器  觸發器需要輸入動作的名稱和動作 key,動作 key 非常重要,不能重復,必須和代碼中的 eventType 值一樣。 (2)編碼觸發消息處理腳本 編寫事件回調數據處理 =腳本= 。 例如 java 腳本,必須繼承 JavaScriptRunner, ``` package com.shuhuan.ipaas.applibs.dealPushEventContent.caoliao; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.shuhuan.ipaas.script.java.JavaScriptRunner; import lombok.extern.slf4j.Slf4j; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 推送事件 數據處理 * 文檔地址: https://cli.im/help/65847 */ @Slf4j public class caoliaoDemo extends JavaScriptRunner { //以下定義的變量是固定的,不要改 private static final String EVENT_TYPE = "eventType"; private static final String BODY = "body"; private static final String EVENT_CONTENTS = "eventContents"; private static final String EVENT_CONTENT = "eventContent"; private static final String ASSET = "asset"; private static final String RESULT = "result"; //結束固定變量定義 @Override public <T> T execute(Object params) { return (T) buildPushEventOutput(params); } /* { "asset": {}, "body": { "time": "2022-06-30 17:06:39", "event": "FORM_DATA_SUBMIT", "data": { "ref_data": { "created_at": "2022-06-30 17:06:39", "serial_number": "L1000001", "form": { "number": "D20", "name": "會議簽到" }, "fields": { "姓名": "草料", "手機": "18888648888", "微信名": "CHEN", "身份證號": "330200000000000000", "工號": "FBI100", "單選項": "是" } } } } @return { "result": { "code": 200, "message": "success" }, "eventContents": [{ "eventType": "FORM_DATA_SUBMIT", "eventContent": { "ref_data": { "created_at": "2022-06-30 17:06:39", "serial_number": "L1000001", "form": { "number": "D20", "name": "會議簽到" }, "fields": { "姓名": "草料", "手機": "18888648888", "微信名": "CHEN", "身份證號": "330200000000000000", "工號": "FBI100", "單選項": "是" } } } }] } */ public static JSONObject buildPushEventOutput(Object params) { JSONObject output = new JSONObject(); if (!(params instanceof Map)) { log.error("當前腳本入參類型錯誤!期望是 Map,但是實際為{},具體值為{}", params.getClass().getName(), JSON.toJSONString(params)); return output; } JSONObject input = (JSONObject) params; /** * 這里的事件內容的數據類型,有可能是數組,也可能是對象,具體按照推送方格式為準,作匹配的處理: * 1.解密(不是所有的消息都需要做) * 2.獲取事件的標識 * 3.將事件標識轉換為觸發器的 key * 4.構造接口返回,務必與推送方要求保持一致 */ /* 1. 解密 該參數包含秘鑰等信息,如果推送數據是密文,可以用該參數里的秘鑰進行解密,例如: 首先獲取授權時填寫的信息 JSONObject asset = input.getJSONObject(ASSET); String encrypt = input.getJSONObject(BODY).getString("encrypt"); 獲取授權時填寫的解密秘鑰 String encoding_aes_key = asset.getString("encoding_aes_key"); //按照文檔給的算法進行解密 String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; String KEY_ALGORITHM = "AES"; String CHARSET = "UTF-8"; Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); byte[] key = Base64.decodeBase64(encoding_aes_key); SecretKeySpec keySpec = new SecretKeySpec(key, KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(new byte[16])); String body = new String(cipher.doFinal(Base64.decodeBase64(encrypt)), CHARSET); */ List<JSONObject> eventContents = Lists.newArrayList(); JSONObject data = (JSONObject) input.get(BODY); JSONObject item = new JSONObject(); //2. 獲取對應事件的 key。 String event = (String) data.get("event"); //3. 做觸發器的 key 與事件的 key 映射 if ("FORM_DATA_SUBMIT".equals(event)) { item.put(EVENT_TYPE, "FORM_DATA_SUBMIT"); } else if ("FORM_DATA_EDITED".equals(event)) { item.put(EVENT_TYPE, "FORM_DATA_EDITED"); } else if ("FORM_DATA_REVIEW".equals(event)) { item.put(EVENT_TYPE, "FORM_DATA_REVIEW"); } //4. 對應事件的輸出內容,這里的內容是外部應用推送過來的原始數據,與觸發器的輸出字段保持一致 item.put(EVENT_CONTENT, JSON.parseObject(data.getString("data"))); eventContents.add(item); output.put(EVENT_CONTENTS, eventContents); //推送事件后的響應結果,必須和推送方要求的返回結果一致,固定寫法 Map<String, Object> result = new HashMap<>(16); result.put("code", 0); result.put("message", "success"); output.put(RESULT, result); return output; } } 腳本返回數據格式必須是 { "result": { "code": 200, "message": "success" }, "eventContents": [{ "eventType": "FORM_DATA_SUBMIT", "eventContent": { //外部推送的數據 } }] } 如: { "result": { "code": 200, "message": "success" }, "eventContents": [{ "eventType": "FORM_DATA_SUBMIT", "eventContent": { //外部推送的數據 "ref_data": { "created_at": "2022-06-30 17:06:39", "serial_number": "L1000001", "form": { "number": "D20", "name": "會議簽到" }, "fields": { "姓名": "草料", "手機": "18888648888", "微信名": "CHEN", "身份證號": "330200000000000000", "工號": "FBI100", "單選項": "是" } } } }] } ``` ## 四、腳本 SDK 下載 Java 腳本 SDK:[shuhuan-ipaas-script-demo.zip](https://sh-assets.oss-cn-hangzhou.aliyuncs.com/sdk/shuhuan-ipaas-script-demo.zip) *注:可在下載 SDK Demo 中進行編寫腳本,SDK Demo 中所引用的依賴均可以在數環通腳本中使用。*
上一篇
控件類型配置
下一篇
內置函數
手機掃碼
復制鏈接
手機掃一掃轉發分享
復制鏈接
Markdown文件
分享
鏈接
類型
密碼
更新密碼
主站蜘蛛池模板:
天天干,夜夜操
|
成年免费大片黄在线观看岛国
|
欧美一级a俄罗斯毛片
|
欧美一级淫片
|
天天干天天干天天干
|
亚洲精品成人区在线观看
|
一区二区三区四区在线
|
久久夜精
|
国产99久久久国产精品免费
|
国产精品久久久久久久av福利
|
亚洲天堂福利
|
一级黄色的毛片
|
天天操天天操天天操
|
91精品国产视频
|
激情图区
|
www.欧美国产
|
久久91精品国产91久久小草
|
在线国产视频
|
99精品在线
|
全黄性性激高免费视频
|
免费一看一级毛片
|
亚洲一二区在线
|
日本不卡视频在线观看
|
亚洲精品短视频
|
免费观看一级特黄欧美大片
|
逼逼网
|
亚洲第一中文字幕
|
日韩a视频
|
日韩av免费播放
|
亚洲一区二区三区在线播放
|
www.国产一区二区
|
午夜激情国产
|
国产视频第一页
|
精品视频一区二区三区在线观看
|
日韩欧美网站
|
伊人一区二区三区
|
午夜一二三
|
综合色站导航
|
中文字幕在线视频精品
|
日韩黄网
|
国产视频成人
|