首页 > 其他分享 >SAP ABAP 动态结构实现发送企业微信应用消息

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

时间:2023-06-27 16:15:08浏览次数:35  
标签:string 微信 json lv ABAP && DATA SAP TYPE

企业微信官方接口:

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

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

 

标签:string,微信,json,lv,ABAP,&&,DATA,SAP,TYPE
From: https://www.cnblogs.com/peoplejw/p/17509139.html

相关文章

  • 微信商家转账零钱优化版
    配置文件<?phpreturn['abc'=>["merchant_id"=>env('POINT_ABC_MERCHANTID'),"app_id"=>env('POINT_ABC_APP_ID'),"......
  • SAP UI5 命名空间 com.sap.vocabularies.Common.v1 的作用
    SAPUI5是一种基于JavaScript的用户界面技术,用于构建企业级Web应用程序。它提供了一套丰富的控件库,可以帮助开发者轻松地创建响应式、跨平台的用户界面。命名空间是一种在编程中常见的概念,用于区分不同的代码库或功能模块,以避免命名冲突。com.sap.vocabularies.Common.v1是......
  • 什么是 SAP UI5 应用运行时加载的 messagebundle_en.properties 文件?
    在SAPUI5应用程序中,messagebundle_en.properties文件是一个资源文件,用于存储应用程序的多语言文本和消息。这些消息通常包括用户界面中显示的标签、按钮文字、提示信息、错误消息等。使用资源文件的优势在于它可以轻松地使应用程序支持多种语言,同时保持代码的整洁和可维护性。......
  • SAP UI5 应用里 /sap/ui/thirdparty/datajs.js 的作用
    SAPUI5是一个基于JavaScript的用户界面技术,用于构建企业级应用程序。它是一个成熟的开源框架,由SAP开发,致力于提供高质量、可扩展和易于维护的Web应用程序。SAPUI5应用程序使用一系列技术和库,其中之一就是/sap/ui/thirdparty/datajs.js。在本文中,我们将详细讨论datajs.......
  • SAP UI5 sap.ui.layout 命名空间的作用介绍
    SAPUI5是一种用于构建企业级Web应用程序的开发框架。它提供了丰富的UI控件和工具,使开发人员能够快速构建现代化、可扩展和可定制的应用程序。在SAPUI5中,sap.ui.layout是一个重要的命名空间,用于提供布局和容器相关的控件和功能。下面将详细介绍sap.ui.layout的作用和一些示例。......
  • SAP UI5 控件 ObjectStatus 的使用方法介绍试读版
    ObjectStatus控件是SAPUI5控件集合中一个极具视觉表现力的控件,用于在应用程序中显示实体(Object)的状态(Status)或属性信息。它可用于向用户提供重要的上下文状态信息,如成功、错误、警告、进行中(InProcess)等等。ObjectStatus控件通常与其他SAPUI5控件(如列表项、表格......
  • SAP UI5 本地注解文件词汇表内容引用的详细讲解
    本文解释SAPUI5本地注解xml文件里下列这个片段的语义:<edmx:ReferenceUri="../../catalogservice;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_UI',Version='0001',SAP__Origin='LOCAL')/$value"> <edmx:IncludeNamespace="......
  • RAKsmart有奖问答,爆款免费领,前30名送随机微信红包!!!
    为更好的了解客户需求及RAKsmart自信不足,即日起,RAKsmart将推出有奖问卷调查,参与问卷调查即可领取SV1024MVPS使用一个月,同时,前30名参与问卷调查,可领取微信随机1~10元不等,送完即止,快来参与吧!活动时间:美国西岸圣何塞时间 06/26/2023~07/10/2023问卷调查地址:https://www.wenjuan.com/......
  • 微信小程序连接websocket随记
    微信小程序需要上报经纬度到服务器,采用workman作为Websocket服务,记录一下步骤:1、修改start_gateway.php文件//$gateway=newGateway("tcp://0.0.0.0:8282");$gateway=newGateway("websocket://0.0.0.0:8282");2、在小程序后台配置socket域名(开发-> 开发管理-> 开发设......
  • 企业微信添加机器人,并给机器人发送消息
    找一个企业微信的群聊,点击右上角的"...",添加群机器人。  创建一个机器人  填写机器人名字,添加机器人。    保存这里的webhook地址,后面给机器人发消息,就是给这个地址post消息。具体的配置文档,可以点这里的“配置说明”去了解。 下面介绍,使用py给机器人发......