SAP EPIC 银企直连 农业银行 Socket 接口项目实践


SAP EPIC 银企直连大部分银行用的是Http 接口,可以直接在SM59中创建 到外部服务器的HTTP连接即可与银行前置机通信,快速进行银企直连接口开发。

少部分银行用的是Socket (农业银行,南京银行等),这时有2种方式:

  • JAVA 把Socket 封装成Http,然后ABAP调用;
  • ABAP直接调用Socket;

可根据项目实际情况灵活选择。一般情况建议采用SAP标准的EPIC 银企直连解决方案,稳定可靠,开发工作量少,大大降低实施成本。

 1.3.1关于通讯方式

ERP与ICT之间的交易数据包都采用TCP/IP协议的Socket同步短连接方式。
Socket 方式中报文结构为“包头+数据包”。包头固定为7个字节长,第1字节为是否加密标志(0-不加密,1-加密)。后6个字节是数据包的长度,即将报文长度直接转为字符串存储,长度不足6位则右边用空格补足,比如:“1234 ”。比如汇兑的长度为1234字节的数据包,其包头为“01234 ”共7位,其中数据包长度包含加密包标志位。由于加密需要双方约定专门的加密算法,因此一般ERP送的加密标志都为0-不加密。

 

 

WebSocket Communication with ABAP Push Channel using Text Messages

Open WebSocket

Send message to APC

Close WebSocket

If the form field amc of the URL contains "x", an opened WebSocket receives text messages from the ABAP Messaging Channel DEMO_AMC.
Such messages are then sent in the APC handler class but can also be sent by program DEMO_SEND_AMC.
The program DEMO_RECEIVE_AMC can receive text messages sent by the APC handler class.

If you send the message get handle, you will receive the connection attach handle of the APC-server.

 

  1 REPORT demo_apc_tcp_client.
  2  
  3 CLASS apc_handler DEFINITION FINAL .
  4   PUBLIC SECTION.
  5     INTERFACES if_apc_wsp_event_handler.
  6     DATA       message TYPE string.
  7 ENDCLASS.
  8  
  9 CLASS apc_handler IMPLEMENTATION.
 10   METHOD if_apc_wsp_event_handler~on_open.
 11   ENDMETHOD.
 12  
 13   METHOD if_apc_wsp_event_handler~on_message.
 14     TRY.
 15         message = i_message->get_text( ).
 16       CATCH cx_apc_error INTO DATA(apc_error).
 17         message = apc_error->get_text( ).
 18     ENDTRY.
 19   ENDMETHOD.
 20  
 21   METHOD if_apc_wsp_event_handler~on_close.
 22     message = 'Connection closed!'.
 23   ENDMETHOD.
 24  
 25   METHOD if_apc_wsp_event_handler~on_error.
 26   ENDMETHOD.
 27 ENDCLASS.
 28  
 29 CLASS apc_demo DEFINITION.
 30   PUBLIC SECTION.
 31     CLASS-METHODS main.
 32 ENDCLASS.
 33  
 34 CLASS apc_demo IMPLEMENTATION.
 35   METHOD main.
 36     DATA(tcp_server) = `C:\ncat\ncat.exe`.
 37     DATA(ip_adress)  = cl_gui_frontend_services=>get_ip_address( ).
 38     DATA(port)       = `12345`.
 39     DATA(terminator) = `0A`.
 40     DATA(msg)        = `Hello TCP, answer me!`.
 41  
 42     cl_demo_input=>new(
 43       )->add_text(
 44          `For the TCP server, download the freely available NCAT.EXE`
 45       )->add_field( CHANGING field = tcp_server
 46       )->add_field( CHANGING field = ip_adress
 47       )->add_field( CHANGING field = port
 48       )->add_field( CHANGING field = terminator
 49       )->add_field( CHANGING field = msg
 50       )->request( ).
 51  
 52     "Server
 53     IF cl_gui_frontend_services=>file_exist(
 54          file = tcp_server ) IS INITIAL.
 55       cl_demo_output=>display( 'TCP Server not found!' ).
 56       LEAVE PROGRAM.
 57     ENDIF.
 58     cl_gui_frontend_services=>execute(
 59     EXPORTING
 60       application = `cmd.exe`
 61       parameter  =  `/c ` && tcp_server &&
 62                    ` -l ` && ip_adress && ` -p ` && port ).
 63     WAIT UP TO 1 SECONDS.
 64  
 65     TRY.
 66         DATA(event_handler) = NEW apc_handler( ).
 67  
 68         "Client
 69         DATA(client) = cl_apc_tcp_client_manager=>create(
 70           i_host   = ip_adress
 71           i_port  = port
 72           i_frame = VALUE apc_tcp_frame(
 73             frame_type =
 74               if_apc_tcp_frame_types=>co_frame_type_terminator
 75             terminator =
 76               terminator )
 77           i_event_handler = event_handler ).
 78  
 79         client->connect( ).
 80  
 81         "Send mesasage from client
 82         DATA(message_manager) = CAST if_apc_wsp_message_manager(
 83           client->get_message_manager( ) ).
 84         DATA(message) = CAST if_apc_wsp_message(
 85           message_manager->create_message( ) ).
 86         DATA(binary_terminator) = CONV xstring( terminator ).
 87         DATA(binary_msg) =
 88           cl_abap_conv_codepage=>create_out( )->convert( msg ).
 89         CONCATENATE binary_msg binary_terminator
 90                INTO binary_msg IN BYTE MODE.
 91         message->set_binary( binary_msg ).
 92         message_manager->send( message ).
 93  
 94         "Wait for a message from server
 95         CLEAR event_handler->message.
 96         WAIT FOR PUSH CHANNELS
 97              UNTIL event_handler->message IS NOT INITIAL
 98              UP TO 10 SECONDS.
 99         IF sy-subrc = 4.
