关于建行支付的异步通知验签处理
找了很多大佬的文章没看到golang详细的建行支付异步通知得了例子,这里将用go进行示例。
建行给的公钥是16进制公钥,如果拿来使用记得转换成一下。同样的还有sign签名串
func HexToString(hexStr string) string {
hexBytes, err := hex.DecodeString(hexStr)
if err != nil {
return ""
}
return string(hexBytes)
}
代码如下:
func RsaVerifySignWithMd5(originalData, sign, pubKey string) error {
pubKey = Base64URLDecode(pubKey)
fmt.Println("pubKey", pubKey)
public, err := base64.StdEncoding.DecodeString(pubKey)
if err != nil {
fmt.Println("DecodeString")
return err
}
pub, err := x509.ParsePKIXPublicKey(public)
if err != nil {
fmt.Println("ParsePKIXPublicKey", err)
return err
}
hash := md5.New()
hash.Write([]byte(originalData))
return rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.MD5, hash.Sum(nil), []byte(sign))
}
func Base64URLDecode(data string) string {
var missing = (4 - len(data)%4) % 4
data += strings.Repeat("=", missing) //字符串长度不足4倍的位补"="
data = strings.Replace(data, "_", "/", -1)
data = strings.Replace(data, "-", "+", -1)
return data
}
func main() {
publicKey := "你的16进制小写公钥"
pub := HexToString(publicKey)
message := "你的验签串(记得将所有非sign参数按照正确的顺序排列)"
//
signature := "你的16进制小写签名串"
//
sig := HexToString(signature)
err := RsaVerifySignWithMd5(message, sig, pub)
fmt.Println(err)
if err != nil {
fmt.Println("Signature verification failed:", err)
} else {
fmt.Println("Signature verified successfully.")
}
}