综合欧美一区二区三区_狠狠综合久久_伊人成综合_欧美日韩三级在线_亚洲免费视频一区二区_高清av在线

立即注冊(cè)

連接器配置

1. 連接器定義

1.1 授權(quán)定義

  • auth:連接器調(diào)用對(duì)應(yīng)SaaS軟件的授權(quán)方式,授權(quán)的定義是一個(gè)對(duì)象,當(dāng)沒有授權(quán)時(shí)可以為空

    • authType  授權(quán)類型,是第三方SaaS軟件驗(yàn)證數(shù)環(huán)通權(quán)限的方式,目前主要有以下幾種類型

      • api_token 通過AppKey + AppSecret 直接訪問或者通過AppKey + AppSecret 換取AccessToken進(jìn)行調(diào)用第三方SaaS的API接口,典型的SaaS有:自建釘釘,維格表等

      • oauth2 數(shù)環(huán)通作為第三方SaaS的平臺(tái)服務(wù)商申請(qǐng)AppKey+ AppSecret, 用戶通過授權(quán)數(shù)環(huán)通,由數(shù)環(huán)通獲取用戶的授權(quán)AccessToken調(diào)用第三方SaaS的API接口,典型的SaaS有:企業(yè)微信三方,釘釘三方

        • polling_oauth2 數(shù)環(huán)通作為第三方SaaS的平臺(tái)服務(wù)商申請(qǐng)AppKey+ AppSecret, 用戶通過授權(quán)數(shù)環(huán)通,由數(shù)環(huán)通獲取用戶的授權(quán)AccessToken調(diào)用第三方SaaS的API接口,但是與Oauth2 的區(qū)別在于,用戶的授權(quán)信息是通過后端服務(wù)接口進(jìn)行推送的,典型的SaaS有:聚水潭

  • test 測(cè)試輸入賬號(hào)有效性的執(zhí)行方法,主要是在新增賬號(hào)時(shí)調(diào)用,用于驗(yàn)證用戶輸入的數(shù)據(jù)是否有效,具體執(zhí)行方法的定義參考執(zhí)行方法定義

  • validate 驗(yàn)證當(dāng)前賬號(hào)的授權(quán)有效性的執(zhí)行方法,主要是在賬號(hào)新增賬號(hào)成功后調(diào)用,用于驗(yàn)證當(dāng)前授權(quán)信息如AccessToken等是否是有效狀態(tài),具體執(zhí)行方法的定義參考執(zhí)行方法定義

  • apiTokenConfig api_token類型的配置

    • autoRefresh 是否需要自動(dòng)刷新,Boolean類型

      • true 需要刷新,需要配置refreshAccessToken

      • false 不需要自動(dòng)刷新,AccessToken 是永久有效的

    • autoRefreshInterval 自動(dòng)刷新的間隔,Integer類型 單位秒 例如3600 表示每小時(shí)刷新一次token

    • accessToken 獲取AccessToken的執(zhí)行方法

    • refreshAccessToken 刷新AccessToken的執(zhí)行方法

  • oauth2Config oauth2 和 polling_oauth2的授權(quán)配置

    • autoRefresh 是否需要自動(dòng)刷新,Boolean類型

      • true 需要刷新,需要配置refreshAccessToken

      • false 不需要自動(dòng)刷新,AccessToken 是永久有效的

    • autoRefreshInterval 自動(dòng)刷新的間隔,Integer類型 單位秒 例如3600 表示每小時(shí)刷新一次token

    • preAuthorize 獲取授權(quán)鏈接前執(zhí)行方法列表,例如獲取預(yù)授權(quán)碼

    • authorizeUrl 獲取授權(quán)鏈接的執(zhí)行方法

    • accessToken 獲取AccessToken的執(zhí)行方法

    • refreshAccessToken 刷新AccessToken的執(zhí)行方法

  • thirdAuthConfig third_auth類型的配置

    • autoRefresh 是否需要自動(dòng)刷新,Boolean類型

      • true 需要刷新,需要配置refreshAccessToken

      • false 不需要自動(dòng)刷新,AccessToken 是永久有效的

    • autoRefreshInterval 自動(dòng)刷新的間隔,Integer類型 單位秒 例如3600 表示每小時(shí)刷新一次token

    • accessToken 獲取AccessToken的執(zhí)行方法

    • refreshAccessToken 刷新AccessToken的執(zhí)行方法

  • helpFields 顯示提示幫助的字段列表,如提示用戶如何進(jìn)行配置賬號(hào)和事件訂閱

  • inputFields 用戶需要輸入的參數(shù)字段列表,例如Appkey,AppSecret等,具體的字段配置參考字段定義

  • outputFields 保存到數(shù)據(jù)的參數(shù)列表,具體的字段配置參考字段定義

