ABAP - SAP与企业微信集成

  • 最近接到一个SAP直接给企业微信推送消息的需求,说实话之前一直没接触过,脑袋空空的,最终通过在百度搜索案例成功解决了,百度虽然一直被诟病,但却无法否认它的神奇。
  • 实现效果

  1. 获取access_token请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=企业ID&corpsecret=SECRET;两个参数企业ID和SECRET可以去找企业微信管理员的同事获取,拿到两个参数可以在postman测试;
  2. 根据第一步获取的ACCESS_TOKEN再次调用企业微信API发送应用消息;请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN


  • ABAP 代码
    DATA lv_get_url   TYPE string.
    DATA lv_post_url  TYPE string.
    
    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.
    
    TYPES:BEGIN OF ty_content,
            content TYPE string.
    TYPES:END OF ty_content.
    
    TYPES:BEGIN OF ty_post_request,
            touser                   TYPE string,
            msgtype                  TYPE string,
            agentid                  TYPE i,
            text                     TYPE ty_content,
            safe                     TYPE i,
            enable_id_trans          TYPE i,
            enable_duplicate_check   TYPE i,
            duplicate_check_interval TYPE i.
    TYPES:END OF ty_post_request.
    
    DATA ls_post_request TYPE ty_post_request.
    
    TYPES:BEGIN OF ty_post_receive,
            errcode TYPE i,
            errmsg  TYPE string,
            msgid   TYPE string.
    TYPES:END OF ty_post_receive.
    
    DATA ls_post_receive TYPE ty_post_receive.
    
    START-OF-SELECTION.
    
      lv_get_url = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?` &&
                   `corpid=企业ID` &&
                   `&corpsecret=企业应用Secret`.
    
      ls_post_request-text-content = |外购产品同步销售订单通知:\n|
                                  && |{ sy-datum DATE = ISO } { sy-uzeit TIME = ISO }\n|
                                  && |1234567890|
                                  && |采购订单没有同步销售订单,请知悉! |.
    
      "设置传输内容
      ls_post_request-touser = `8073|404|613|646`.
      ls_post_request-msgtype = `text`.
      ls_post_request-agentid = 1000061.
      ls_post_request-safe = 0.
      ls_post_request-enable_id_trans = 0.
      ls_post_request-enable_duplicate_check = 0.
      ls_post_request-duplicate_check_interval = 0.
    
    *** 第一步:获取access_token请求
      cl_http_client=>create_by_url( EXPORTING url    = lv_get_url
                                     IMPORTING 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 = 1
                                       http_invalid_state         = 2  ).
      IF sy-subrc NE 0.
        io_http_client->get_last_error( IMPORTING message = DATA(lv_message) code = DATA(lv_code) ).
        CONCATENATE '获取access_token失败原因:' lv_message INTO lv_message.
      ENDIF.
    
      io_http_client->receive( EXCEPTIONS http_communication_failure = 1
                                          http_invalid_state         = 2
                                          http_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 = DATA(lv_msg) code = DATA(lv_code1) ).
        CONCATENATE '企业微信服务器响应失败原因:' lv_msg INTO lv_msg.
      ENDIF.
    
      "将Json报文转换成SAP结构
      /ui2/cl_json=>deserialize( EXPORTING json = lv_get_res
                                           pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                                  CHANGING data = ls_get_receive ).
    
      IF ls_get_receive-errmsg NE `ok`.
        MESSAGE '获取access_token失败' TYPE 'E'.
      ENDIF.
    
    *** 第二步:发送到企业微信
      CLEAR:io_http_client.
    
      lv_post_url = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=` &&
                    ls_get_receive-access_token.
    
      cl_http_client=>create_by_url( EXPORTING url    = lv_post_url
                                     IMPORTING client = 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_post ).
    
      DATA(lv_send_data) = /ui2/cl_json=>serialize( data        = ls_post_request
                                                    compress    = abap_false
                                                    pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
    
      io_http_client->request->set_cdata( data = lv_send_data ).
    
      io_http_client->send( EXCEPTIONS http_communication_failure = 1
                                       http_invalid_state         = 2  ).
      IF sy-subrc NE 0.
        io_http_client->get_last_error( IMPORTING message = lv_message code = lv_code ).
        CONCATENATE '发送POST请求给企业微信失败:' lv_message INTO lv_message.
      ENDIF.
    
      io_http_client->receive( EXCEPTIONS http_communication_failure = 1
                                          http_invalid_state         = 2
                                          http_processing_failed     = 3 ).
      IF sy-subrc EQ 0.
        DATA(lv_post_res) = io_http_client->response->get_cdata( ).
      ELSE.
        io_http_client->get_last_error( IMPORTING message = lv_msg code = lv_code1 ).
        CONCATENATE '企业微信服务器响应失败原因:' lv_msg INTO lv_msg.
      ENDIF.
    
      "将Json报文转换成SAP结构
      /ui2/cl_json=>deserialize( EXPORTING json = lv_post_res
                                           pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                                  CHANGING data = ls_post_receive ).
      IF ls_post_receive-errmsg NE `ok`.
        MESSAGE '发送POST请求给企业微信失败' TYPE 'S' DISPLAY LIKE 'E'.
      ELSE.
        MESSAGE '发送POST请求给企业微信成功' TYPE 'S'.
      ENDIF.

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在ABAP中调用企业微信API,你可以使用HTTP请求来发送请求并接收响应。下面是一个简单的示例代码,演示如何使用ABAP调用企业微信API: ```abap DATA: lv_url TYPE string, lv_token TYPE string, lv_request_body TYPE string, lv_response_body TYPE string. lv_url = '<API_URL>' " 替换为企业微信API的URL lv_token = '<ACCESS_TOKEN>' " 替换为有效的访问令牌 " 构建HTTP请求 CREATE OBJECT lo_http_client. lo_http_client->request->set_method( 'POST' ). lo_http_client->request->set_uri( lv_url ). lo_http_client->request->set_header_field( name = 'Content-Type' value = 'application/json' ). lo_http_client->request->set_header_field( name = 'Authorization' value = 'Bearer ' && lv_token ). " 设置请求体 lv_request_body = '{ "key": "value" }'. " 根据API要求构建有效的请求体 lo_http_client->request->set_cdata( lv_request_body ). " 发送HTTP请求 lo_http_client->send( ). IF lo_http_client->response->get_status( ) = 200. " 检查响应状态码是否为200 " 获取响应体 lv_response_body = lo_http_client->response->get_cdata( ). " 处理响应数据 WRITE lv_response_body. ELSE. " 处理错误情况 WRITE 'HTTP request failed'. ENDIF. ``` 请注意,上述示例中的`<API_URL>`和`<ACCESS_TOKEN>`需要根据实际情况进行替换。你需要根据企业微信API的要求构建有效的请求体,并解析和处理响应数据。此外,你可能还需要在ABAP系统中配置网络代理设置,以确保能够与企业微信API进行通信。 这只是一个简单的示例,实际的调用可能会涉及更复杂的逻辑和参数设置,具体取决于你要调用的企业微信API的要求。请参考企业微信API文档以了解更多详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值