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>
歡迎交流探討