授權(quán)類型的說明:

api_token類型的授權(quán)流程:

oauth2 授權(quán)流程:

polling_oauth2 類型授權(quán)流程:

 

1.2 賬號(hào)定義

  • asset:連接器的賬號(hào)配置,主要是配置授權(quán)的哪些數(shù)據(jù)需要保存到賬號(hào)資產(chǎn)的數(shù)據(jù)庫中

    • autoRefresh 是否需要自動(dòng)刷新,Boolean類型,需要與授權(quán)定義中保持一致

      • true 需要刷新,需要配置refreshAccessToken

      • false 不需要自動(dòng)刷新,AccessToken 是永久有效的

    • autoRefreshInterval 自動(dòng)刷新的間隔,Integer類型 單位秒 例如3600 表示每小時(shí)刷新一次token

    • assetTemplate 保存的字段列表,用于定義哪些字段需要存進(jìn)賬號(hào)資產(chǎn)中

    • assetNameField 賬號(hào)名稱字段

    • assetUkField 賬號(hào)唯一性標(biāo)識(shí)字段

 

1.3 模板配置

  • requestTemplate:連接器的請(qǐng)求模板配置,主要是配置當(dāng)前連接器發(fā)起Http請(qǐng)求時(shí)的公共參數(shù),如appKey,簽名配置等公共的配置,可以減少請(qǐng)求的配置

    • method 發(fā)起請(qǐng)求的方法,支持以下選項(xiàng)

      • GET

      • PUT

      • POST

      • PATCH

      • DELETE

      • HEAD

    • url 請(qǐng)求的完整地址

    • body 請(qǐng)求body配置

      • bodyType  請(qǐng)求體類型

        • NULL 為空

        • STRING 字符串

        • ARRAY 數(shù)組

        • OBJECT JSON對(duì)象類型

        • XML XML格式

      • bodyContent 請(qǐng)求體內(nèi)容,根據(jù)bodyType傳入具體的值

    • queryParams 查詢請(qǐng)求參數(shù),KV形式

    • formParams  表單請(qǐng)求參數(shù),KV形式

    • headers 頭部請(qǐng)求參數(shù)

    • signConfig 簽名配置

      • signType 簽名類型,簽名的實(shí)現(xiàn),目前可以使用簽名腳本類型

        • script 通過簽名腳本進(jìn)行簽名

      • signOutField 簽名輸出字段

      • signInField 簽名字段參數(shù),KV形式

      • signSetting 簽名配置,針對(duì)腳本簽名需要增加以下參數(shù)

        • connectorId 連接器ID

        • scriptType 腳本類型

        • sceneCode 場(chǎng)景編碼

        • version 腳本版本

    • responseType 請(qǐng)求返回值類型,默認(rèn)按照STRING處理

      • BINARY 二進(jìn)制

      • JSON JSON格式

      • STRING 純文本格式

    • beforeRequest 請(qǐng)求前執(zhí)行方法列表,一般用于對(duì)請(qǐng)求參數(shù)進(jìn)行處理

    • afterResponse 請(qǐng)求后執(zhí)行方法列表,一般用于對(duì)于返回?cái)?shù)據(jù)進(jìn)行處理

  • triggerTemplate:消息通知和回調(diào)的配置。主要是配置當(dāng)前連接器接收平臺(tái)Http請(qǐng)求時(shí)的參數(shù),可用來做觸發(fā)器配置

    • pushUrl:消息推送回調(diào)地址。如:${eventDomainHost}/event/customPush/com.yuque.app/${assetId}/test

      • com.yuque.app 為連接器ID,用戶務(wù)必配置為當(dāng)前連接器的ID

      • test 為用戶自定義參數(shù)

    • pushExecutor:推送數(shù)據(jù)的腳本配置

      • executeType:執(zhí)行類型。設(shè)置為script

      • connectorId:當(dāng)前連接器的ID

      • connectorVersion:當(dāng)前連接器的版本

      • sceneCode:場(chǎng)景碼。這里設(shè)置為dealPushEventContent

      • type:腳本類型。可選擇java,js,pythone

      • version:腳本的版本號(hào)。可設(shè)置為1~9

