ABAP - SAP与企业微信集成-推送文件到企业微信
系列文章目录
ABAP - SAP与企业微信集成-推送文本消息到企业微信
ABAP - SAP与企业微信集成-推送文件到企业微信
文章目录
- 系列文章目录
- 前言
- 一、SAP和企业微信集成的方式
- 二、SAP调用企业微信API推送文件步骤
- 1.企业微信服务端API
- 2.获取ACCESS_TOKEN
- 3.企微上传临时素材获取meida_id
- 4.推送文件到企业微信
- 总结
前言
SAP与企业微信集成,是企业在数字化转型中提升效率、优化协作和增强竞争力的重要策略。
一、SAP和企业微信集成的方式
SAP给企业微信推送消息,其本质上是SAP调用企业微信对外发布的API。
二、SAP调用企业微信API推送文件步骤
1.企业微信服务端API
服务端API:https://developer.work.weixin.qq.com/document/path/90236
- 企业微信发送应用消息,无论是推送文本、图片、文件、视频、等统一使用 https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN发送请求实现推送,ACCESS_TOKEN要通过调用企微发布的API获取,获取access_token:https://developer.work.weixin.qq.com/document/path/91039
- 推送文件的请求体内容如下图所示
2.获取ACCESS_TOKEN
代码如下(示例):
TYPES:BEGIN OF ty_get_receive,errcode TYPE i,errmsg TYPE string,access_token TYPE string,expires_in TYPE i.TYPES:END OF ty_get_receive.DATA ls_get_receive TYPE ty_get_receive.DATA(lv_get_url) = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=企业id&corpsecret=企业secret`.cl_http_client=>create_by_url( EXPORTING url = lv_get_urlIMPORTING client = DATA(io_http_client) ).io_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).io_http_client->request->set_method( if_http_request=>co_request_method_get ).io_http_client->send( EXCEPTIONS http_communication_failure = 1http_invalid_state = 2 ).io_http_client->get_last_error( IMPORTING message = DATA(lv_msg) code = DATA(lv_code) ).io_http_client->receive( EXCEPTIONS http_communication_failure = 1http_invalid_state = 2http_processing_failed = 3 ).IF sy-subrc EQ 0.DATA(lv_get_res) = io_http_client->response->get_cdata( ).ELSE.io_http_client->get_last_error( IMPORTING message = lv_msg code = lv_code ).CONCATENATE '企业微信服务器响应失败原因:' lv_msg INTO lv_msg.ENDIF."将Json报文转换成SAP结构/ui2/cl_json=>deserialize( EXPORTING json = lv_get_respretty_name = /ui2/cl_json=>pretty_mode-camel_caseCHANGING data = ls_get_receive ).IF ls_get_receive-errmsg NE `ok`.MESSAGE '获取access_token失败' TYPE 'E'.ENDIF.write:ls_get_receive-access_token.
该处获取企业微信的ACCESS_TOKEN
3.企微上传临时素材获取meida_id
- 推送文件消息的请求体内容里面有一个很重要的参数是meida_id,media_id 是一个在多媒体内容管理和分发系统中常见的唯一标识符,通常用于在数据库中唯一标识一个特定的媒体文件或资源。这个标识符可以是数字、字符串或哈希值,具体形式取决于系统的设计和实现。
- meida_id和access_token一样需要通过企微API获取,上传临时素材获取meida_id
以下是示例代码:
"-------------------------获取报表数据-----------------------cl_salv_bs_runtime_info=>set( display = abap_falsemetadata = abap_falsedata = abap_true ).SUBMIT zfirp074 WITH s_werks IN lr_werksWITH s_ersda IN lr_ersda AND RETURN.TRY.cl_salv_bs_runtime_info=>get_data_ref(IMPORTINGr_data = lo_data).CATCH cx_salv_bs_sc_runtime_info.ENDTRY.cl_salv_bs_runtime_info=>clear_data( ).cl_salv_bs_runtime_info=>clear_all( )."-------------------------获取报表数据-----------------------"-------------------------将报表数据转换成进制码-----------------------DATA lr_lines TYPE REF TO data.DATA lo_field TYPE REF TO cl_abap_structdescr.DATA lv_headtext TYPE string.DATA lv_filename TYPE string.DATA lv_xstring TYPE xstring.DATA lv_mediaid TYPE string.DATA(lo_export) = cl_salv_export_tool_xls=>create_for_excel( lo_data ).DATA(lo_config) = lo_export->configuration( )."注意该类型为ALV传入内表的类型CREATE DATA lr_lines TYPE ty_alv.lo_field ?= cl_abap_tabledescr=>describe_by_data_ref( lr_lines ).DATA(lt_dfies) = cl_salv_data_descr=>read_structdescr( lo_field ).LOOP AT lt_dfies INTO DATA(ls_dfies).CASE ls_dfies-fieldname.WHEN 'WERKS'.lv_headtext = '工厂'.WHEN 'ERSDA'.lv_headtext = '创建日期'.WHEN 'MATNR'.lv_headtext = '物料'.WHEN 'STLNR'.lv_headtext = 'BOM'.WHEN 'PLNNR'.lv_headtext = '工艺'.WHEN 'VERID'.lv_headtext = '生产版本'.WHEN 'STPRS'.lv_headtext = '标准价'.ENDCASE.lv_filename = ls_dfies-fieldname.lo_config->add_column( header_text = lv_headtextfield_name = lv_filenamedisplay_type = if_salv_export_column_conf=>display_types-text_view ).CLEAR:lv_headtext,lv_filename.ENDLOOP.TRY.lo_export->check_configuration( IMPORTING t_messages_info = DATA(lt_infos)t_messages_warning = DATA(lt_warnings) ).lo_export->read_result( IMPORTING content = DATA(lv_content)mime_type = DATA(lv_mime_type)filename = lv_filenamet_messages_info = lt_infost_messages_warning = lt_warnings ).CATCH cx_salv_export_error.ENDTRY."-------------------------将报表数据转换成进制码----------------------- DATA(lv_xstring) = lv_content.DATA(lv_filename_len) = strlen( lv_filename ).DATA(lv_xstring_len) = xstrlen( lv_xstring ).DATA(lv_head_field) = |form-data; name="media";filename="{ lv_filename }"; filelength= { lv_filename_len }|.cl_http_client=>create_by_url( EXPORTING url = https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=fileIMPORTING client = DATA(lo_http_client) ).lo_http_client->request->set_method( if_http_request=>co_request_method_post ).lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).lo_http_client->request->if_http_entity~set_content_type( EXPORTING content_type = 'multipart/form-data' ).lo_http_client->request->if_http_entity~set_formfield_encoding( EXPORTING formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw ).DATA(lo_http_entity) = lo_http_client->request->if_http_entity~add_multipart( ).lo_http_entity->set_header_field( EXPORTING name = 'Content-Disposition'value = lv_head_field ).lo_http_entity->set_content_type( EXPORTING content_type = 'application/octet-stream' ).lo_http_entity->set_data( EXPORTING data = lv_xstringoffset = 0length = lv_xstring_len ).lo_http_client->send( EXCEPTIONS http_communication_failure = 1http_invalid_state = 2 ).IF sy-subrc NE 0.lo_http_client->get_last_error( IMPORTING message = DATA(lv_message) code = DATA(lv_code) ).CONCATENATE '获取access_token失败原因:' lv_message INTO lv_message.ENDIF.lo_http_client->receive( EXCEPTIONS http_communication_failure = 1http_invalid_state = 2http_processing_failed = 3 ).IF sy-subrc NE 0.lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ).MESSAGE '企业微信服务器响应失败原因:' && lv_code && '-' && lv_message TYPE 'E'.ENDIF.DATA(lv_result) = lo_http_client->response->get_cdata( ).DATA(ld_rrdata) = /ui2/cl_json=>generate( json = lv_result ).DATA(lv_fs_str) = `LD_RRDATA->MEDIA_ID->*`.ASSIGN (lv_fs_str) TO FIELD-SYMBOL(<fs_media_id>).IF <fs_media_id> IS ASSIGNED.lv_mediaid = <fs_media_id>.ELSE.MESSAGE lv_result TYPE 'E'.ENDIF.
4.推送文件到企业微信
以下是示例代码:
TYPES:BEGIN OF ty_media_id,media_id TYPE string,END OF ty_media_id.TYPES:BEGIN OF ty_file_request,touser TYPE string,msgtype TYPE string,agentid TYPE i,file TYPE ty_media_id,safe TYPE i,enable_duplicate_check TYPE i,duplicate_check_interval TYPE i.TYPES:END OF ty_file_request.DATA ls_file_request TYPE ty_file_request.ls_file_request-touser = '这里是接收消息的人'.ls_file_request-msgtype = `file`.ls_file_request-agentid = 1000061. "这个参数问企业微信管理员获取ls_file_request-safe = 0.ls_file_request-enable_duplicate_check = 0.ls_file_request-duplicate_check_interval = 0.ls_file_request-file-media_id = lv_mediaid.DATA(lv_sendjson) = /ui2/cl_json=>serialize( data = ls_file_requestcompress = abap_falsepretty_name = 'L' ).cl_http_client=>create_by_url( EXPORTING url = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN`IMPORTING client = DATA(lo_http_client) ).lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).lo_http_client->request->set_method( if_http_request=>co_request_method_post ).lo_http_client->request->set_cdata( data = iv_send_json ).lo_http_client->send( EXCEPTIONS http_communication_failure = 1http_invalid_state = 2 ).IF sy-subrc NE 0.lo_http_client->get_last_error( IMPORTING message = DATA(lv_message) code = DATA(lv_code) ).MESSAGE '企业微信服务器响应失败原因:' && lv_code && '-' && lv_message TYPE 'E'.ENDIF.lo_http_client->receive( EXCEPTIONS http_communication_failure = 1http_invalid_state = 2http_processing_failed = 3 ).IF sy-subrc NE 0.lo_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ).MESSAGE '企业微信服务器响应失败原因:' && lv_code && '-' && lv_message TYPE 'E'.ENDIF.
总结
SAP推送文件到企业微信,主要核心还是HTTP通信技术,通过本文可以提炼出获取ALV数据的方法、以及ALV数据转换成进制码的方法,难点在于获取meida_id,读者4用心跟进一下即可解决。