企业微信官方接口:

应用支持推送文本、图片、视频、文件、图文等类型。

请求方式:POST(HTTPS
请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN

大概思路:

1. 封装调用企业微信函数 SE37 :ZWECHAT_SEND_MESSAGE_MSGTYPE

注:

a.   I_MSGTYPE 参数值 作为动态值新增到表结构,构造企业微信API body

b.   I_MESSAGE 参数值 为json格式的消息内容

2.程序调用 ZWECHAT_SEND_MESSAGE_MSGTYPE,传入处理过的 I_MESSAGE

代码实现:

1. SE37 :ZWECHAT_SEND_MESSAGE_MSGTYPE

  1 FUNCTION zwechat_send_message_msgtype.
2 *"----------------------------------------------------------------------
3 *"*"本地接口:
4 *" IMPORTING
5 *" VALUE(I_MESSAGE) TYPE STRING
6 *" VALUE(I_MSGTYPE) TYPE STRING
7 *" EXPORTING
8 *" VALUE(E_MESSAGE) TYPE STRING
9 *" TABLES
10 *" T_TOUSER STRUCTURE ZWECHAT_NOTIFYER OPTIONAL
11 *" T_TOPARTY STRUCTURE ZWECHAT_NOTIFYER OPTIONAL
12 *" T_TOTAG STRUCTURE ZWECHAT_NOTIFYER OPTIONAL
13 *"----------------------------------------------------------------------
14
15
16 DATA:url TYPE string VALUE 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='."接口地址
17 DATA:i_agentid TYPE string VALUE '小程序ID'.
18 DATA:i_corpid TYPE string VALUE '公司的ID'.
19 DATA:i_corpsecret TYPE string VALUE '企业应用secret'.
20
21 DATA:access_token TYPE string.
22 DATA:lv_client TYPE REF TO if_http_client.
23
24 DATA:l_touser TYPE string.
25 DATA:l_toparty TYPE string.
26 DATA:l_totag TYPE string.
27
28
29 "http通用参数
30 TYPES:BEGIN OF ty_common,
31 touser TYPE string, "成员ID列表,多个接收者用‘|’分隔,最多支持1000个
32 toparty TYPE string, "部门ID列表,多个接收者用‘|’分隔,最多支持100个
33 totag TYPE string, "标签ID列表,多个接收者用‘|’分隔,最多支持100个
34 msgtype TYPE string, "消息类型
35 agentid TYPE string, "企业应用的id
36 safe TYPE i, "表示是否是保密消息,0表示可对外分享,1表示不能分享且内容显示水印,默认为0
37 enable_id_trans TYPE i, "是否开启id转译,0表示否,1表示是,默认0。仅第三方应用需要用到,企业自建应用可以忽略
38 enable_duplicate_check TYPE i, "是否开启重复消息检查,0表示否,1表示是,默认0
39 duplicate_check_interval TYPE i, "是否重复消息检查的时间间隔,默认1800s,最大不超过4小时
40 END OF ty_common.
41
42
43 "http返回
44 TYPES:BEGIN OF t_record,
45 errcode TYPE string,
46 errmsg TYPE string,
47 END OF t_record.
48
49 DATA:json TYPE string.
50 DATA:record TYPE t_record.
51 DATA:common TYPE ty_common.
52
53 DATA:ev_data(6000) TYPE c."返回
54 DATA:lv_json TYPE string.
55
56
57 *--动态创建结构和表
58 DATA:
59 dref_str TYPE REF TO data,
60 struct_type TYPE REF TO cl_abap_structdescr,
61 elem_type TYPE REF TO cl_abap_elemdescr,
62 comp_tab TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.
63
64 "动态创建结构类型
65 * struct_type ?= cl_abap_structdescr=>describe_by_name( 'ZTPP200' ). "根据名称获取系统创建好的结构
66 struct_type ?= cl_abap_structdescr=>describe_by_data( common ). "根据程序中定义的结构,创建结构类型
67
68 "获取该结构类型中,结构组件(字段)
69 comp_tab[] = struct_type->get_components( )."组成结构体的各个字段组件
70
71 "扩展结构字段
72 elem_type ?= cl_abap_elemdescr=>get_string( ).
73 comp_tab-name = i_msgtype. "新增成员的类型名称,消息类型
74 comp_tab-type = elem_type. "新增成员的类型对象
75 INSERT comp_tab INTO comp_tab INDEX 1.
76
77
78 "根据新的组件创建结构类型
79 struct_type = cl_abap_structdescr=>create( comp_tab[] ).
80 "根据结构类型,创建结构对象
81 CREATE DATA dref_str TYPE HANDLE struct_type.
82
83 FIELD-SYMBOLS: <is_str> TYPE any.
84 "引用创建的动态构造
85 IF dref_str IS BOUND.
86 ASSIGN dref_str->* TO <is_str>.
87 ENDIF.
88
89
90
91 *--基本检查
92 CHECK ( t_touser[] IS NOT INITIAL
93 OR t_toparty[] IS NOT INITIAL
94 OR t_totag[] IS NOT INITIAL ) AND i_message IS NOT INITIAL.
95
96
97 CLEAR:l_touser,l_toparty,l_totag,lv_json,ev_data,record,json.
98
99 *--通知人员处理
100 DATA(l_lines) = lines( t_touser ).
101
102 LOOP AT t_touser. "人员ID
103 IF sy-tabix = l_lines.
104 l_touser = t_touser-notifyer && l_touser && ''.
105 ELSE.
106 l_touser = l_touser && '|' && t_touser-notifyer.
107 ENDIF.
108 ENDLOOP.
109
110 CLEAR:l_lines.
111 l_lines = lines( t_totag ).
112 LOOP AT t_toparty. "部门ID
113 IF sy-tabix = l_lines.
114 l_toparty = t_toparty-notifyer && l_toparty && ''.
115 ELSE.
116 l_toparty = l_toparty && '|' && t_toparty-notifyer.
117 ENDIF.
118 ENDLOOP.
119
120 CLEAR:l_lines.
121 l_lines = lines( t_totag ).
122 LOOP AT t_totag. "标签ID
123 IF sy-tabix = l_lines.
124 l_totag = t_totag-notifyer && l_totag && ''.
125 ELSE.
126 l_totag = l_totag && '|' && t_totag-notifyer.
127 ENDIF.
128 ENDLOOP.
129
130
131 *--message处理
132 FIELD-SYMBOLS:<fs_msg_value> TYPE any.
133 "用指针<fs_msg_value>指向工作区<is_str>中的一个字段,字段名为i_msgtype.
134 ASSIGN COMPONENT i_msgtype OF STRUCTURE <is_str> TO <fs_msg_value>.
135 "给指针指向的字段赋值
136 <fs_msg_value> = i_message. "接口message传值
137
138 *--通用参数处理
139 MOVE-CORRESPONDING VALUE ty_common( touser = l_touser
140 toparty = l_toparty
141 totag = l_totag
142 msgtype = i_msgtype
143 agentid = i_agentid
144 enable_duplicate_check = 1 ) TO <is_str>. "开启重复消息检查
145
146 "abap结构转json
147 /ui2/cl_json=>serialize( EXPORTING data = <is_str>
148 pretty_name = 'L' "空大写,L小写,X驼峰,Y增强驼峰
149 RECEIVING r_json = lv_json ).
150
151
152 "特殊字符反转义
153 lv_json = replace( val = lv_json
154 sub = '\"'
155 with = '"'
156 occ = '0' ).
157
158 lv_json = replace( val = lv_json
159 sub = '\\'
160 with = '\'
161 occ = '0' ).
162
163 lv_json = replace( val = lv_json
164 sub = '"{'
165 with = '{'
166 occ = '0' ).
167
168 lv_json = replace( val = lv_json
169 sub = '}"'
170 with = '}'
171 occ = '0' ).
172
173
174
175 *--http请求处理
176 CALL FUNCTION 'ZWECHAT_GET_ACCESS_TOKEN' "获取token
177 EXPORTING
178 i_corpid = i_corpid
179 i_corpsecret = i_corpsecret
180 IMPORTING
181 o_access_token = access_token.
182
183
184 url = url && access_token.
185
186
187 CALL METHOD cl_http_client=>create_by_url
188 EXPORTING
189 url = url
190 IMPORTING
191 client = lv_client
192 EXCEPTIONS
193 argument_not_found = 1
194 plugin_not_active = 2
195 internal_error = 3
196 OTHERS = 4.
197
198
199 lv_client->request->set_header_field( name = '~request_method' value = 'POST' )."调用方法get OR post
200 lv_client->request->set_content_type( 'application/json' ).
201
202 "传入参数json格式
203 lv_client->request->set_cdata( lv_json ).
204
205
206 CALL METHOD lv_client->send(
207 EXCEPTIONS
208 http_communication_failure = 1
209 http_invalid_state = 2 ).
210 * Prepare client-receive:
211
212 CALL METHOD lv_client->receive
213 EXCEPTIONS
214 http_communication_failure = 1
215 http_invalid_state = 2
216 http_processing_failed = 3
217 OTHERS = 4.
218
219 * Get HTML:
220 ev_data = lv_client->response->get_cdata( )."返回值
221
222 json = ev_data.
223
224 /ui2/cl_json=>deserialize( EXPORTING json = json CHANGING data = record ).
225
226 e_message = record-errmsg.
227
228
229 ENDFUNCTION.

2.程序调用 ZWECHAT_SEND_MESSAGE_MSGTYPE

 1 FORM frm_send_wechat .
2
3 DATA:BEGIN OF ls_textcard,
4 title TYPE string VALUE 'FDPPM质量预警监控平台推送',
5 description TYPE string,
6 url TYPE string VALUE 'https://exmail.qq.com/login',
7 btntxt TYPE string VALUE '更多',
8 END OF ls_textcard.
9
10 DATA:lv_json TYPE string.
11 DATA:e_message TYPE string.
12 CLEAR:lv_json.
13
14 DATA:l_week LIKE scal-week.
15
16
17 SELECT ad_smtpadr FROM zmm_t_0003 INTO TABLE @DATA(lt_wechat_tag) WHERE status = 'W' AND zprogram = @sy-repid.
18
19 CHECK lt_wechat_tag[] IS NOT INITIAL.
20
21 CALL FUNCTION 'DATE_GET_WEEK'
22 EXPORTING
23 date = s_budat-low
24 IMPORTING
25 week = l_week
26 * EXCEPTIONS
27 * DATE_INVALID = 1
28 * OTHERS = 2
29 .
30 IF sy-subrc <> 0.
31 * Implement suitable error handling here
32 ENDIF.
33
34 CONDENSE lv_count_v.
35 CONDENSE lv_count_m.
36
37 IF s_budat-high IS INITIAL.
38 s_budat-high = sy-datum.
39 ENDIF.
40
41 ls_textcard-description = '<div class=\"gray\">' && s_budat-low && '-' && s_budat-high && '</div>'.
42 ls_textcard-description = ls_textcard-description && '<div class=\"normal\">' && '【' && l_week+0(4) && 'W' && l_week+4(2) && '】'.
43 ls_textcard-description = ls_textcard-description && '供应商来料不良情况汇总-Week</div>'.
44 ls_textcard-description = ls_textcard-description && '<div class=\"normal\">未达标供应商个数:' && lv_count_v && '</div>'.
45 ls_textcard-description = ls_textcard-description && '<div class=\"normal\">不良物料号个数:' && lv_count_m && '</div>'.
46 ls_textcard-description = ls_textcard-description && '<div class=\"highlight\">具体明细已发送至您的邮箱</div>'.
47
48 "abap数据转json
49 CLEAR:lv_json.
50 /ui2/cl_json=>serialize( EXPORTING data = ls_textcard
51 pretty_name = 'L' "空大写,L小写,X驼峰,Y增强驼峰
52 RECEIVING r_json = lv_json ).
53
54 lv_json = replace( val = lv_json sub = '\"' with = '"' occ = '0' ).
55 lv_json = replace( val = lv_json sub = '\\' with = '\' occ = '0' ).
56
57 CALL FUNCTION 'ZWECHAT_SEND_MESSAGE_MSGTYPE'
58 EXPORTING
59 i_message = lv_json
60 i_msgtype = 'textcard'
61 IMPORTING
62 e_message = e_message
63 TABLES
64 t_totag = lt_wechat_tag[].
65
66 ENDFORM.

3.实现效果:企业微信通知

SAP ABAP 动态结构实现发送企业微信应用消息的更多相关文章

  1. Java发送企业微信应用消息

    1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接收到消息后,再 ...

  2. 【ABAP系列】SAP ABAP 动态指针

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 动态指针   ...

  3. 使用Python发送企业微信消息

    准备工作: 到企业微信官网,注册一个企业:登录企业微信后台,创建一个“自建”应用, 获取企业ID.agentid.secret这3个必要的参数:在企业微信的通讯录中,创建多个测试账号:在手机端安装“企 ...

  4. zabbix 监控redis 挂掉自动重启 并发送企业微信

    1.创建redis监控项[配置]-[主机]-[监控项]-创建监控项,监控6379端口(注意关闭防火墙或者开启防火墙端口6379) redis配置文件设置允许任何地址监听: 添加监控项 2.创建redi ...

  5. Python 发送企业微信消息

    1.获取企业微信信息 1)我的企业 --> 企业信息 --> 企业ID 2)创建一个应用,记录该应用的 AgentId.Secret 2.python代码 #!/usr/bin/env p ...

  6. 【perl】企业微信发消息

    https://open.work.weixin.qq.com/api/doc#90000/90135/90236 #!/usr/bin/env perl use strict; use warnin ...

  7. 通过企业微信API接口发送消息

    最近给公司测试组内部开发一个记账小工具,当账目出现问题的时候需要发送消息通知大家,前期主要采用的QQ发送通知消息,但是有一天突然无法连接到QQ服务器,运维的同学建议采用微信的方式对接然后进行告警,所以 ...

  8. python发送微信及企业微信消息

    1.发送微信消息 直接使用第三方库 itchat,其文档中有详细使用方式:https://itchat.readthedocs.io/zh/latest/ 如下实例为 发送群聊信息 # -*- cod ...

  9. 使用gitlab ci构建IOS包并发送通知消息到企业微信

    在之前的文章中,我们介绍了使用gitlab ci构建Android包的方法.今天我们介绍使用gitlab ci如何构建IOS包,并且在打包成功或者失败时,如何将消息通知到企业微信. 如果对gitlab ...

  10. 在微信框架模块中,基于Vue&Element前端的微信公众号和企业微信的用户绑定

    在一个和微信相关的业务管理系统,我们有时候需要和用户的微信账号信息进行绑定,如对公众号.企业微信等账号绑定特定的系统用户,可以进行扫码登录.微信信息发送等操作,用户的绑定主要就是记录公众号用户的ope ...