1.4 觸發(fā)器

  • triggers 觸發(fā)器列表,用于觸發(fā)器定義,觸發(fā)器列表是個(gè)KV列表,其中Key是觸發(fā)器的關(guān)鍵字定義,Value是一個(gè)觸發(fā)器定義

    • key 用于唯一標(biāo)識(shí)觸發(fā)器

    • value 觸發(fā)器的具體定義

觸發(fā)器對(duì)象的定義:

  • key 觸發(fā)器的key 和前文的key 保持一致

  • paramClass 參數(shù)對(duì)象類型,主要為了以后對(duì)參數(shù)映射進(jìn)行擴(kuò)展使用,當(dāng)前暫時(shí)可以不配置

  • resultClass 結(jié)果對(duì)象類型,主要為了以后對(duì)參數(shù)映射進(jìn)行擴(kuò)展使用,當(dāng)前暫時(shí)可以不配置

  • resultIsList 結(jié)果是否是一個(gè)數(shù)組列表,此處主要針對(duì)的是一級(jí)結(jié)果,默認(rèn)為false

    • true 表示結(jié)果是一個(gè)數(shù)組列表

    • false 表示結(jié)果不是一個(gè)數(shù)組列表

  • display 展示配置,用于前端頁面展示觸發(fā)器的名稱等信息m

    • label 觸發(fā)器展示的名稱

    • description 觸發(fā)器的描述信息

    • directions 鏈接信息,可以設(shè)置為該觸發(fā)器的來源頁面地址

    • important 是否置頂,默認(rèn)為false

      • true 表示需要置頂

      • false 表示不需要置頂

    • hidden 是否隱藏,當(dāng)設(shè)置為true時(shí)前端不展示該觸發(fā)器,默認(rèn)為false

      • true 表示需要隱藏

      • false 表示不需要隱藏

  • triggerMode 觸發(fā)器的模式,主要是定義觸發(fā)器的數(shù)據(jù)來源,目前的選項(xiàng)有:輪詢和事件觸發(fā)

    • polling 通過輪詢方式查詢數(shù)據(jù),一般是通過時(shí)間來查詢某個(gè)列表

    • pushing 事件或者消息來源,一般是第三方SaaS通過配置回調(diào)接口,進(jìn)行事件推送

  • triggerConfig 觸發(fā)器配置,主要是針對(duì)輪詢方式的觸發(fā)器的配置

    • cron 輪詢的時(shí)間表達(dá)式,

    • outOfFrequencyControl 配置為true cron表達(dá)式才生效,否則會(huì)根據(jù)用戶版本設(shè)置輪訓(xùn)周期

    • startTime 開始觸發(fā)的時(shí)間

    • ukFields 唯一標(biāo)識(shí)記錄的字段列表,主要用于標(biāo)識(shí)該條記錄有沒有觸發(fā)過

    • supportPaging 是否支持分頁,支持分頁時(shí)需要

      • true 支持

      • false 不支持

    • pageSize 分頁大小設(shè)置

    • pageSizeField 分頁大小對(duì)應(yīng)的字段名稱

    • pageIndexField 分頁頁碼對(duì)應(yīng)的字段名稱

  • operation 獲取觸發(fā)數(shù)據(jù)的執(zhí)行方法,對(duì)于輪詢的觸發(fā)器需要進(jìn)行定義,事件觸發(fā)的無需定義,要求執(zhí)行方法返回的數(shù)據(jù)是數(shù)組

  • sample 獲取樣本數(shù)據(jù)的執(zhí)行方法,對(duì)于輪詢的觸發(fā)器需要進(jìn)行定義,事件觸發(fā)的無需定義,要求執(zhí)行方法返回的數(shù)據(jù)是單個(gè)對(duì)象

  • beforeTrigger 觸發(fā)器執(zhí)行請(qǐng)求前執(zhí)行方法列表,一般用于對(duì)請(qǐng)求參數(shù)進(jìn)行處理,beforeTrigger的執(zhí)行時(shí)機(jī)是在獲取到觸發(fā)事件的數(shù)據(jù)之后,進(jìn)行流程觸發(fā)之前,對(duì)于事件觸發(fā)的是在收到第三方的事件觸發(fā)之后,對(duì)于輪詢觸發(fā)的是在執(zhí)行輪詢operation,獲取到單個(gè)對(duì)象之后

  • afterTrigger 觸發(fā)器后執(zhí)行方法列表,一般用于對(duì)于返回?cái)?shù)據(jù)進(jìn)行處理,執(zhí)行時(shí)機(jī)是在發(fā)出觸發(fā)事件之后

