SAP PO中间件集成开发:SAP ECC 主动调第三方系统需Token验证

本文详细介绍了如何在SAP ECC中通过SAP PO集成第三方系统,主要涉及获取Token的过程以及使用Token调用第三方接口的步骤。首先,在SAP PO中配置ESR,包括FUNCTIONLIBRARIES、DATATYPE、MESSAGETYPE和服务接口的定义,然后通过调用函数模块获取Token。接着,配置SAP ECC,生成服务代理类,并创建函数模块以获取SRM Token。最后,使用获取到的Token调用第三方系统的API,实现数据交互。整个过程涵盖了SAP ECC和SAP PO的配置以及错误处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集成场景:SAP ECC与第三方系统集成交互,中间件使用的是SAP PO,SAP ECC作为主调方,主动调用第三方系统,访问第三方系统需要Token验证

调用第三方分为以下几步:

  1. 获取第三方系统的Token
  2. 根据获取到的第三方系统的Token再进行调用第三方系统接口

处理步骤:

  1. SAP PO集成配置
  2. SAP ECC配置与代码开发

 具体步骤:

第一步:获取第三方系统的Token

SAP PO端配置:

ESR配置:

  • 定义FUNCTION LIBRARIES
  • 定义DATA TYPE
  • 定义MESSAGE TYPE
  • 定义SERVICE INTERFACE

 定义FUNCTION LIBRARIES

public String set_token(String var1, String var2, Container container) throws StreamTransformationException{
DynamicConfiguration dynamicConfig = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
DynamicConfigurationKey key = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST","token");
dynamicConfig.put(key,var1); //token is the parameter containing the value
return var2;
}

 定义DATA TYPE

 定义MESSAGE TYPE

 定义SERVICE INTERFACE

outbound服务

Inbound服务

IB配置

Communication Channel通信渠道配置:

调用方通信渠道定义:

被调方通信渠道定义:

维护REST RUL:

调用第三方系统提供的获取Token的接口地址:

https://test.com/api/xxxxxxx-auth/oauth/token?tenantId={tenantId}&username={username}&password={password}&grant_type={grant_type}&scope={scope}&type={type}

 

维护REST Operation:

 维护data format:

 维护Http Header

 Integrated Configuration配置:

 SAP ECC端配置和代码开发

事务码:SPROXY

生成服务代理类

 创建一个function module,去获取SRM token

FUNCTION zjksrm243.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     REFERENCE(CODE) TYPE  STRING
*"     REFERENCE(ACCESS_TOKEN) TYPE  STRING
*"     REFERENCE(TOKEN_TYPE) TYPE  STRING
*"     REFERENCE(EXPIRES_IN) TYPE  STRING
*"     REFERENCE(MSG) TYPE  STRING
*"     REFERENCE(SUCCESS) TYPE  STRING
*"----------------------------------------------------------------------
  DATA: ls_srmtoken TYPE ztsrm_token,
        lo_srm      TYPE REF TO zco_si_sap_srm003_req,
        ls_output   TYPE zmt_srm003_req,
        ls_input    TYPE zmt_srm003_resp,
        lv_msgguid  TYPE sxmsmguid,
        ls_log      TYPE ztpi_if_log01,
        lc_cx_fault TYPE REF TO cx_ai_system_fault,
        lc_ap_fault TYPE REF TO cx_ai_application_fault.

  CLEAR: ls_srmtoken,
         ls_output,
         ls_input.

