接入指南
概述
1.
认证
请求时,需要先获取accessToken,并在请求头Authorization 添加上获取到的accessToken
生成公私钥
openssl genpkey -out api_private.pem -algorithm RSA -pkeyopt rsa_keygen_bits:4096
使用 OpenSSL 生成 RSA 私钥对应的公钥(api_public.pem 为您的 API RSA 公钥):
openssl rsa -in api_private.pem -out api_public.pem -pubout
保存商户公钥例子 需要把头部和尾部都保存进来
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6v8JgHmwJS1gK1IR9jpb
fHD+mEEwAteV13pmM94ribQELnhbQegvmH/aCDg7nkIZasyQ5H3mfNa1Fuv6IATY
9Of58gA9TEUkcxzV0JrT0zVpkxmCaejUVA63gi6AVqQZWn4YqRBAqzVzgq4CpOG+
dGTXy/GS62+EdDvF3jrhPcECAwEAAQ==
-----END PUBLIC KEY-----
RSA 加密和解密在接口交互中的对接文档
一、请求加密过程
1.
2.
body = {'param1': 'value1', 'param2': 'value2'}
。3.
encrypt_data_with_public_key(body, public_key_str)
,其中public_key_str
是已知的vm平台公钥字符串。encrypt_data_with_public_key函数见下方示例.4.
content
。5.
{'content': content}
发送给对应接口。二、响应解密过程
1.
{'code': 0, 'msg':'ok', 'data': '加密数据'}
。2.
data
字段内容。3.
data
进行解密,调用解密函数decrypt_data_with_private_key(encrypted_data, private_key_str)
,其中encrypted_data
是响应中的加密数据data
,private_key_str
是用户已知的私钥字符串。decrypt_data_with_private_key函数见下方示例。(其中填充方式使用PKCS#1 v1.5 填充)4.
5.
三、加密和解密函数说明
(一)加密函数
encrypt_data_with_public_key
data
:需要加密的数据,应为可序列化的对象,通常为字典等。public_key_str
:公钥字符串。RSA.import_key
方法加载传入的公钥字符串。PKCS1_v1_5
加密器对 JSON 字符串编码后的字节数据进行加密。(二)解密函数
decrypt_data_with_private_key
encrypted_data
:经过加密和编码后的十六进制字符串数据。private_key_str
:私钥字符串。RSA.import_key
方法加载传入的私钥字符串。PKCS1_v1_5
解密器对 Base64 解码后的数据进行解密。None
。1.
四、使用示例
your_public_key
和your_private_key
替换为实际的公钥 和私钥字符串。同时,确保数据的格式符合预期,并且在加密和解密过程中没有出现错误。1.
2.
请求示例
请求 base URL
https://sandbox-api.vmcardio.com/
加密前请求参数
加密前业务请求参数示例
{
"apiKey": "341916e58af445f8aadeb95*******",
"timestamp": "1623038312088",
"rsaType": "ECB_OAEP",
"aesType": "GCM_NOPADDING",
"bizContent": {
"page": 1,
"pageSize": 1
}
}
加密后请求参数
{
"apiKey": "341916e58af445f8aadeb95170******",
"timestamp": "1628652100447",
"bizContent": "qjFMZXs2n+CxnrNGoaZmGrKQzPosy6QbWEumCMkGOEw=",
"key": "gYZvuXdJADuaLYMU3z8q5vOtld62PSaPxrrhhr4UGwWbZm7Pw3/VImzHrd3oNy1XT8R55V7pbpQOBVdbmTev/rESnuaXlGofkB04JWAaRCIPytEKMHUNXZXEU9GLVppYst7bgiekMDIDScS4AkD75eDG8zru5Gr+gTxU4AYyHSzB0deQnxmNRemwZn+jaNgNs7WeBcuQWR1Cq2+1At8FlAqF5XzEaeQ3x1Q0N3iaLzSiXHQRYqP1Q6V6/aiIXchin/X9bBRYL618utjm4k0qoXU8Rw2JeEKzn7m2ShyyQQ31zX/rQ1xf0ar5PDtJPU/qYp9Kr4oVtcN6yHdG802nLqpGYlHlMvxy9vpnGFXb9oxh4xYnp0qRUfKLyJIylc3qhq6spHyWnuC5XV1S4lH+rIPNF1icV08ex7pjps2jvTICBzIIPExBamh1n00RcxZbkGqxYfRZ7SLTUCH06EaV5lP8yXNe3fNWjHk4mppaVDj0QFagqTzBM9AwMfHs1dOeDmcwkTacKQsvNRu3l5uZFQYkaUeVB9m3AhKw3lyl2oJIfJgYeBLJEHMGFVZXP92z8+J5KrZEVfkL8F80XkB3sXRP0BiIv/9Mm4VrjopYoDWyXttCysY0lJ9XImRyE7GkSy2sjmW0BCsrECoVHWh73s9o7Kw0uIegFaitch24GsM=",
"sig": "ZPQcL1aIxMrA6HTq7RWWS8FZS08zSOkS69WohcBw1bDr4Qv2Wkrp2t+PNHMh3TmDUnOmUOiv7mBs/sOw08rhgPHqAU/qtvc1lzJFFOnPp5MBmDgffD1auwm7icGzm3myhEz3hKePxyRgZWB1DpPmMYaRuWt1RYcVmcqRa/Bfd0jR37a35neuOSlaip4jsQE1pHQzQ6itdQhBtZZABl1Plz5u8OaMIDTVj63485zi/n6iuuav+GL+JX2JL6pnWz3CT/9DNqa/McyYbxGswGMBAPgHCptseELVmOQ3ZKNHgMu6EtXEKLzmLeZ5REwnw2MTvpzuy5B1zIuxiafuAhh6Tg==",
"rsaType": "ECB_OAEP",
"aesType": "GCM_NOPADDING"
}