ABAP - SAP与企业微信集成

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

  • 实现思路:从需求出发,SAP给企业微信推送消息,其本质上是SAP调用企业微信对外发布的API,按照这个思路去找企业微信的API就好了。
  • 1.获取企业内部开发>服务端API>开发指南>获取access_tokenicon-default.png?t=N7T8https://developer.work.weixin.qq.com/document/path/910392.企业内部开发>服务端API>消息推送>发送应用消息icon-default.png?t=N7T8https://developer.work.weixin.qq.com/document/path/90236 
  • 开发技巧
  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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1808940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏服务器工程实践一:百万级同时在线的全区全服游戏

我应该有资格写这篇文章,因为亲手设计过可以支撑百万级同时在线的全区全服类型的游戏服务器架构。 若干年前我在某公司任职时,参与研发过一款休闲类型的游戏,由 penguin 厂独代。研发的时候,p 厂要求我们的游戏服务器要能支撑百万…

IO进程线程(十一)进程间通信 消息队列

文章目录 一、IPC(Inter-Process Communication)进程间通信相关命令 :(一)ipcs --- 查看IPC对象(二)获取IPC键值(三)删除IPC对象的命令(四)获取IPC键值的函数1. 函数定义…

[office] 快速提取出Excel 2010单元格括号内的文字信息 #知识分享#经验分享

快速提取出Excel 2010单元格括号内的文字信息 实例演示 ①我们打开一份Excel电子表格,我们要将C列里面括号内的内容提取到D列里面,单击D2单元格,输入下面的函数公式: MID(C2,FIND("(",C2)1,LEN(C2)-FIND("("…

vue如何使用slot

1. vue2 如何使用slot 1.1. 默认插槽(Default Slot)1.2. 具名插槽(Named Slot)1.3. 作用域插槽(Scoped Slot) 2. vue3 如何使用slot 2.1. 默认插槽(Default Slot)2.2. 具名插槽&…

Pytorch学习11_神经网络-卷积层

1.创建神经网络实例 import torch import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoaderdatasettorchvision.datasets.CIFAR10("../dataset_cov2d",trainFalse,transformtorchvision.transforms.ToTensor(…

【深度学习】NLP,Transformer讲解,代码实战

文章目录 1. 前言2. Transformer结构训练过程1. 输入嵌入和位置编码2. 编码器层2.1 单头的注意力机制(便于理解)2.2 多头的注意力机制(Transformer真实使用的)2.3 残差连接和层归一化2.4 前馈神经网络(FFN)2.5 残差连接和层归一化2.6 总结 3. 解码器层 推…

本周重磅日程:美联储决议、中美通胀、苹果AI和英伟达拆股

当周重磅看点颇多:美联储FOMC将公布最新利率“点阵图”,中国5月金融数据、中美通胀数据将出炉,日本央行购债计划是否变动成为市场焦点,苹果2024全球开发者大会一系列AI功能将亮相;特斯拉2024股东大会上马斯克560亿美元…

Linux 内核参数-相关介绍

Linux 内核参数-相关介绍 今天,介绍Linux内核参数相关内容。由于Linux内核优化需要根据具体需求进行具体优化,同时需要具备一定经验,所以这里不涉及优化操作内容。 不过,遇到面试中有相关题目,不至于答不上来&#x…

Android.mk文件生成的so工程文件并Debug调试native code

1.这里主要展示一下从最原始先新建一个工程 2.将hello的子工程文件放入上面新建好的工程里面,直接拷贝放置这里 3.修改根目录下的settings.gradle 加入hello 4.app工程下的build.gradle加入依赖,这样就可以识别hello中的java包文件 5.MainActivity 中来&…

python tushare股票量化数据处理:学习中

1、安装python和tushare及相关库 matplotlib pyplot pandas pandas_datareader >>> import matplotlib.pyplot as plt >>> import pandas as pd >>> import datetime as dt >>> import pandas_datareader.data as web 失败的尝试yf…

vscode侧边栏错乱重制

vscode 重制命令面板 View: Reset View Locations

将AIRNet集成到yolov8中,实现端到端训练与推理

AIRNet是一个图像修复网络,支持对图像进行去雾、去雨、去噪声的修复。其基于对比的退化编码器(CBDE),将各种退化类型统一到同一嵌入空间;然后,基于退化引导恢复网络(DGRN)将嵌入空间修复为目标图像。可以将AIRNet的输出与yolov8进行端到端集成,实现部署上的简化。 本博…

LabVIEW汽车电机测试系统

1. 背景 随着电动汽车的快速发展,汽车电机作为电动汽车的核心部件,其性能评估变得尤为重要。电机的功率、效率、转速等参数直接影响着电动汽车的性能和续航里程。因此,设计一套全面、准确的汽车电机测试系统对于提高电动汽车的性能和安全性具…

基于Java-SpringBoot-VUE-MySQL的企业财务报销系统

基于Java-SpringBoot-VUE-MySQL的企业财务报销系统 登陆界面 联系作者 如需本项目源代码,可扫码或者VX:bob1638 联系作者。 主页-02 系统功能持续更新中。。。 介绍 本系统是采用现代信息技术手段,采用JAVA开发语言,VUE语言,HTML语…

【C++进阶】深入STL之 栈与队列:数据结构探索之旅

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模拟实现list与迭代器 🌹🌹期待您的关注 🌹🌹 ❀stack和queue &#x1f4…

基础数据结构 -- 堆

1. 简介 堆可以看做是一种特殊的完全二叉树,它满足任意节点的值都大于或小于其子节点的值。 2. 功能 插入元素:插入新元素时,先将元素放至数组末尾,然后通过上浮算法自底向上调整,使堆保持性质。删除堆顶元素&#xff…

Unity DOTS技术(九) BufferElement动态缓冲区组件

文章目录 一.简介二.例子 一.简介 在之前的学习中我们发现Entity不能挂载相同的组件的. 当我们需要用相同的组件时则可以使用.IBufferElementData接口 动态缓冲区组件来实现 二.例子 1.创建IBufferElementData组件 using Unity.Entities; using UnityEngine; //[GenerateAu…

BIOPLUSS引领膳食行业创新、整合与再造

2024年NHNE如期而至,同时今年也是中挪建交70年周年,BIOPLUSS作为挪威品牌代表也参加了此次NHNE国际健康营养博览会,此次NHNE展会吸收了来自30多个国家及地区的1200多家品牌参与,BIOPLUSS同时受挪威领事馆、挪威创新署邀请&#xf…

安卓事件交互(按键事件、触摸事件、手势识别、手势冲突处理)

本章介绍App开发常见的以下事件交互技术,主要包括:如何检测并接管按键事件,如何对触摸事件进行分发、拦截与处理,如何根据触摸行为辨别几种手势动作,如何正确避免手势冲突的意外状况。 按键事件 本节介绍App开发对按…

Duck Bro的第512天创作纪念日

Tips:发布的文章将会展示至 里程碑专区 ,也可以在 专区 内查看其他创作者的纪念日文章 我的创作纪念日第512天 文章目录 我的创作纪念日第512天一、与CSDN平台的相遇1. 为什么在CSDN这个平台进行创作?2. 创作这些文章是为了赚钱吗&#xff1f…