1.5 執(zhí)行器

  • operations 執(zhí)行器列表,用于執(zhí)行器定義,執(zhí)行器列表是個(gè)KV列表,其中Key是執(zhí)行器的關(guān)鍵字定義,Value是一個(gè)執(zhí)行器定義

  • key 用于唯一標(biāo)識(shí)執(zhí)行器

  • value 執(zhí)行器的具體定義

執(zhí)行器對(duì)象的定義:

  • key 執(zhí)行器的key 和前文的key 保持一致

  • paramClass 參數(shù)對(duì)象類型,主要為了以后對(duì)參數(shù)映射進(jìn)行擴(kuò)展使用,當(dāng)前暫時(shí)可以不配置

  • resultClass 結(jié)果對(duì)象類型,主要為了以后對(duì)參數(shù)映射進(jìn)行擴(kuò)展使用,當(dāng)前暫時(shí)可以不配置

  • resultIsList 結(jié)果是否是一個(gè)數(shù)組列表,此處主要針對(duì)的是一級(jí)結(jié)果,默認(rèn)為false

    • true 表示結(jié)果是一個(gè)數(shù)組列表

    • false 表示結(jié)果不是一個(gè)數(shù)組列表

  • hidden 是否隱藏,當(dāng)設(shè)置為true時(shí)前端不展示該執(zhí)行器,默認(rèn)為false

    • true 表示需要隱藏

    • false 表示不需要隱藏

  • display 展示配置,用于前端頁面展示執(zhí)行器的名稱等信息

    • label 執(zhí)行器展示的名稱

    • description 執(zhí)行器的描述信息

    • directions 鏈接信息,可以設(shè)置為該執(zhí)行器的來源頁面地址

    • important 是否置頂,默認(rèn)為false

      • true 表示需要置頂

      • false 表示不需要置頂

  • categoryName 分類名,把同一類的放在一個(gè)組下,如 訂單、商品、

  • operation 執(zhí)行器的請(qǐng)求定義,在此定義執(zhí)行器方法(具體定義看 3.8 執(zhí)行方法定義)

  • inputFields 執(zhí)行器輸入字段定義

  • outputFields 執(zhí)行器輸出字段定義

  • tags 該執(zhí)行器的備注信息

1.6 執(zhí)行方法定義

執(zhí)行方法是引擎支持的某個(gè)具體的執(zhí)行定義,當(dāng)前支持4種類型,分別為:

  • request 請(qǐng)求類型

  • function 函數(shù)類型

  • dependency 依賴類型

  • script 腳本類型

根據(jù)每個(gè)類型有具體的定義:

1.6.1 請(qǐng)求類型

請(qǐng)求類型是指主體功能是調(diào)用HTTP API

 

  • executeType: request  請(qǐng)求類型

  • method 發(fā)起請(qǐng)求的方法,支持以下選項(xiàng)

    • GET

    • PUT

    • POST

    • PATCH

    • DELETE

    • HEAD

  • url 請(qǐng)求的完整地址

  • body 請(qǐng)求body配置

    • bodyType  請(qǐng)求體類型

      • NULL 為空

      • STRING 字符串

      • ARRAY 數(shù)組

      • OBJECT JSON對(duì)象類型

      • XML XML格式

    • bodyContent 請(qǐng)求體內(nèi)容,根據(jù)bodyType傳入具體的值

  • queryParams 查詢請(qǐng)求參數(shù),KV形式

  • formParams  表單請(qǐng)求參數(shù),KV形式

  • headers 頭部請(qǐng)求參數(shù) (在此定義優(yōu)先級(jí)高于requestTemplate中的定義)

  • signConfig 簽名配置

    • signType 簽名類型,簽名的實(shí)現(xiàn),目前可以使用簽名腳本類型

      • script 通過簽名腳本進(jìn)行簽名

    • signOutField 簽名輸出字段

    • signInField 簽名字段參數(shù),KV形式

    • signSetting 簽名配置,針對(duì)腳本簽名需要增加以下參數(shù)

      • connectorId 腳本連接器ID

      • scriptType 腳本類型

      • sceneCode 場(chǎng)景編碼version 腳本版本

  • beforeRequest 請(qǐng)求前執(zhí)行方法列表,一般用于對(duì)請(qǐng)求參數(shù)進(jìn)行處理

  • afterResponse 請(qǐng)求后執(zhí)行方法列表,一般用于對(duì)于返回?cái)?shù)據(jù)進(jìn)行處理

 

1.6.2 函數(shù)類型

函數(shù)類型是指調(diào)用一個(gè)內(nèi)置類的函數(shù),或者內(nèi)置表達(dá)式

  • executeType  function  函數(shù)類型

  • isExpress 是否是表達(dá)式

    • true 是 執(zhí)行的是內(nèi)置表達(dá)式

    • false 否 執(zhí)行的是類方法

  • providerClass 執(zhí)行類的全路徑,isExpress 為false時(shí)必填

示例:

? "providerClass":"com.shuhuan.ipaas.connector.spi.yunpian.InputAndOutputBuilder"

  • function 執(zhí)行的具體方法,對(duì)于表達(dá)式來說是具體的表達(dá)式,對(duì)于執(zhí)行類方法時(shí)是類的方法,對(duì)于是表達(dá)式時(shí)是具體的表達(dá)式

示例:

? "function":"generateTemplateContentInput"

? "function":"${assert:equals(0,object:eval(body, '/msg'))}"

  • paramsExpression 參數(shù)表達(dá)式,對(duì)于執(zhí)行類方法時(shí)傳入

  • returnType 返回值類型

    • VOID 無返回值

    • STRING 字符串

    • BOOLEAN 布爾值

    • NUM 數(shù)字

    • INT 整形數(shù)字

    • ARRAY 數(shù)組或者列表

    • OBJECT 對(duì)象或者M(jìn)ap類型

  • returnItemType 返回列表的數(shù)據(jù)類型,returnType是ARRAY時(shí)需要

    • VOID 無返回值

    • STRING 字符串

    • BOOLEAN 布爾值

    • NUM 數(shù)字

    • INT 整形數(shù)字

    • ARRAY 數(shù)組或者列表

    • OBJECT 對(duì)象或者M(jìn)ap類型

1.6.3 依賴類型

依賴類型是指可以調(diào)用一組已經(jīng)配置的執(zhí)行動(dòng)作,并做一些數(shù)據(jù)處理

  • executeType  dependency  依賴類型

  • dependencyOperationKeys 依賴的執(zhí)行動(dòng)作的Key列表

示例:

? "dependencyOperationKeys": ["getUidByMobile", "getUserDetailByUserId"]

  • afterResponse 所有依賴的執(zhí)行動(dòng)作執(zhí)行完成后執(zhí)行方法列表,一般用于對(duì)于返回?cái)?shù)據(jù)進(jìn)行處理

 

1.6.4 腳本類型

腳本類型是指執(zhí)行一個(gè)腳本

  • executeType  script  腳本類型

  • connectorId 腳本對(duì)應(yīng)的連接器ID

  • sceneCode 腳本場(chǎng)景碼,用來標(biāo)識(shí)該腳本應(yīng)用場(chǎng)景

  • type 腳本類型

    • java

    • js

    • python

  • version 腳本版本

  • paramsExpression 執(zhí)行的參數(shù)表達(dá)式,表達(dá)式為空時(shí)將會(huì)將整個(gè)參數(shù)上下文傳入,不為空時(shí)計(jì)算完成表達(dá)式后傳入

  • returnType 返回值類型

    • VOID 無返回值

    • STRING 字符串

    • BOOLEAN 布爾值

    • NUM 數(shù)字

    • INT 整形數(shù)字

    • ARRAY 數(shù)組或者列表

    • OBJECT 對(duì)象或者M(jìn)ap類型

  • returnItemType 返回列表的數(shù)據(jù)類型,returnType是ARRAY時(shí)需要

    • VOID 無返回值

    • STRING 字符串

    • BOOLEAN 布爾值

    • NUM 數(shù)字

    • INT 整形數(shù)字

    • ARRAY 數(shù)組或者列表

    • OBJECT 對(duì)象或者M(jìn)ap類型