随机推荐

  1. 部署lnmp环境,安装typecho博客

    安装nginx和PHP环境 root@cby:~# apt install nginx php7.4 php7.4-mysql php7.4-fpm 修改nginx配置文件 root@cby:~# v ...

  2. Java设计模式 —— 桥接模式

    10 桥接模式 10.1 桥接模式概述 Bridge Pattern: 将抽象部分与它的实现部分解耦,使得两者都能够独立变化. 桥接模式是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度 ...

  3. 脚本:bat批处理常用脚本

    windows下有很多场景需要编写批处理来解决问题,跟定时任务相结合使用更佳. 1.创建文件,md,mkdir都可以进行文件创建 set AwrPath=D:\OracleTabChk if not ...

  4. CSS3-页面布局基础二——Box Model、边距折叠、内联与块标签

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  5. SpringCloud Gateway 3.x 响应头添加 Skywalking TraceId

    在微服务架构中,一次请求可能会被多个服务处理,而每个服务又会产生相应的日志,且每个服务也会有多个实例.在这种情况下,如果系统发生异常,没有 Trace ID,那么在进行日志分析和追踪时就会非常困难,因 ...

  6. 第三方接口调用httpUtils

    1.GET 请求 public static JSONObject getHttpGetResp(String url, String authorization, String title) { H ...

  7. Flowable启动报错problem during schema upgrade&&couldn‘t upgrade db schema:

    1.错误信息 problem during schema upgrade, statement alter table ACT_RU_VARIABLE add column SCOPE_ID_ var ...

  8. 关于聚合根,领域事件的那点事---深入浅出理解DDD

    作者:京东物流 赵勇萍 前言 最近有空会跟同事讨论DDD架构的实践落地的情况,但真实情况是,实际中对于领域驱动设计中的实体,值对象,聚合根,领域事件这些战术类的实践落地,每个人理解依然因人而异,大概率 ...

  9. Windows防病毒Defender 排除病毒误报

    开发的软件安装后,windows上提示病毒,默默被系统删除了. 一开始以为是自己软件的签名问题,后面发现,将被隔离的文件还原,文件的签名是存在的. 这是微软denfender的误报,为啥会报病毒呢? ...

  10. [C++核心编程] 4.7 多态

    文章目录 4.7 多态 4.7.1 多态的基本概念 4.7.2 多态案例一-计算器类 4.7.3 纯虚函数和抽象类 4.7.4 多态案例二-制作饮品 4.7.5 虚析构和纯虚析构 4.7.6 多态案例 ...