* 获取SRM授权信息
  SELECT SINGLE * INTO ls_srmtoken
    FROM ztsrm_token
    WHERE sysid = sy-sysid.
  IF sy-subrc <> 0.
    success = 'false'.
    msg = '请配置SRM授权信息'.
    RETURN.
  ENDIF.

  "* 接口日志
  "inbound / outbound
  ls_log-ziftype = 'O'.
  ls_log-zifno   = 'SI_SRM003'.
  ls_log-zifdes  = '获取SRM token'.
  CALL FUNCTION 'ZPI_001_F_IF_LOG'
    EXPORTING
      im_proc = 'S'
    CHANGING
      cs_log  = ls_log.

  TRY.
      CREATE OBJECT lo_srm.
    CATCH  cx_ai_system_fault.
  ENDTRY.

  ls_output-mt_srm003_req-tenant_id = ls_srmtoken-tenant_id. "tenantId
  ls_output-mt_srm003_req-username = ls_srmtoken-username. "用户名
  ls_output-mt_srm003_req-password = ls_srmtoken-password. "密码
  ls_output-mt_srm003_req-grant_type = ls_srmtoken-grant_type. "授权类型
  ls_output-mt_srm003_req-scope = ls_srmtoken-scope. "范围
  ls_output-mt_srm003_req-type = ls_srmtoken-type. "类型


  TRY .
      CALL METHOD lo_srm->si_sap_srm003_req
        EXPORTING
          output = ls_output
        IMPORTING
          input  = ls_input.
    CATCH cx_ai_system_fault INTO lc_cx_fault.
      MSG = lc_cx_fault->get_text( ).   " Exception handling logic
  ENDTRY.

  "* 取得Msg Guid (Outbound)
  DATA: lr_proto_msg_id   TYPE REF TO if_wsprotocol_message_id.
  TRY.
      lr_proto_msg_id ?=
      lo_srm->get_protocol( if_wsprotocol=>message_id ).
      lv_msgguid = lr_proto_msg_id->get_message_id( ).
    CATCH cx_ai_system_fault INTO lc_cx_fault.
      MSG = lc_cx_fault->get_text( ).   " Exception handling logic
  ENDTRY.

  ls_log-msgguid = lv_msgguid.
  ls_log-zprocstatus =  ls_input-mt_srm003_resp-code.
  ls_log-zprocmessage = ls_input-mt_srm003_resp-msg.
  ls_log-zprocdocext  = ls_input-mt_srm003_resp-access_token.

  access_token = ls_input-mt_srm003_resp-access_token.
  success = ls_input-mt_srm003_resp-success.
  token_type = ls_input-mt_srm003_resp-token_type.
  code = ls_input-mt_srm003_resp-code.
  expires_in = ls_input-mt_srm003_resp-expires_in.

  CALL FUNCTION 'ZPI_001_F_IF_LOG'
    EXPORTING
      im_proc = 'E'
    CHANGING
      cs_log  = ls_log.

  " * 清理内存
  CLEAR: lo_srm,
         lc_cx_fault,
         lc_ap_fault.


ENDFUNCTION.

第二步:根据获取到的Token再进行调用第三方系统

SAP PO配置:

ESR配置

  1. 定义DATA TYPE 
  2. 定义MESSAGE TYPE
  3. 定义SERVICE INTERFACE
  4. 定义MESSAGE MAPPING
  5. 定义OPERATION MAPPING

定义DATA TYPE 

调用方

 被调方

 定义MESSAGE TYPE

调用方

 被调方:

 定义SERVICE INTERFACE

被调方

 定义MESSAGE MAPPING

Request Message Type Mapping

 Response Message Type Mapping 

 注意:在做message mapping的时候,需要将Request 和Response的Message Type的每一个节点做mapping匹配处理

定义OPERATION MAPPING

IB配置:

 通信渠道配置:

调用方

被调方

 维护REST URL

 

 

 Integrated Configuration

 

 SAP ECC端配置和代码开发

事务码:SPROXY

 生成代理类

DATA: ls_srm001       TYPE REF TO zco_si_sap_srm001_req,
      lc_cx_fault     TYPE REF TO cx_ai_system_fault,
      lc_ap_fault     TYPE REF TO cx_ai_application_fault,
      lr_proto_msg_id TYPE REF TO if_wsprotocol_message_id,
      ls_output       TYPE zmt_srm001_req,
      ls_input        TYPE zmt_srm001_resp,
      lv_msg          TYPE string,
      ls_srm001       TYPE REF TO zco_si_sap_srm001_req.
DO 10 TIMES."获取TOKEN,调用第一步封装好的函数ZJKSRM243来获取Token
    CLEAR: lv_msg,
           lv_code,
           lv_token,
           lv_token_type,
           lv_expires_in,
           lv_success.
    CALL FUNCTION 'ZJKSRM243'
      IMPORTING
        code         = lv_code
        access_token = lv_token
        token_type   = lv_token_type
        expires_in   = lv_expires_in
        msg          = lv_msg
        success      = lv_success.

    IF lv_token IS NOT INITIAL.
      EXIT.
    ELSE.
      WAIT UP TO 1 SECONDS.
    ENDIF.
  ENDDO.
  IF lv_msg IS NOT INITIAL.
    MESSAGE lv_msg TYPE 'E'.
  ENDIF.

*ls_output赋值处理
*XXXXXXXXXX
*XXXXXXXXX
*XXXXXXXXXX



* 接口日志
    "inbound / outbound
    ls_log-ziftype = 'O'.
    ls_log-zifno   = 'SI_SRM001'.
    ls_log-zifdes  = 'SRM采购订单同步接口'.
    CALL FUNCTION 'ZPI_001_F_IF_LOG'
      EXPORTING
        im_proc = 'S'
      CHANGING
        cs_log  = ls_log.

    TRY.
        CREATE OBJECT ls_srm001.
      CATCH  cx_ai_system_fault.
        lv_msg = lc_cx_fault->get_text( ).
    ENDTRY.

    TRY .
        CLEAR ls_input.
        CALL METHOD ls_srm001->si_sap_srm001_req
          EXPORTING
            output = ls_output
          IMPORTING
            input  = ls_input.
      CATCH cx_ai_system_fault INTO lc_cx_fault.
