SAP ABAP 动态结构实现发送企业微信应用消息
企业微信官方接口:
应用支持推送文本、图片、视频、文件、图文等类型。
请求方式: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 动态结构实现发送企业微信应用消息的更多相关文章
- Java发送企业微信应用消息
1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接收到消息后,再 ...
- 【ABAP系列】SAP ABAP 动态指针
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 动态指针 ...
- 使用Python发送企业微信消息
准备工作: 到企业微信官网,注册一个企业:登录企业微信后台,创建一个“自建”应用, 获取企业ID.agentid.secret这3个必要的参数:在企业微信的通讯录中,创建多个测试账号:在手机端安装“企 ...
- zabbix 监控redis 挂掉自动重启 并发送企业微信
1.创建redis监控项[配置]-[主机]-[监控项]-创建监控项,监控6379端口(注意关闭防火墙或者开启防火墙端口6379) redis配置文件设置允许任何地址监听: 添加监控项 2.创建redi ...
- Python 发送企业微信消息
1.获取企业微信信息 1)我的企业 --> 企业信息 --> 企业ID 2)创建一个应用,记录该应用的 AgentId.Secret 2.python代码 #!/usr/bin/env p ...
- 【perl】企业微信发消息
https://open.work.weixin.qq.com/api/doc#90000/90135/90236 #!/usr/bin/env perl use strict; use warnin ...
- 通过企业微信API接口发送消息
最近给公司测试组内部开发一个记账小工具,当账目出现问题的时候需要发送消息通知大家,前期主要采用的QQ发送通知消息,但是有一天突然无法连接到QQ服务器,运维的同学建议采用微信的方式对接然后进行告警,所以 ...
- python发送微信及企业微信消息
1.发送微信消息 直接使用第三方库 itchat,其文档中有详细使用方式:https://itchat.readthedocs.io/zh/latest/ 如下实例为 发送群聊信息 # -*- cod ...
- 使用gitlab ci构建IOS包并发送通知消息到企业微信
在之前的文章中,我们介绍了使用gitlab ci构建Android包的方法.今天我们介绍使用gitlab ci如何构建IOS包,并且在打包成功或者失败时,如何将消息通知到企业微信. 如果对gitlab ...
- 在微信框架模块中,基于Vue&Element前端的微信公众号和企业微信的用户绑定
在一个和微信相关的业务管理系统,我们有时候需要和用户的微信账号信息进行绑定,如对公众号.企业微信等账号绑定特定的系统用户,可以进行扫码登录.微信信息发送等操作,用户的绑定主要就是记录公众号用户的ope ...
随机推荐
- Distinctive Image Features from Scale-Invariant Keypoints 论文解读
Distinctive Image Features from Scale-Invariant Keypoints 论文解读 著名的SIFT local feature提取方法 Scale-space ...
- Quartz 简单使用
Scheduler 每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题(jobDetail的实例也是新的) Quzrtz 定时任务默认都是并发执行,不会等待上一次 ...
- python:字典中遍历key对应的value值
问题描述:python在一个字典中想要遍历某个可以对应的value值. 效果如下: 方法一:使用循环遍历所有的key,然后对比输入的值跟便利出来的key有没有相同的 constellation = [ ...
- linux防火墙开放1521端口
问题描述:使用plsql连接数据库发现TNS报错,登录服务器发现防火墙开放,如果直接关闭防火墙,所有的端口都可以连接,但是实际中可能会遇到开启防火墙的库,这时候需要开放单一端口对某一服务器或者某一网段 ...
- Linux(三)磁盘管理
Linux磁盘管理 Linux中的tree工具 tree可以查看目录的树形结构,前提是需要自行安装 yum install tree -y [root@hadoop100 ~]# tree ./ ./ ...
- Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新
Hystrix 简介 Hystrix 是 Netflix 开源的一个限流熔断降级组件,防止依赖服务发生错误后,将调用方的服务拖垮.这里对 Hystrix 本身不做过多介绍. Hystrix 目前处于维 ...
- Python_11 类的方法
一.查缺补漏 1. 实例方法必须用类实例化对象()来调用,用类来调用时会执行,但是self中不是实例化类地址而是传的字符串 二.类中的方法 1. 实例方法 1. 定义在类里面的普通方法(函数) 2. ...
- 快速傅里叶变换FFT学习笔记
点值表示法 我们正常表示一个多项式的方式,形如 \(A(x)=a_0+a_1x+a_2x^2+...+a_nx^n\),这是正常人容易看懂的,但是,我们还有一种表示法. 我们知道,\(n+1\)个点可 ...
- 百度飞桨(PaddlePaddle)安装
注意:32位pip没有PaddlePaddle源 # 如果报下列错误,检查 Python 版本,不能过高也不要太低,并且不能是 32位的. ERROR: Could not find a versio ...
- 推荐一个.Ner Core开发的配置中心开源项目
当你把单体应用改造为微服务架构,相应的配置文件,也会被分割,被分散到各个节点.这个时候就会产生一个问题,配置信息是分散的.冗余的,变成不好维护管理.这个时候我们就需要把配置信息独立出来,成立一个配置中 ...