ABAP调用阿里云接口-短信服务-HTTP协议及签名(abap版本)<转载>

这篇具有很好参考价值的文章主要介绍了ABAP调用阿里云接口-短信服务-HTTP协议及签名(abap版本)<转载>。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文链接:https://blog.csdn.net/xiefireworks/article/details/113037650
阿里云接口文档请参考官网地址

https://help.aliyun.com/document_detail/59210.html?spm=5176.8195934.J_5834642020.5.11ba4378DLVi4O

此处仅介绍使用ABAP完成阿里云短信服务签名请求的完成。

第一步:请求参数

1 abap 生成的uuid为32位不带“-”

2 特殊格式时间戳需要拼接

CONSTANTS: c_accesssecret TYPE string VALUE 'testSecret&',
           c_accesskeyid  TYPE string VALUE 'testId'.
 
*& 1. 填充参数
" 1.1 系统参数
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 业务参数
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.

第二步:根据参数Key排序(顺序)

" 2.1 根据参数Key排序(顺序)
SORT lt_parameter BY key.

第三步:构造待签名的请求串

1 sap自带的escape function 含pop特殊规则,不用再做替换

" 2.2 拼接URL编码后的参数值
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特殊的一种规则,即在一般的URLEncode后再增加三种字符替换
"使用escap format cl_abap_format=>e_uri_full 时满足最终条件不用如下转换
*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 '&'."移除第一个&
 
" 2.4.POP的签名规则拼接成最终的待签名串
lv_sortquerystring = 'GET' && '&' && escape( val = '/' format = cl_abap_format=>e_uri_full ) && '&'
                           &&  escape( val =  lv_sortquerystring format = cl_abap_format=>e_uri_full ) .

第四步:签名

1 签名使用HmacSHA1算法 返回的Base64加密字符串,并作url编码

" 3.1 设置签名 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 ).

ps:

1.使用function escape 可以使用不同的format, cl_abap_format=>e_uri_full 符合要求的,同样还有其它格式如cl_abap_format=>e_url_full和java示例中的url 编码效果一致,需要再做pop特殊替换

2.如果没有function escape,可以使用方法cl_http_utility=>if_http_utility~escape_url,问题是该方法url编码后的字符为小写,不符合当前要求,另外编码规则的不同点暂时发现的为"(“,”)“,“+”,“*”。

3.暂留后续封装
ABAP调用阿里云接口-短信服务-HTTP协议及签名(abap版本)<转载>,笔记,阿里云,http,云计算,abap,SAP

 DATA: lv_char_str TYPE char1024,
       lt_result   TYPE match_result_tab,
       ls_result   TYPE match_result.
 
" url encodeing
    lv_char_str = cl_http_utility=>if_http_utility~escape_url( iv_urlstring ).
    FIND ALL OCCURRENCES OF REGEX '%..' IN lv_char_str RESULTS lt_result.
    LOOP AT lt_result INTO ls_result.
      TRANSLATE lv_char_str+ls_result-offset(ls_result-length) TO UPPER CASE.
    ENDLOOP.
    "该方法不会转换()
    REPLACE ALL OCCURRENCES OF '(' IN lv_char_str WITH '%28'.
    REPLACE ALL OCCURRENCES OF ')' IN lv_char_str WITH '%29'.
 
" 特殊URL编码 POP特殊的一种规则,即在一般的URLEncode后再增加三种字符替换
*    REPLACE ALL OCCURRENCES OF '+'    IN lv_char_str WITH '%20'.
*    REPLACE ALL OCCURRENCES OF '*'    IN lv_char_str WITH '%2A'.
    REPLACE ALL OCCURRENCES OF '%7E'  IN lv_char_str WITH '~'.

附加完整的Java签名Demo代码文章来源地址https://www.toymoban.com/news/detail-574482.html

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. 填充参数
" 1.1 系统参数
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.
"接口参数地址:https://next.api.aliyun.com/document/Dysmsapi/2017-05-25/SendBatchSms
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 =  '2.0'             ) TO lt_parameter.
APPEND VALUE #(  key = 'Timestamp'            value =  lv_timestampjava  ) TO lt_parameter.
" 1.2 业务参数
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. 构造待签名的请求串
 "签名说明:https://help.aliyun.com/document_detail/469176.html?spm=api-workbench.Troubleshoot.0.0.63e271851s3V0z
