签名(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);

回调通知签名

当调用商户的接口时,慧收钱支付会使用慧收钱支付的平台私钥对回调请求进行签名。签名的方法同应答签名的方式一致,商户必须使用慧收钱支付公钥验证回调的签名。