企业微信官方接口:

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

请求方式: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. 二进制安装Kubernetes(k8s) v1.23.6

    二进制安装Kubernetes(k8s) v1.23.6 背景 kubernetes二进制安装 1.23.3 和 1.23.4 和 1.23.5 和 1.23.6 文档以及安装包已生成. 后续尽可能第 ...

  2. [MYSQL/JDBC]mysql-connector-java与MySQL、JDK对应的兼容版本[转载]

    1 文由 MYSQL 数据库版本 与 驱动版本之间的兼容性,可能会涉及到 部分数据库特性(函数.语法)等是否能够正常使用的问题. 2 兼容性: mysql-connector-java VS Mysq ...

  3. 如何在微信小程序中实现音视频通话

    微信小程序的音视频通话可以通过微信提供的实时音视频能力实现.这个能力包括了音视频采集.编码.传输和解码等多个环节,开发者只需要使用微信提供的 API 接口就可以轻松地实现音视频通话功能. 在具体实现上 ...

  4. 在CentOS上安装与卸载Docker Engine

    本文参考Docker官网提供的 安装手册编写 测试使用的操作系统版本为CentOS 7.9 安装Docker Engine 要在 CentOS 上开始使用 Docker 引擎,请确保 满足先决条件,然 ...

  5. 线上诊断神器-arthas基本应用

    Arthas基本应用 一.Arthas作用 什么是Arthas呢? ​ Arthas 是一款阿里推出的线上监控诊断产品,通过全局视角实时查看应用 load.内存.gc.线程的状态信息,并能在不修改应用 ...

  6. 尝试CentOS8---部署集群(生产环境7.9为好)

    一.LVS集群简介 什么是集群 通过网络将很多服务器集中起来,提供同一种服务,在客户端看来就像是只有一个服务器 二.LVS-NAT集群 1.环境准备 启动3台虚拟机,禁用selinux和firewal ...

  7. MQTT-主题基础

    MQTT主题 MQTT的主题是一个utf-8编码的字符串,最大长度65535字节,严格区分大小写 MQTT主题支持分层结构,主题分隔符用'/'表示,主题的层级长度可以为0 # 将主题划分为3个层级 ' ...

  8. Windows 11 启用 Hyper-V 之后网络上传速度异常慢解决方案

    最近在开发用的台式机上启用了 Windows 的 Hyper-V 虚拟化功能,利用虚拟机运行了一台 Windows Server 2022 和 一台 Ubuntu Server,为了方便别的机器直接访 ...

  9. HTML中meta标签的那些属性

    <meta> 标签是 HTML 中用于描述网页元信息的元素.它位于 <head> 部分,不会显示在页面内容中,但对于浏览器.搜索引擎等具有重要作用.主要作用有:定义文档的字符编 ...

  10. 使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中

    > 作者:[SRE运维博客](https://www.cnsre.cn/) > 博客地址:[https://www.cnsre.cn/](https://www.cnsre.cn/) &g ...