通过飞书机器人调用SAP服务(2/3)
james
2021.06.23 11:48发布于技术 - 新手入门
1300
本例描述的是让用户在飞书聊天群里用户呼叫飞书机器人,调用后端Mendix服务,返回SAP查询信息给飞书聊天群。

第二部分 Mendix服务开发

目前的方案是在Mendix上创建了一个可消费的RESTFUL服务,

图片5.png

图片6.png

创建Microflow逻辑如下:

1)根据获得来自飞书的消息, 创建HTTPResponse

因为需要在1 秒内回复飞书Request中的 CHALLENGE 值,所以要保存HTTPREQUEST中的CONTENT内容信息到HTTPResponse中,同时Response的StatusCode为“200”。

图片7.png

图片8.png

2、获得飞书上用户输入的变量

因为用户输入不同信息,希望获得飞书机器人不同的回复,所以需要通过Import Mapping把用户输入信息解析出来。

图片10.png

图片11.png

输入变量赋值到Variable_2对象中。

 

创建Jason结构 “AP_Purchase_Order.JSON_Feishu_MSG_first”

使用例子(当用户向机器人发出” 2600001525 6500 2019”查询财务凭证信息时发出的消息格式):

{

    "uuid": "71c7fb189e40ed36XXXXXc91b68a24",

    "event": {

        "app_id": "cli_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”,

        "chat_type": "private",

        "employee_id": "ffb1c316",

        "is_mention": false,

        "lark_version": "lark/4.1.4",

        "message_id": "",

        "msg_type": "text",

        "open_chat_id": "oc_e7ab3a366dcf33e282a3526da23c8cc5",

        "open_id": "ou_20386a40b2af9a1d7bb1085853aff603",

        "open_message_id": "om_b2936126a9e7673de9d3bc01e59fa9ee",

        "parent_id": "",

        "root_id": "",

        "tenant_key": "2cXXXX575f",

        "text": "2600001525 6500 2019",

        "text_without_at_bot": "2600001525 6500 2019",

        "type": "message",

        "union_id": "on_a0883cdXXXXX394491ddab1745f",

        "user_agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36 Lark/4.1.4 LarkLocale/zh_CN ttnet SDK-Version/4.1.26",

        "user_open_id": "ou_20XXXXXXXXX03"

    },

    "token": "dXXXXXXXXXX2ipmJ",

    "ts": "1622708952.981788",

    "type": "event_callback"

}

JSON消息中,需要获取的是

"employee_id" 飞书用户号

"open_chat_id" 飞书聊天群号

"text" 用户向机器人输入的文字

创建Jason结构的Import Mapping:

图片12.png

系统自动创建对应的Domain Model: Root

图片13.png

3、通过app_id,app_secret调用飞书API,获得tenant_access_token

向飞书发送消息,需要用appid和app_secret调用API获得token, 然后通过token再调用飞书API发送消息。

创建变量Token_request,分别赋值app_id和app_secret:

图片14.png

图片15.png

调用飞书API:https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/

图片16.png

图片17.png

图片18.png

把token_request赋值给这个Call REST的request:

图片19.png

把调用飞书API后返回的内容,通过JSON格式Mapping保存入tenant_access_token对象变量中。

图片20.png

图片21.png

图片22.png

把tenant_access_token对象变量中的tenant_access_token值,保存到tenant_access_token文本变量中:

图片23.png

4、调用SAP Odata服务,获得用户查询对应的EntitySet,保存到列表zadocalist.

图片24.png

图片25.png

通过Substring函数,把Variable_2对象中的Text中的BELNR单据号,RBUKRS公司,GJAHR年度获得放到Parameter中,传入另外一个微流,在这个微流里调用SAP ODATA服务,并把查询结果保存在zacdocaList列表中。

图片26.png

SAP查询用户和密码保存在固定变量中:

图片27.png

调用SAP ODATA:

图片28.png

Query的表达式举例:@ZRFICO_PROJECT_SRV.ZRFICO_PROJECT_SRV+'/'+ toString(ZRFICO_PROJECT_SRV.zacdocaList.zacdocaSet
)+'?$filter=Rbukrs%20eq%20%27'+$RBUKRS+'%27%20and%20Gjahr%20eq%20%27'
+$GJAHR+'%27%20and%20Belnr%20eq%20%27'+$BELNR+'%27'

其中@ZRFICO_PROJECT_SRV.ZRFICO_PROJECT_SRV代表SAPOdata服务名,ZRFICO_PROJECT_SRV.zacdocaList.zacdocaSet代表EntitySet名称。

拼接后的整个查询字符串举例为:

http://10.60.89.37:8000/sap/opu/odata/sap/ZRFICO_PROJECT_SRV/zacdocaSet?$filter=Rbukrs%20eq%20%276500%27%20and%20Gjahr%20eq%20%272019%27%20and%20Belnr%20eq%20%272600001525%27

调用SAPOdata服务后,运行结果保存到$ListOfACDOCA列表中。

图片29.png

5、生成查询返回飞书聊天群消息文本

图片30.png

图片31.png

把聊天群信息保存在chat_id变量中:

图片32.png

图片33.png

把用户ID信息保存在chat_id变量中:

图片35.png

图片34.png

创建返回信息的开头部分:@用户ID + 用户输入文本:

图片36.png

图片37.png

这一步完成后,返回到飞书的信息样子如下:

图片38.png

创建循环用于读取SAP返回的记录行,拼接成返回给飞书的消息内容:

图片39.png

图片40.png

在本例子中,用SAP Odata返回的记录中的4列信息组成返回给飞书的消息内容:

图片41.png

这一步做完后,返回飞书的消息文本格式如下:

图片42.png

6、通过chat_id,tenant_access_token,返回SAP查询消息给飞书群

图片43.png

创建对象NewRoot,按照返回信息报文格式,填写chat_id, msg_type, content, user_id:

图片44.png

然后Call飞书REST(https://open.feishu.cn/open-apis/message/v4/send/):

图片45.png

在HTTP Header中填写key “Authorization”,

格式为'Bearer ' + $Newtoken/tenant_access_token

图片46.png

构建Request的消息主体:

图片47.png

把NewRoot变量中保存的信息,Mapping到对应的HTTP请求报文中:

图片48.png

生成对应第一步飞书Request的返回飞书的Response,状态(StatusCode)200:

图片49.png

 

颂文Gavin
点赞
收藏
手机查看
举报
0个评论
倒序看帖
仅看楼主

暂无数据