*        MESSAGE lc_cx_fault->get_text( ) TYPE 'E'.   " Exception handling logic
        lv_msg = lc_cx_fault->get_text( ).
    ENDTRY.

    "* 取得Msg Guid (Outbound)
    TRY.
        lr_proto_msg_id ?=
        ls_srm001->get_protocol( if_wsprotocol=>message_id ).
        lv_msgguid = lr_proto_msg_id->get_message_id( ).
      CATCH cx_ai_system_fault INTO lc_cx_fault.
        MESSAGE  lc_cx_fault->get_text( ) TYPE 'E'.   " Exception handling logic
    ENDTRY.

    IF ls_input-mt_srm001_resp-res_code = '200000'.
      MODIFY ztajkyj004_log FROM TABLE lt_save_log.
    ENDIF.

    ls_log-msgguid = lv_msgguid.
    ls_log-zprocdocerp = gs_ekko-ebeln.
    ls_log-zprocstatus =  ls_input-mt_srm001_resp-res_code.
    ls_log-zprocmessage = ls_input-mt_srm001_resp-res_msg && ls_input-mt_srm001_resp-data-error.

    CALL FUNCTION 'ZPI_001_F_IF_LOG'
      EXPORTING
        im_proc = 'E'
      CHANGING
        cs_log  = ls_log.
    "清理内存
    CLEAR: ls_srm001,
       lc_cx_fault,
       lc_ap_fault,
       lr_proto_msg_id.

<think>好的,用户的问题是关于在SAP PO中如何实现OAuth2认证来请求第三方系统。我要先回忆一下SAP PO的相关知识,特别是关于OAuth2认证的部分。SAP PO通常用于系统集成,支持多种协议,但OAuth2可能要一些特定的配置步骤。 首先,用户可能要了解SAP PO是否内置支持OAuth2,或者是否要通过其他方式实现。比如,可能要使用REST适配器,并配置OAuth2的客户端凭证流程。然后,要生成必要的配置,比如客户端ID、密钥,令牌端点等。这些信息通常由第三方系统提供。 接下来,配置REST发送方通道时,要设置认证类型为OAuth2,并填入相关参数。此外,令牌的获取和刷新机制也要考虑,可能要编写一些Groovy脚本来自动处理令牌的获取,避免每次请求都手动获取。 另外,用户可能要示例代码或配置步骤,比如如何在SAP PO中设置通道参数,或者如何通过脚本处理令牌。同时,要注意SAP PO的版本是否支持所的OAuth2功能,以及是否有必要进行额外的安全配置,比如SSL证书等。 还要考虑错误处理和日志记录,确保在认证失败时能够及时排查问题。可能还要引用一些参考资料,比如SAP官方文档或其他可靠来源,来支持步骤的正确性。 最后,生成相关问题时要围绕OAuth2在SAP PO中的其他应用,比如不同授权模式、证书配置、常见错误处理等,帮助用户进一步理解和解决问题。</think>在SAP Process Orchestration(PO)中实现OAuth2认证请求第三方系统,主要通过REST适配器配置客户端凭证模式实现。以下是具体步骤和示例: ### 一、准备工作 1. 在第三方系统注册应用,获取以下参数: - 客户端ID($client\_id$) - 客户端密钥($client\_secret$) - 令牌端点($token\_url$) - 资源访问范围($scope$) 2. 确保SAP PO版本支持HTTPS协议(推荐PO 7.5 EhP2以上版本) ### 二、配置步骤 1. **创建通信通道**: - 使用$REST\_SENDER$适配器创建发送方通道 - 在「身份验证」选项卡选择OAuth2类型 - 填写令牌端点地址和凭证参数 2. **配置OAuth2参数**: ```properties grant_type = client_credentials client_id = YOUR_CLIENT_ID client_secret = YOUR_CLIENT_SECRET scope = api_access ``` 3. **消息映射处理**: - 在$ESR$中创建包含Authorization头的消息结构: $$ Header{ Authorization String(512) } $$ ### 三、令牌获取示例(Groovy脚本) ```groovy import groovyx.net.http.RESTClient def getAccessToken(){ def client = new RESTClient(token_url) def response = client.post( requestContentType: URLENC, body: [ grant_type: "client_credentials", client_id: client_id, client_secret: client_secret, scope: scope ]) return "Bearer " + response.data.access_token } ``` ### 四、接口用配置 1. 在集成流程中设置动态HTTP头: $$ HTTP\_HEADER.Authorization = getAccessToken() $$ 2. 配置重试机制应对401错误[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值