Jerry 6 лет назад
Родитель
Сommit
15deb35dcc
5 измененных файлов с 92 добавлено и 18 удалено
  1. 1 1
      alipay/client.go
  2. 15 1
      alipay/model.go
  3. 54 14
      alipay/service_api.go
  4. 19 0
      alipay/service_api_test.go
  5. 3 2
      release_note.txt

+ 1 - 1
alipay/client.go

@@ -595,7 +595,7 @@ func (a *Client) UserInfoAuth(bm gopay.BodyMap) (aliRsp *UserInfoAuthResponse, e
 	if bs, err = a.doAliPay(bm, "alipay.user.info.auth"); err != nil {
 		return nil, err
 	}
-	if strings.Contains(string(bs), "<html>") || strings.Contains(string(bs), "<HTML>") {
+	if strings.Contains(string(bs), "<head>") {
 		return nil, errors.New(string(bs))
 	}
 	aliRsp = new(UserInfoAuthResponse)

+ 15 - 1
alipay/model.go

@@ -616,7 +616,7 @@ type userCertifyOpenQueryResponse struct {
 	MaterialInfo string   `json:"material_info,omitempty"`
 }
 
-// ====================================================
+// ===================================================
 type UserInfoAuthResponse struct {
 	Response *struct {
 		Code    string `json:"code,omitempty"`
@@ -628,3 +628,17 @@ type UserInfoAuthResponse struct {
 	SignData     string `json:"-"`
 	Sign         string `json:"sign"`
 }
+
+// ===================================================
+type MonitorHeartbeatSynResponse struct {
+	Response *struct {
+		Code    string `json:"code,omitempty"`
+		Msg     string `json:"msg,omitempty"`
+		SubCode string `json:"sub_code,omitempty"`
+		SubMsg  string `json:"sub_msg,omitempty"`
+		Pid     string `json:"pid,omitempty"`
+	} `json:"monitor_heartbeat_syn_response,omitempty"`
+	AlipayCertSn string `json:"alipay_cert_sn,omitempty"`
+	SignData     string `json:"-"`
+	Sign         string `json:"sign"`
+}

+ 54 - 14
alipay/service_api.go

@@ -523,7 +523,7 @@ func DecryptOpenDataToBodyMap(encryptedData, secretKey string) (bm gopay.BodyMap
 
 // SystemOauthToken 换取授权访问令牌(默认使用utf-8,RSA2)
 //    appId:应用ID
-//    PrivateKey:应用私钥
+//    privateKey:应用私钥
 //    grantType:值为 authorization_code 时,代表用code换取;值为 refresh_token 时,代表用refresh_token换取,传空默认code换取
 //    codeOrToken:支付宝授权码或refresh_token
 //    signType:签名方式 RSA 或 RSA2,默认 RSA2
@@ -555,34 +555,74 @@ func SystemOauthToken(appId, privateKey, grantType, codeOrToken, signType string
 }
 
 // systemOauthToken 向支付宝发送请求
-func systemOauthToken(appId, privateKey string, body gopay.BodyMap, method string, isProd bool, signType string) (bs []byte, err error) {
-	body.Set("app_id", appId)
-	body.Set("method", method)
-	body.Set("format", "JSON")
-	body.Set("charset", "utf-8")
+func systemOauthToken(appId, privateKey string, bm gopay.BodyMap, method string, isProd bool, signType string) (bs []byte, err error) {
+	bm.Set("app_id", appId)
+	bm.Set("method", method)
+	bm.Set("format", "JSON")
+	bm.Set("charset", "utf-8")
 	if signType == gopay.NULL {
-		body.Set("sign_type", "RSA2")
+		bm.Set("sign_type", "RSA2")
 	} else {
-		body.Set("sign_type", signType)
+		bm.Set("sign_type", signType)
 	}
-	body.Set("sign_type", signType)
-	body.Set("timestamp", time.Now().Format(gopay.TimeLayout))
-	body.Set("version", "1.0")
+	bm.Set("timestamp", time.Now().Format(gopay.TimeLayout))
+	bm.Set("version", "1.0")
 	var (
 		sign string
 		url  = baseUrlUtf8
 	)
 	pKey := FormatPrivateKey(privateKey)
-	if sign, err = getRsaSign(body, signType, pKey); err != nil {
+	if sign, err = getRsaSign(bm, bm.Get("sign_type"), pKey); err != nil {
 		return nil, err
 	}
-	body.Set("sign", sign)
+	bm.Set("sign", sign)
 	if !isProd {
 		url = sandboxBaseUrlUtf8
 	}
-	_, bs, errs := gopay.NewHttpClient().Type(gopay.TypeForm).Post(url).SendString(FormatURLParam(body)).EndBytes()
+	_, bs, errs := gopay.NewHttpClient().Type(gopay.TypeForm).Post(url).SendString(FormatURLParam(bm)).EndBytes()
 	if len(errs) > 0 {
 		return nil, errs[0]
 	}
 	return bs, nil
 }
+
+// monitor.heartbeat.syn(验签接口)
+//    appId:应用ID
+//    privateKey:应用私钥
+//    signType:签名方式 RSA 或 RSA2,默认 RSA2
+//    bizContent:验签时该参数不做任何处理,{任意值},此参数具体看文档
+//    文档:https://docs.open.alipay.com/api_9/monitor.heartbeat.syn
+func MonitorHeartbeatSyn(appId, privateKey, signType, bizContent string) (rsp *MonitorHeartbeatSynResponse, err error) {
+	var bs []byte
+	bm := make(gopay.BodyMap)
+	bm.Set("biz_content", bizContent)
+	bm.Set("app_id", appId)
+	bm.Set("method", "monitor.heartbeat.syn")
+	bm.Set("format", "JSON")
+	bm.Set("charset", "utf-8")
+	if signType == gopay.NULL {
+		bm.Set("sign_type", "RSA2")
+	} else {
+		bm.Set("sign_type", signType)
+	}
+	bm.Set("timestamp", time.Now().Format(gopay.TimeLayout))
+	bm.Set("version", "1.0")
+
+	pKey := FormatPrivateKey(privateKey)
+	sign, err := getRsaSign(bm, bm.Get("sign_type"), pKey)
+	if err != nil {
+		return nil, err
+	}
+	bm.Set("sign", sign)
+
+	_, bs, errs := gopay.NewHttpClient().Type(gopay.TypeForm).Post(baseUrlUtf8).SendString(FormatURLParam(bm)).EndBytes()
+	if len(errs) > 0 {
+		return nil, errs[0]
+	}
+	fmt.Println("bsbsbs:", string(bs))
+	rsp = new(MonitorHeartbeatSynResponse)
+	if err = json.Unmarshal(bs, rsp); err != nil {
+		return nil, err
+	}
+	return rsp, nil
+}

+ 19 - 0
alipay/service_api_test.go

@@ -0,0 +1,19 @@
+package alipay
+
+import (
+	"fmt"
+	"testing"
+)
+
+func TestMonitorHeartbeatSyn(t *testing.T) {
+	appid := "2016091200494382"
+	privateKey := "MIIEogIBAAKCAQEAy+CRzKw4krA2RzCDTqg5KJg92XkOY0RN3pW4sYInPqnGtHV7YDHu5nMuxY6un+dLfo91OFOEg+RI+WTOPoM4xJtsOaJwQ1lpjycoeLq1OyetGW5Q8wO+iLWJASaMQM/t/aXR/JHaguycJyqlHSlxANvKKs/tOHx9AhW3LqumaCwz71CDF/+70scYuZG/7wxSjmrbRBswxd1Sz9KHdcdjqT8pmieyPqnM24EKBexHDmQ0ySXvLJJy6eu1dJsPIz+ivX6HEfDXmSmJ71AZVqZyCI1MhK813R5E7XCv5NOtskTe3y8uiIhgGpZSdB77DOyPLcmVayzFVLAQ3AOBDmsY6wIDAQABAoIBAHjsNq31zAw9FcR9orQJlPVd7vlJEt6Pybvmg8hNESfanO+16rpwg2kOEkS8zxgqoJ1tSzJgXu23fgzl3Go5fHcoVDWPAhUAOFre9+M7onh2nPXDd6Hbq6v8OEmFapSaf2b9biHnBHq5Chk08v/r74l501w3PVVOiPqulJrK1oVb+0/YmCvVFpGatBcNaefKUEcA+vekWPL7Yl46k6XeUvRfTwomCD6jpYLUhsAKqZiQJhMGoaLglZvkokQMF/4G78K7FbbVLMM1+JDh8zJ/DDVdY2vHREUcCGhl4mCVQtkzIbpxG++vFg7/g/fDI+PquG22hFILTDdtt2g2fV/4wmkCgYEA6goRQYSiM03y8Tt/M4u1Mm7OWYCksqAsU7rzQllHekIN3WjD41Xrjv6uklsX3sTG1syo7Jr9PGE1xQgjDEIyO8h/3lDQyLyycYnyUPGNNMX8ZjmGwcM51DQ/QfIrY/CXjnnW+MVpmNclAva3L33KXCWjw20VsROV1EA8LCL94BUCgYEA3wH4ANpzo7NqXf+2WlPPMuyRrF0QPIRGlFBNtaKFy0mvoclkREPmK7+N4NIGtMf5JNODS5HkFRgmU4YNdupA2I8lIYpD+TsIobZxGUKUkYzRZYZ1m1ttL69YYvCVz9Xosw/VoQ+RrW0scS5yUKqFMIUOV2R/Imi//c5TdKx6VP8CgYAnJ1ADugC4vI2sNdvt7618pnT3HEJxb8J6r4gKzYzbszlGlURQQAuMfKcP7RVtO1ZYkRyhmLxM4aZxNA9I+boVrlFWDAchzg+8VuunBwIslgLHx0/4EoUWLzd1/OGtco6oU1HXhI9J9pRGjqfO1iiIifN/ujwqx7AFNknayG/YkQKBgD6yNgA/ak12rovYzXKdp14Axn+39k2dPp6J6R8MnyLlB3yruwW6NSbNhtzTD1GZ+wCQepQvYvlPPc8zm+t3tl1r+Rtx3ORf5XBZc3iPkGdPOLubTssrrAnA+U9vph61W+OjqwLJ9sHUNK9pSHhHSIS4k6ycM2YAHyIC9NGTgB0PAoGAJjwd1DgMaQldtWnuXjvohPOo8cQudxXYcs6zVRbx6vtjKe2v7e+eK1SSVrR5qFV9AqxDfGwq8THenRa0LC3vNNplqostuehLhkWCKE7Y75vXMR7N6KU1kdoVWgN4BhXSwuRxmHMQfSY7q3HG3rDGz7mzXo1FVMr/uE4iDGm0IXY="
+	bizContent := "{任意值}"
+
+	rsp, err := MonitorHeartbeatSyn(appid, privateKey, "RSA2", bizContent)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("rsp.Response:", *rsp.Response)
+}

+ 3 - 2
release_note.txt

@@ -1,7 +1,8 @@
 版本号:Release 1.5.4
-发布时间:2020/02/29 13:32
+发布时间:2020/02/29 14:32
 修改记录:
-   (1) 支付宝:新增Client方法:client.UserInfoAuth(),用户登陆授权。(方法未测试通过,待有条件的同学测试一下吧)
+   (1) 支付宝:新增Client方法:client.UserInfoAuth(),用户登陆授权。(方法未测试通过,待有测试条件的同学测试一下吧)
+   (2) 支付宝:新增公共方法:gopay.MonitorHeartbeatSyn(),验签接口。(方法未测试通过,待有测试条件的同学测试一下吧)
 
 版本号:Release 1.5.3
 发布时间:2020/02/19 11:32