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