1.7 字段定義

  • key 用于該執(zhí)行方法中唯一標(biāo)識(shí)字段

  • label 展示配置,用于前端頁面展示字段名稱

  • helpText 幫助信息,作為輸入字段時(shí)需要,非必要不填寫

  • placeholder 輸入框提示信息,作為輸入字段時(shí)需要

  • type 字段類型

  • widget 前端控件widgetConfig 配置說明文檔

  • widgetConfig 前端組件的配置 KV形式

  • required 是否為必填選項(xiàng),作為輸入字段時(shí)需要

    • true 必填

    • false 選填

  • defaultValue 默認(rèn)值

  • supportMultiple 是否支持多選,默認(rèn)false(搭配選擇控件時(shí)使用)

    • true 支持

    • false 不支持

  • datasource 可選數(shù)據(jù)源,KV形式

    • label 展示鍵

    • value 實(shí)際值

  • dynamicDataSource 動(dòng)態(tài)數(shù)據(jù)源 動(dòng)態(tài)數(shù)據(jù)路由

    • routerType 動(dòng)態(tài)類型

      • beforeRequest 在請(qǐng)求之前

      • afterRequest 在請(qǐng)求響應(yīng)之后

      • constant 常量

    • condition 判斷是否符合路由條件

    • params  執(zhí)行動(dòng)態(tài)數(shù)據(jù)源的參數(shù)列表

    • selectCondition 判斷是否可選的條件表達(dá)式

    • deepCondition 判斷是否可下拉的條件表達(dá)式

    • refOperation 獲取動(dòng)態(tài)數(shù)據(jù)源的執(zhí)行動(dòng)作 

    • refLabel 動(dòng)態(tài)label的取值方式

    • refValue  動(dòng)態(tài)value的取值方式

    • router 下級(jí)的路由規(guī)則

    • datasource 靜態(tài)數(shù)據(jù)源,routerType 為constant時(shí)設(shè)置

  • dynamicFields 動(dòng)態(tài)字段 dynamicFields

    • routerType 動(dòng)態(tài)類型

      • beforeRequest 在請(qǐng)求之前

      • afterRequest 在請(qǐng)求響應(yīng)之后

      • constant 常量

    • condition 判斷是否符合路由條件

    • params 參數(shù)列表

    • refOperation 獲取動(dòng)態(tài)字段的執(zhí)行動(dòng)作 

    • refInputFields 動(dòng)態(tài)輸入字段的取值表達(dá)式

    • refOutputFields 動(dòng)態(tài)輸出字段的取值表達(dá)式

    • inputFields 對(duì)于routerType 是constant時(shí)設(shè)置

    • outputFields 對(duì)于routerType 是constant時(shí)設(shè)置

  • childrenType 子節(jié)點(diǎn)類型

  • children 子節(jié)點(diǎn)

2.簽名腳本開發(fā)

在應(yīng)用shuhuan-ipaas-app-libs的signer目錄下開發(fā)簽名類,簽名算法改成通過java執(zhí)行腳本的方案實(shí)現(xiàn)簽名算法,簽名類需要繼承JavaScriptRunner類重寫execute方法    

/**
 * @author yunmu
 * @date 2022-03-04 6:44 下午
 */
public abstract class JavaScriptRunner {

    public abstract <T> T execute(Object params);
}

params 是一個(gè)Map對(duì)象,Map中會(huì)包含以下數(shù)據(jù):

  • 上下文參數(shù)數(shù)據(jù)

  • signRequest 待簽名的http請(qǐng)求獲取方式:

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";

    @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;
        HttpApiRequest apiRequest = (HttpApiRequest) paramsMap.get(SignConfigConstant.SIGN_REQUEST);
        String appKey = (String) paramsMap.get(SignConfigConstant.APP_KEY);
        String appSecret = (String) paramsMap.get(SignConfigConstant.APP_SECRET);

        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();
        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 為所有參數(shù), TreeMap 表示為樹形結(jié)構(gòu)的哈希容器
    // 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.觸發(fā)器腳本開發(fā)

