1

SAP ABAP 动态结构实现发送企业微信应用消息 - peoplejw

 1 year ago
source link: https://www.cnblogs.com/peoplejw/p/17509139.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SAP ABAP 动态结构实现发送企业微信应用消息

企业微信官方接口文档:https://developer.work.weixin.qq.com/document/path/90236

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

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

大概思路:

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

3211141-20230627154624903-1675972068.png

     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.实现效果:企业微信通知

3211141-20230627160149380-1257312880.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK