本文参考文档:
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-8CALL METHOD cl_http_utility=>if_http_utility~encode_utf8EXPORTINGunencoded = l_inputRECEIVINGencoded = l_xstringEXCEPTIONSconversion_failed = 1OTHERS = 2.IF sy-subrc <> 0.* Implement suitable error handling hereENDIF.
* 进行Md5加密CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'EXPORTINGalg = 'MD5'data = l_xstring* LENGTH = 0IMPORTING* hash = l_h160* HASHLEN =* HASHX =* HASHXLEN =* hashstring =hashxstring = l_xhstring* hashb64string = l_64EXCEPTIONSunknown_alg = 1param_error = 2internal_error = 3OTHERS = 4.* 通过BASE64生成数字签名CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'EXPORTINGinput = l_xhstringIMPORTINGoutput = l_base64.WRITE:/ '最终经过MD5、BASE64加密后的字符串:',l_base64.
执行结果
BASE64生成的签名: IIKJtuLVzoFTu4kHI8M8vA==
对方拿到这个 报文+时间戳后,取自己这边保存的秘钥,然后同时也用MD5 加密 再生成签名,如果跟 收到的数字签名一致。说明报文数据没发生过篡改。
这算是SAP比较常用的,也是比较简单的加密。