Browse Source

add VerifyAliPaySign()

Jerry 6 years ago
parent
commit
bab69cb268
1 changed files with 26 additions and 10 deletions
  1. 26 10
      alipay_service_api.go

+ 26 - 10
alipay_service_api.go

@@ -79,7 +79,7 @@ func ParseAliPayNotifyResult(req *http.Request) (notifyReq *AliPayNotifyRequest,
 	return notifyReq, err
 }
 
-//支付通知的签名验证和参数签名后的Sign
+//支付通知的签名验证和参数签名后的Sign(Deprecated)
 //    aliPayPublicKey:支付宝公钥
 //    notifyReq:利用 gopay.ParseAliPayNotifyResult() 得到的结构体
 //    返回参数ok:是否验证通过
@@ -137,19 +137,31 @@ func VerifyAliPayResultSign(aliPayPublicKey string, notifyReq *AliPayNotifyReque
 	return true, nil
 }
 
-//验证支付宝API返回结果或异步通知结果的Sign值
+//支付宝同步返回验签或异步通知验签
 //    aliPayPublicKey:支付宝公钥
-//    bean:支付宝API返回的结构体 aliRsp 或 异步通知解析的结构体 notifyReq
+//    bean: 同步返回验签时,此参数为 aliRsp.SignData ;异步通知验签时,此参数为异步通知解析的结构体 notifyReq
+//    syncSign:同步返回验签时,此参数必传,即:aliRsp.Sign ;异步通知验签时,不传此参数,否则会出错。
 //    返回参数ok:是否验签通过
 //    返回参数err:错误信息
-func VerifyAliPaySign(aliPayPublicKey string, bean interface{}) (ok bool, err error) {
+//    验签文档:https://docs.open.alipay.com/200/106120
+func VerifyAliPaySign(aliPayPublicKey string, bean interface{}, syncSign ...string) (ok bool, err error) {
 	if bean == nil {
 		return false, errors.New("bean is nil")
 	}
 	var (
-		bm BodyMap
-		bs []byte
+		bodySign     string
+		bodySignType string
+		pKey         string
+		signData     string
+		bm           BodyMap
+		bs           []byte
 	)
+	if len(syncSign) > 0 {
+		bodySign = syncSign[0]
+		bodySignType = "RSA2"
+		signData = bean.(string)
+		goto Verify
+	}
 
 	bs, err = json.Marshal(bean)
 	if err != nil {
@@ -162,14 +174,18 @@ func VerifyAliPaySign(aliPayPublicKey string, bean interface{}) (ok bool, err er
 		return false, err
 	}
 
-	pKey := FormatAliPayPublicKey(aliPayPublicKey)
-	bodySign := bm.Get("sign")
-	bodySignType := bm.Get("sign_type")
+	bodySign = bm.Get("sign")
+	bodySignType = bm.Get("sign_type")
 	bm.Remove("sign")
 	bm.Remove("sign_type")
 
-	signData := bm.EncodeAliPaySignParams()
+	signData = bm.EncodeAliPaySignParams()
 
+Verify:
+	//fmt.Println("signData:", signData)
+	//fmt.Println("bodySign:", bodySign)
+	//fmt.Println("bodySignType:", bodySignType)
+	pKey = FormatAliPayPublicKey(aliPayPublicKey)
 	err = verifyAliPaySign(signData, bodySign, bodySignType, pKey)
 	if err != nil {
 		return false, err