golang 银联证书签名错误问题

银联手机网页支付接口对接时,一直签名错误。

 

java版demo:

golang 银联证书签名错误问题_第1张图片

 

看了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证书解析出来的。

 

 

 

 

你可能感兴趣的:(golang,go)