签名(RSA2)
签名流程
请求签名
商户需要使用自身的私钥对接口中业务请求参数,把除签名字段(sign)以外的所有值,依次按照“字段名=字段值”的方式用“&”符号连接符拼接成待签名串,对待签名串进行SHA-256 with RSA签名。请求的签名信息放在sign字段中,具体说明请见请求签名示例。没有携带签名或者签名验证不通过的请求,都不会被执行,并返回对应错误信息。
请求签名示例
/**
* 请求参数验签明文拼接
*
* @param method 请求方法
* @param version 版本
* @param format 报文格式
* @param key 签名混淆key 平台分配
* @param signType 加密类型
* @param signContent 请求报文明文
* @param merchantNo 商户号
* @return 返回拼接结果
*/
public static final String convertReqSignStr(String method, String version, String format, String key,
String signType,
String signContent,
String merchantNo) {
StringBuilder signStr = new StringBuilder();
signStr.append("method=");
signStr.append(method);
signStr.append("&version=");
signStr.append(version);
signStr.append("&format=");
signStr.append(format);
signStr.append("&merchantNo=");
signStr.append(merchantNo);
signStr.append("&signType=");
signStr.append(signType);
signStr.append("&signContent=");
signStr.append(signContent);
signStr.append("&key=");
signStr.append(key);
return signStr.toString();
}
/**
* rsa 验签算法流程,当signType为RSA2时
* 1.先按固定格式拼接
* 2.RSA签名
*/
String signStr= convertReqSignStr(method,version,format,key,signType,signContent,merchantNo);
log("[请求]固定格式拼接后明文:"+signStr);
sign = RSA2Encript.sign(signStr,pfxpath,pwd);
log("[请求]RSA加签后内容:"+sign);
params.put("sign",sign);
应答签名
对于签名验证成功的请求,慧收钱支付平台的私钥对业务响应参数进行签名。签名的信息放在sign字段中,具体说明请见应答签名示例。
请使用慧收钱平台的公钥进行验签,它包含在慧收钱支付平台证书中。
请对携带了签名的应答进行验签
没有携带签名的成功应答,应认为是伪造或被篡改的应答
应答签名示例
/**
* 响应验签明文拼接格式密
* <p>
* success=true :sign(result=xx&success=true&key=xxx)
* success=false :sign(errorCoe=xx&errorMsg=xx&success=false&key=xxx)
*
* @param result 响应结果
* @param secureKey 签名混淆key 平台分配
* @return 返回拼接结果
*/
public static String convertResSignStr(Response result, String secureKey) {
StringBuilder signStr = new StringBuilder();
if (result.isSuccess()) {
signStr.append("result=");
signStr.append(result.getResult());
signStr.append("&success=");
signStr.append(result.isSuccess());
signStr.append("&key=");
signStr.append(secureKey);
} else {
signStr.append("errorCode=" + result.getErrorCode());
signStr.append("&errorMsg=" + result.getErrorMsg());
signStr.append("&success=" + result.isSuccess());
signStr.append("&key=" + secureKey);
}
return signStr.toString();
}
/**
* rsa 响应报文验签流程,当signType为RSA2时
* 1.全报文除sig外按照固定格式拼接生成待加密串
* 2.RSA验签
*/
String respSign = convertResSignStr(respMap,key);
log("[响应] 固定格式拼接后:"+respSign);
boolean verifyResult = RSA2Encript.verify(respSign,respMap.get("sign").toString(),publicpath);
回调通知签名
当调用商户的接口时,慧收钱支付会使用慧收钱支付的平台私钥对回调请求进行签名。签名的方法同应答签名的方式一致,商户必须使用慧收钱支付公钥验证回调的签名。