银联手机网页支付接口对接时,一直签名错误。
java版demo:
看了java与php的示例,一般封装的sha256方法都会以16进制输出。golang输出的是byte数组。
对比了java版demo,思考很久才发现原因如下:
// 银联接口rsa签名
func RsaWithSha256SignBase64(value string, privateKey interface{}) (sign string, err error) {
// **注意:这里需要两次sha256,第一次使用16进制输出,对输出结果,再次sha256输出[]byte,这个才是能正常做签名的。
sha256hex := fmt.Sprintf("%x", sha256.Sum256([]byte(value)))
hash := sha256.New()
hash.Write([]byte(sha256hex))
shaBytes := hash.Sum(nil)
b, err := rsa.SignPKCS1v15(cryptorand.Reader, privateKey.(*rsa.PrivateKey), crypto.SHA256, shaBytes)
if err != nil {
return
}
sign = base64.StdEncoding.EncodeToString(b)
return
}
这个函数能直接使用,参数value是待签名字符串,privateKey是pfx证书解析出来的。