編寫事件回調(diào)數(shù)據(jù)處理腳本。例如

  1. 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;
    
    /**
     * 推送事件  數(shù)據(jù)處理
     * 文檔地址: 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);
        }
    
        /**
         * @param 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": "會(huì)議簽到"
         *             },
         *             "fields": {
         *                 "姓名": "草料",
         *                 "手機(jī)": "18888648888",
         *                 "微信名": "CHEN",
         *                 "身份證號(hào)": "330200000000000000",
         *                 "工號(hào)": "FBI100",
         *                 "單選項(xiàng)": "是"
         *             }
         *         }
         *     }
         * }
         *
         *
         * @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": "會(huì)議簽到"
         *                     },
         *                     "fields": {
         *                         "姓名": "草料",
         *                         "手機(jī)": "18888648888",
         *                         "微信名": "CHEN",
         *                         "身份證號(hào)": "330200000000000000",
         *                         "工號(hào)": "FBI100",
         *                         "單選項(xiàng)": "是"
         *                     }
         *                 }
         *             }
         *         }
         *     ]
         * }
         */
        public static JSONObject buildPushEventOutput(Object params) {
            JSONObject output = new JSONObject();
            if (!(params instanceof Map)) {
                log.error("當(dāng)前腳本入?yún)㈩愋湾e(cuò)誤!期望是Map,但是實(shí)際為{},具體值為{}", params.getClass().getName(), JSON.toJSONString(params));
                return output;
            }
            JSONObject input = (JSONObject) params;
    
            /**
             * 這里的事件內(nèi)容的數(shù)據(jù)類型,有可能是數(shù)組,也可能是對(duì)象,具體按照推送方格式為準(zhǔn),作匹配的處理:
             * 1.解密(不是所有的消息都需要做)
             * 2.獲取事件的標(biāo)識(shí)
             * 3.將事件標(biāo)識(shí)轉(zhuǎn)換為觸發(fā)器的key
             * 4.構(gòu)造接口返回,務(wù)必與推送方要求保持一致
             */
    
            List<JSONObject> eventContents = Lists.newArrayList();
            JSONObject data = (JSONObject) input.get(BODY);
            JSONObject item = new JSONObject();
            //2. 獲取對(duì)應(yīng)事件的key。
            String event = (String) data.get("event");
            //3. 做觸發(fā)器的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. 對(duì)應(yīng)事件的輸出內(nèi)容,與觸發(fā)器的輸出字段保持一致
            item.put(EVENT_CONTENT, JSON.parseObject(data.getString("data")));
            eventContents.add(item);
    
            output.put(EVENT_CONTENTS, eventContents);
    
    
            //推送事件后的響應(yīng)結(jié)果,必須和推送方要求的返回結(jié)果一致
            Map<String, Object> result = new HashMap<>(16);
            result.put("code", 0);
            result.put("message", "success");
    
            output.put(RESULT, result);
            return output;
        }
    
    
    }
    

     

 

 

本篇目錄

{{item.innerText}}

{{item.categoryName}}
主站蜘蛛池模板: 欧美福利电影在线观看 | 久一区二区三区 | 一级毛片观看 | 99免费精品| 久久精品国产亚洲一区二区三区 | 精品91在线 | 国产 欧美 日韩 一区 | 国产成人精品一区二 | 91精品国产综合久久久久久蜜月 | 日韩一区二区三区在线观看 | 久久av资源 | 亚洲乱码国产乱码精品精98午夜 | 日韩欧美国产一区二区三区 | 亚洲综合在线播放 | 狠狠操操 | 99久久婷婷国产精品综合 | 黄色国产在线看 | 中文精品在线 | 美女福利网站 | 色综合久| 日韩欧美一区二区三区久久婷婷 | 国产精品一区二区久久久久 | 精品国产高清一区二区三区 | 自拍第一页| 精品无人乱码一区二区三区 | 国产色网站 | 久久精品亚洲 | 精品国产一区二区三区性色av | 一级毛片色一级 | 999这里只有精品 | 中文字幕在线观看亚洲 | 人人插人人 | a∨色狠狠一区二区三区 | 青青草久 | 国产不卡免费视频 | 免费亚洲网站 | 欧美激情一区二区 | 精品九九九 | 在线看91 | 操夜夜| 国产精品自拍一区 |