认证
RSA认证
签名请求
- 生成你的私钥, 用
appRsaPrivateKey
表示, 用于签名请求,长度为2048。 - 构建要签名的字符串
Content_To_Be_Signed
. - 使用
SHA256WithRSA
加密算法计算并生成签名。 - 将生成的签名添加到请求正文参数
sign
中。
有关每个步骤的更多信息,请参阅以下示例。
签名计算步骤
1. 生成密钥对
- 签名使用RSA算法。通信双方生成一组RSA密钥并交换公钥。请求时,私钥用于签名,接收请求的一方使用公钥进行验证。请求则需要按照以下方法生成一套私钥,然后将公钥上传给CodePay.
如果使用Java语言,私钥的格式为PKCS8,而其他语言使用PKCS1。密钥的长度为2048。公钥的格式通常是PEM,一些语言(如C#)需要DER格式的公钥,这些公钥可能需要转换。
- 如果您不知道如何生成RSA2密钥,我们建议您使用以下工具,只需单击一下即可生成密钥、生成签名和验证签名:
PayCloud Key Tool

- 您也可以使用openssl手动生成RSA2密钥,如下所示:
# 1. Generating the private key
openssl genrsa -out client_private_key_php_dotnet.pem
# 2. If you are a Java developer, convert the private key to PKCS8 format, other development languages use the PKCS1 format
openssl pkcs8 -topk8 -inform PEM -in client_private_key_php_dotnet.pem -outform PEM -nocrypt -out client_private_key_pkcs8.pem
# 3. Generate the public key
openssl rsa -in client_private_key_php_dotnet.pem -pubout -out client_public_key_php_dotnet.pem
# 4. Generate the private key that can be used in Java
cat client_private_key_pkcs8.pem | grep -v "^\-" | tr -d "\n" | sed 's/%$//' > client_private_key_java.pem
# 5. Generate the public key that can be used in Java
cat client_public_key_php_dotnet.pem | grep -v "^\-" | tr -d "\n" | sed 's/%$//' > client_public_key_java.pem
2. 构造要签名的字符串
Step 1: 建立要签名的参数
需要签名的参数包括:API请求参数、响应参数和异步通知参数(但不包括签名参数sign
和值为NULL或空字符串的参数)。
提示
根据HTTP协议要求,在GET模式下请求时,如果传递的参数的值中有特殊字符(如:&、@等),则该值需要为URL编码,以便请求的接收方能够接收到正确的参数值。在这种情况下,要签名的数据应该是原始值,而不是编码后的值 。例如对接口的调用需要对请求参数电子邮件进行数字签名,那么待签名数据应该是test@msn.com
,而不是%40msn.com
。
以下参数数组是一个示例:
String [] parameters={
"app_id=wzxxxxxxxxxx",
"method=pay.orderquery",
"format=JSON",
"charset=UTF-8",
"sign_type=RSA2",
"version=1.0",
"timestamp=1908901287917",
"merchant_no=M100001876",
"description="
};
处理后需要参与签名的参数为(根据规则,空的ab_no值不参与签名)
String [] parameters={
"app_id=wzxxxxxxxxxx",
"method=pay.orderquery",
"format=JSON",
"charset=UTF-8",
"sign_type=RSA2",
"version=1.0",
"timestamp=1908901287917",
"merchant_no=M100001876"
};
警告
由于JSON对象的Key是无序的,因此此签名规则只会选择JSON第一层的Key和Value,对于嵌套的JSON对象,请在签名计算和HTTP消息发送之前将JSON的Value转换为字符串。
这是错误的JSON消息,key3的值是JSONObject,没有转换为字符串
{
"key1":"value1",
"key2":"value2",
"key3":{
"subkey31":"subvalue31",
"subkey32":"subvalue32"
}
}