货铺QQ群号:834508274
微信群不能扫码进了,可以加我微信SAPliumeng拉进群,申请时请提供您哪个模块顾问,否则是一律不通过的。
进群统一修改群名片,例如BJ_ABAP_森林木。群内禁止发广告及其他一切无关链接,小程序等,进群看公告,谢谢配合
不修改昵称会被不定期踢除,谢谢配合!
本文参考文档:
http://www.baidusap.com/abap/7408
自己整理了一下而已。
首先看下顺丰的官方文档:
http://qiao.sf-express.com/pages/developDoc/index.html?level2=922308
SAP发送 报文。
发送的参数列表是
参数列表 | 类型 | 是否必传 | 含义 |
---|---|---|---|
partnerID | String(64) | Y | 合作伙伴编码(即顾客编码) |
requestID | String(40) | Y | 请求唯一号UUID |
serviceCode | String(50) | Y | 接口服务代码(到API接口详情查看具体服务代码) |
timestamp | long | Y | 调用接口时间戳 |
msgDigest | String(128) | Y | 数字签名 |
msgData | String | Y | 业务数据报文 |
看第四点即可。
1、在请求时用“msgData”字段表示要发送的JSON内容;
2、在POST时用“msgDigest”字段进行签名验证。签名使用MD5方式,对msgData的内容进行签名。
msgData(业务报文) timestamp checkWord(客户校验码),经过URLEncoder.encode((msgData timeStamp checkWord),"UTF-8")后进行MD5,
最后在转换为Base64字符串
详细解释如下:
假设json内容为:{"language":"zh-CN","orderId":"QIAO-20200618-004"} ,
时间戳为12312334453453,
校验码为fjcg5PGKaNpPSHFAZ4QsCOkV71R3zVci
那么要签名的内容为
{"language":"zh-CN","orderId":"QIAO-20200618-004"}12312334453453fjcg5PGKaNpPSHFAZ4QsCOkV71R3zVci(默认UTF-8编码),
经过md5和base64后的内容就为IIKJtuLVzoFTu4kHI8M8vA==
最终要发送的数据为 msgData={"language":"zh-CN","orderId":"QIAO-20200618-004"}& msgDigest = IIKJtuLVzoFTu4kHI8M8vA==
MD5 ,需要双方都知道这对秘钥。
比如这里可以双方存一份,每个合作伙伴对应的秘钥。
也就是文档里的 校验码:fjcg5PGKaNpPSHFAZ4QsCOkV71R3zVci
这个东西是不对外的。
最后的数字签名就是:
IIKJtuLVzoFTu4kHI8M8vA==
那SAP这边,实现demo
DATA:l_xstring TYPE xstring,
l_base64 TYPE string,
l_xhstring TYPE xstring.
DATA:l_input TYPE string VALUE '{"language":"zh-CN","orderId":"QIAO-20200618-004"}12312334453453fjcg5PGKaNpPSHFAZ4QsCOkV71R3zVci'.
WRITE:`需要加密的字符串:`,l_input.
* 将需要加密的字符串转换成RUI格式
l_input = escape( val = l_input format = cl_abap_format=>e_uri_full ).
WRITE:/ `URI转换后的字符串: `,l_input.
* 转换成UTF-8
CALL METHOD cl_http_utility=>if_http_utility~encode_utf8
EXPORTING
unencoded = l_input
RECEIVING
encoded = l_xstring
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
* 进行Md5加密
CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'
EXPORTING
alg = 'MD5'
data = l_xstring
* LENGTH = 0
IMPORTING
* hash = l_h160
* HASHLEN =
* HASHX =
* HASHXLEN =
* hashstring =
hashxstring = l_xhstring
* hashb64string = l_64
EXCEPTIONS
unknown_alg = 1
param_error = 2
internal_error = 3
OTHERS = 4.
* 通过BASE64生成数字签名
CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
EXPORTING
input = l_xhstring
IMPORTING
output = l_base64.
WRITE:/ '最终经过MD5、BASE64加密后的字符串:',l_base64.
BASE64生成的签名: IIKJtuLVzoFTu4kHI8M8vA==
对方拿到这个 报文 时间戳后,取自己这边保存的秘钥,然后同时也用MD5 加密 再生成签名,如果跟 收到的数字签名一致。说明报文数据没发生过篡改。
这算是SAP比较常用的,也是比较简单的加密。
推荐阅读:
《DEMO:S/4 1809 FAGLL03H 增加字段增强》
《几个ABAP实用模板,体力活就别一行行敲了,复制粘贴得了》
《SAP Parallel Accounting(平行分类账业务)配置 操作手册 BAPI demo程序》
《CC02修改确认日期BAPI:Processing of change number was canceled》
《女儿的部分书单》
《苏州游记》
《溜达:无锡》
《杂谈:几种接口》
《RESTful DEMO 一:SAP 如何提供 RESTful Web 服务》
DEMO search help 增强 ( vl03n KO03 等) |
录BDC时 弹出的公司代码框问题 |
WDA Demo
ALV DEMO
Debug 系列
、