当前位置: 首页 > web >正文

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_idmedia_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用心跟进一下即可解决。

http://www.xdnf.cn/news/7729.html

相关文章:

  • DeepSeek提示工程Prompt Engineering
  • multipart/* 响应是否必须使用 chunked 编码?
  • 常用UI自动化测试框架
  • 【Python训练营打卡】day31 @浙大疏锦行
  • 本征半导体与杂质半导体
  • Ubuntu操作系统里面安装Docker Compose
  • Python实战:打造一个功能完整的单位转换器(长度/温度/货币)
  • C++开发基础之理解std::condition_variable中的wait与wait_for的区别与使用场景
  • 基于springboot的个人博客系统【附源码】
  • 《苍穹外卖》SpringBoot后端开发项目核心知识点与技术栈整理(DAY10 to DAY12)
  • 【深度学习:理论篇】--一文理解Transformer
  • 若依项目集成sentinel、seata和shardingSphere
  • Day.js 基础用法全方位详解
  • 鸿蒙NEXT开发动画案例12
  • AI作曲革新:ACE-Step如何推动音乐创作走向大众
  • UE(虚幻)学习(六)插件打包在UE5.3.2下Value cannot be null的错误
  • Ubuntu 安装 Node.js 指定版本指南
  • 01-通过纯js理解数据驱动图表概念
  • window 显示驱动开发-GDI 硬件加速
  • 活到老学到老-Spring参数校验注解Validated /Valid
  • 实战:基于Pangolin Scrape API,如何高效稳定采集亚马逊BSR数据并破解反爬虫?
  • Nuxt.js一个基于 Vue.js 的通用应用框架
  • 使用引用的原因 和 运算符重载的必要性
  • Ubuntu20.04安装ROS Neotic
  • AI应用交付厂商F5打造六大解决方案,助用户应对复杂挑战
  • NX750HSA20美光固态闪存HSA36NC027
  • LLM驱动的未来软件工程范式与架构策略
  • 鸿蒙开发——7.ArkUI进阶:@BuilderParam装饰器的核心用法与实战解析
  • 算法题(151):保卫花园
  • Vue video播放视频流