" 2.1 根据参数Key排序(顺序)
SORT lt_parameter BY key.
" 2.2 拼接URL编码后的参数值
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特殊的一种规则,即在一般的URLEncode后再增加三种字符替换
"使用escap format cl_abap_format=>e_uri_full 时满足最终条件不用如下转换
*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 '&'."移除第一个&
" 2.4.POP的签名规则拼接成最终的待签名串
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 设置签名 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 ).

到了这里,关于ABAP调用阿里云接口-短信服务-HTTP协议及签名(abap版本)<转载>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里云短信服务开通

    https://dysms.console.aliyun.com/overview 登录访问阿里云短信服务,可以看到大致的操作步骤: 1.申请签名,如:【阿里云短信】 2.申请模板,如:【阿里云通信】您正在使用阿里云短信测试服务,体验验证码是:8888,如非本人操作,请忽略本短信! 3.系统设置,状态报告,审核通知

    2024年02月02日
    浏览(51)
  • 阿里云短信服务实战教程

      短信服务有很多的使用场景,比如注册获取验证码,购票成功发送购票通知。目前很多头部运营商已经提供了相关服务,比如阿里云,腾讯云等,这里以阿里云短信服务为例。   阿里云的短信服务是需要购买的,并且每条短信是计费的这个可以在阿里云看到,都有详细

    2024年02月11日
    浏览(46)
  • 阿里云开通短信服务流程

    友情提示 : 本人不是专业的技术人员,很多步骤都是我参考了很多博客,文档,自己摸索出来的,不保证各位的操作都能百分百正确,以及出现的各种问题。 我写这篇博客只是为兄弟们提供一种解决方法,以及一些思路… 操作流程会有一些麻烦,如果嫌麻烦的建议 右上角

    2024年02月02日
    浏览(46)
  • Sms多平台短信服务商系统~完成阿里云短信服务发送可自行配置

    阿里云地址 不同编程语言都有对应的SDK,你们下载自己需要的即可。 pom.xml中添加maven坐标 接下来的代码不是单纯的使用短信服务商提供的发送代码来完成短信的发送那样子就太简单了,我想你们也不想看这样的文章了CSDN一抓一大把,或者看官方文档即可。为了通用短信服务

    2024年02月09日
    浏览(53)
  • 阿里云——OpenAPI使用——短信服务

    目录 前言 产品位置 短信服务 API发送测试 控制台发送测试 链接地址: 阿里云 OpenAPI 开发者门户 公司一直没用这个,最近搞Eolink的时候看到OpenAPI,为了测试,我就搞一下阿里的试试,操作过程还是挺方便的,变相的产品华为、腾讯都有,阿里的操作的流畅度最高。步骤最简

    2023年04月20日
    浏览(40)
  • 阿里云短信服务---测试模板实现

    2023年阿里云短信服务 个人申请模板 已经申请不到了,现在使用 测试模板 实现 发送短信功能 但你手机上接收到的是模板字符串,具体验证码可以自行存到Redis或者输出到控制台 步骤: 平台链接: https://dysms.console.aliyun.com/quickstart 依次点击下面图片的提示 设置测试模板参数

    2024年02月14日
    浏览(50)
  • (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

    阿里云官网: https://www.aliyun.com/ 点击官网首页注册按钮。 注册成功后,点击登录按钮进行登录。登录后进入短信服务管理页面,选择国内消息菜单: 短信签名是短信发送者的署名,表示发送方的身份。 切换到【模板管理】标签页: 短信模板包含短信发送内容、场景、变量信息

    2024年02月02日
    浏览(52)
  • 尚融宝15-集成阿里云短信服务

    目录 一、前言 二、测试短信发送 1、查找使用示例 2、测试短信发送 ​编辑 三、使用RAM子用户 1、进入子用户管理页面 2、添加用户  3、获取子用户key 4、设置用户权限 四、短信使用场景和流程 五、创建短信微服务 1、创建项目 2、自定义配置 3、发送短信 在阿里云的短信服

    2023年04月15日
    浏览(63)
  • 尚医通-阿里云短信服务(二十九)

    目录: (1)前台用户系统-手机登录-阿里云短信服务介绍 (2)手机登录-整合短信服务 (3)整合短信发送服务测试 (1)前台用户系统-手机登录-阿里云短信服务介绍 现在使用阿里云完成短信服务:注册登录阿里云网站: 在产品中找短信服务:  或者搜索短信服务:   需要

    2024年02月02日
    浏览(38)
  • java使用阿里云的短信服务

    这里我已经购买过一次了,所以10块钱200条一年,第一次购买应该是3块钱200条三个月 发送成功 要使用阿里云的业务,这个 AccessKey ID和AccessKey Secret 是必须要获取的

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包