100           cl_demo_output=>display(
101             'No handler for APC messages registered!' ).
102         ELSEIF sy-subrc = 8.
103           cl_demo_output=>display(
104             'Timeout occurred!' ).
105         ELSE.
106           cl_demo_output=>display(
107             |TCP client received:\n\n{ event_handler->message }| ).
108         ENDIF.
109  
110         client->close(
111           i_reason = 'Application closed connection!' ).
112  
113       CATCH cx_apc_error INTO DATA(apc_error).
114         cl_demo_output=>display( apc_error->get_text( ) ).
115     ENDTRY.
116  
117   ENDMETHOD.
118 ENDCLASS.
119  
120 START-OF-SELECTION.
121   apc_demo=>main( ).
<ap>
  <CCTransCode>交易代码</CCTransCode>
  <ProductID>产品标识</ProductID>
  <ChannelType>渠道标识</ChannelType>
  <CorpNo>企业技监局代码/客户号</CorpNo>
  <OpNo>企业操作员编号</OpNo>
  <AuthNo>认证码</AuthNo>
  <ReqSeqNo>请求方流水号</ReqSeqNo>
  <ReqDate>请求日期</ReqDate>
  <ReqTime>请求时间</ReqTime>
  <Sign>数字签名</Sign>
  <FileFlag>文件标识</FileFlag>
  <Corp>
    <StartDate>起始日期</StartDate>
    <EndDate>终止日期</EndDate>
  </Corp>
  <Channel>
    <LastJrnNo>0</LastJrnNo>
  </Channel>
  <Cmp>
    <DbAccNo>账号</DbAccNo>
    <DbProv>省市代码</DbProv>
    <DbCur>货币号</DbCur>
    <StartTime>末笔时间戳</StartTime>
  </Cmp>
</ap>
<ap>
  <CCTransCode>CQRA10</CCTransCode>
  <ProductID>ICC</ProductID>
  <ChannelType>ERP</ChannelType>
  <CorpNo>00000035</CorpNo>
  <OpNo>0011</OpNo>
  <AuthNo/>
  <ReqSeqNo>2021042211375856</ReqSeqNo>
  <ReqDate>20210422</ReqDate>
  <ReqTime>193758</ReqTime>
  <Sign/>
  <FileFlag/>
  <Corp>
    <StartDate>20210401</StartDate>
    <EndDate>20210421</EndDate>
  </Corp>
  <Channel>
    <LastJrnNo>0</LastJrnNo>
  </Channel>
  <Cmp>
    <DbAccNo>0023649</DbAccNo>
    <DbProv>15</DbProv>
    <DbCur>01</DbCur>
    <StartTime/>
  </Cmp>
</ap>                                                                                                                                                                                                                                                              

欢迎交流探讨


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM