sap發(fā)送阿里云發(fā)送短信
完整程序引用
https://blog.csdn.net/xiefireworks/article/details/113037650
TYPES: BEGIN OF ty_parameter,
? ? ? ? key? TYPE string,
? ? ? ? value TYPE string,
? ? ? END OF ty_parameter.
DATA: lo_cl_abap_hmac TYPE REF TO cl_abap_hmac.
DATA: lv_signature? ? ? ? ? ? TYPE string,
? ? ? lv_sortquerystring? ? ? TYPE string,
? ? ? lv_sortquerystring_temp TYPE string.
DATA: lt_parameter TYPE TABLE OF ty_parameter,
? ? ? ls_parameter TYPE ty_parameter.
DATA: lv_timestampsap? ? TYPE timestamp,
? ? ? lv_timestampformat TYPE char30 VALUE '____-__-__T__:__:__Z',
? ? ? lv_timestampjava? TYPE char30,
? ? ? lv_uuid? ? ? ? ? ? TYPE char36.
DATA: lv_url TYPE string.
CONSTANTS: c_accesssecret TYPE string VALUE 'testSecret&',
? ? ? ? ? c_accesskeyid? TYPE string VALUE 'testId'.
*& 1. 填充參數(shù)
" 1.1 系統(tǒng)參數(shù)
GET TIME STAMP FIELD lv_timestampsap.
WRITE lv_timestampsap TO lv_timestampjava USING EDIT MASK lv_timestampformat TIME ZONE '0'.
TRY .
? ? lv_uuid = cl_system_uuid=>create_uuid_c32_static( ).
? CATCH cx_uuid_error.
ENDTRY.
APPEND VALUE #(? key = 'SignatureMethod'? ? ? value =? 'HMAC-SHA1'? ? ? ) TO lt_parameter.
APPEND VALUE #(? key = 'SignatureNonce'? ? ? value =? lv_uuid? ? ? ? ? ) TO lt_parameter.
APPEND VALUE #(? key = 'AccessKeyId'? ? ? ? ? value =? c_accesskeyid? ? ) TO lt_parameter.
APPEND VALUE #(? key = 'SignatureVersion'? ? value =? '1.0'? ? ? ? ? ? ) TO lt_parameter.
APPEND VALUE #(? key = 'Timestamp'? ? ? ? ? ? value =? lv_timestampjava? ) TO lt_parameter.
" 1.2 業(yè)務(wù)參數(shù)
APPEND VALUE #( key = 'Action'? ? ? ? ? value =? 'SendSms'? ? ? ? ? ) TO lt_parameter.
APPEND VALUE #( key = 'Version'? ? ? ? value =? '2017-05-25'? ? ? ? ) TO lt_parameter.
APPEND VALUE #( key = 'RegionId'? ? ? ? value =? 'cn-hangzhou'? ? ? ) TO lt_parameter.
APPEND VALUE #( key = 'PhoneNumbers'? ? value =? '15300000001'? ? ? ) TO lt_parameter.
APPEND VALUE #( key = 'SignName'? ? ? ? value =? '阿里云短信測試專用'? ) TO lt_parameter.
APPEND VALUE #( key = 'TemplateParam'? value =? '{"customer":"test"}') TO lt_parameter.
APPEND VALUE #( key = 'TemplateCode'? ? value =? 'SMS_71390007'? ? ? ) TO lt_parameter.
*& 2. 構(gòu)造待簽名的請求串
" 2.1 根據(jù)參數(shù)Key排序(順序)
SORT lt_parameter BY key.
" 2.2 拼接URL編碼后的參數(shù)值
LOOP AT lt_parameter INTO ls_parameter.
? lv_sortquerystring_temp = lv_sortquerystring_temp && '&' && escape( val = ls_parameter-key format = cl_abap_format=>e_uri_full )
? ? ? ? ? ? ? ? ? ? ? ? ? ? && '=' && escape( val =? ls_parameter-value format = cl_abap_format=>e_uri_full ).
ENDLOOP.
" 2.3 特殊URL編碼 POP特殊的一種規(guī)則,即在一般的URLEncode后再增加三種字符替換
"使用escap format cl_abap_format=>e_uri_full 時(shí)滿足最終條件不用如下轉(zhuǎn)換
*REPLACE ALL OCCURRENCES OF '+'? ? IN lv_sortquerystring_temp WITH '%20'.
*REPLACE ALL OCCURRENCES OF '*'? ? IN lv_sortquerystring_temp WITH '%2A'.
*REPLACE ALL OCCURRENCES OF '%7E'? IN lv_sortquerystring_temp WITH '~'.
lv_sortquerystring = lv_sortquerystring_temp.
SHIFT lv_sortquerystring LEFT DELETING LEADING '&'."移除第一個(gè)&
" 2.4. 按POP的簽名規(guī)則拼接成最終的待簽名串
lv_sortquerystring = 'GET' && '&' && escape( val = '/' format = cl_abap_format=>e_uri_full ) && '&'
? ? ? ? ? ? ? ? ? ? ? ? ? &&? escape( val =? lv_sortquerystring format = cl_abap_format=>e_uri_full ) .
*& 3. 生成簽名
" 3.1 設(shè)置簽名 key
lo_cl_abap_hmac = cl_abap_hmac=>get_instance( if_key = cl_abap_hmac=>string_to_xstring( if_input = c_accesssecret ) ).
" 3.2 生成簽名
" 3.2 生成簽名
TRY.
? ? lo_cl_abap_hmac->final( EXPORTING if_data = cl_abap_hmac=>string_to_xstring( if_input = lv_sortquerystring )
? ? ? ? ? ? ? ? ? ? ? ? ? ? IMPORTING ef_hmacb64string = lv_signature ) .
? CATCH cx_abap_message_digest .
ENDTRY.
" 3.2 最終生成的簽名也要做特殊URL編碼
lv_signature = escape( val = lv_signature format = cl_abap_format=>e_uri_full ).
*& 4. 生成最終請求url
lv_url = 'http://dysmsapi.aliyuncs.com/?Signature=' && lv_signature && lv_sortquerystring_temp.
DATA: lv_out_put TYPE string.
lv_out_put = lv_out_put && 'SignatureNonce:'? ? ? && cl_bcs_convert=>gc_crlf && lv_uuid? ? ? ? ? ? && cl_bcs_convert=>gc_crlf.
lv_out_put = lv_out_put && 'Timestamp:'? ? ? ? ? ? && cl_bcs_convert=>gc_crlf && lv_timestampjava? && cl_bcs_convert=>gc_crlf.
lv_out_put = lv_out_put && 'sortedQueryString:'? ? && cl_bcs_convert=>gc_crlf && lv_sortquerystring && cl_bcs_convert=>gc_crlf.
lv_out_put = lv_out_put && 'signature:'? ? ? ? ? ? && cl_bcs_convert=>gc_crlf && lv_signature? ? ? && cl_bcs_convert=>gc_crlf.
lv_out_put = lv_out_put && 'URL:'? ? ? ? ? ? ? ? ? && cl_bcs_convert=>gc_crlf && lv_url? ? ? ? ? ? && cl_bcs_convert=>gc_crlf.
cl_demo_text=>display_string( lv_out_put ).