Преглед изворни кода

Merge pull request #29 from iGoogle-ink/alipay/feature

v1.5.4
Jerry пре 6 година
родитељ
комит
74b44ea0e8
8 измењених фајлова са 187 додато и 18 уклоњено
  1. 27 0
      alipay/client.go
  2. 18 3
      alipay/client_test.go
  3. 27 0
      alipay/model.go
  4. 54 14
      alipay/service_api.go
  5. 19 0
      alipay/service_api_test.go
  6. 1 1
      constant.go
  7. 35 0
      examples/alipay/alipay_UserInfoAuth.go
  8. 6 0
      release_note.txt

+ 27 - 0
alipay/client.go

@@ -583,6 +583,33 @@ func (a *Client) UserCertifyOpenQuery(bm gopay.BodyMap) (aliRsp *UserCertifyOpen
 	return aliRsp, nil
 }
 
+// alipay.user.info.auth(用户登陆授权)
+//    文档地址:https://docs.open.alipay.com/api_9/alipay.user.info.auth
+func (a *Client) UserInfoAuth(bm gopay.BodyMap) (aliRsp *UserInfoAuthResponse, err error) {
+	err = bm.CheckEmptyError("scopes", "state")
+	if err != nil {
+		return nil, err
+	}
+
+	var bs []byte
+	if bs, err = a.doAliPay(bm, "alipay.user.info.auth"); err != nil {
+		return nil, err
+	}
+	if strings.Contains(string(bs), "<head>") {
+		return nil, errors.New(string(bs))
+	}
+	aliRsp = new(UserInfoAuthResponse)
+	if err = json.Unmarshal(bs, aliRsp); err != nil {
+		return nil, err
+	}
+	if aliRsp.Response != nil && aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
+		return nil, fmt.Errorf(`{"code":"%s","msg":"%s","sub_code":"%s","sub_msg":"%s"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
+	}
+	aliRsp.SignData = getSignData(bs)
+	return aliRsp, nil
+}
+
 // 向支付宝发送请求
 func (a *Client) doAliPay(bm gopay.BodyMap, method string) (bs []byte, err error) {
 	var (

+ 18 - 3
alipay/client_test.go

@@ -24,9 +24,9 @@ func TestMain(m *testing.M) {
 	client = NewClient(appid, privateKey, false)
 	// 配置公共参数
 	client.SetCharset("utf-8").
-		SetSignType("RSA2").
-		// SetReturnUrl("https://www.gopay.ink").
-		SetNotifyUrl("https://www.gopay.ink")
+		SetSignType("RSA2")
+	// SetReturnUrl("https://www.gopay.ink").
+	// SetNotifyUrl("https://www.gopay.ink")
 
 	// err := client.SetCertSnByPath("cert/appCertPublicKey.crt", "cert/alipayRootCert.crt", "cert/alipayCertPublicKey_RSA2.crt")
 	// if err != nil {
@@ -368,7 +368,22 @@ func TestClient_UserCertifyOpenQuery(t *testing.T) {
 	}
 	fmt.Println("aliRsp:", *aliRsp)
 	fmt.Println("aliRsp.Response.Passed:", aliRsp.Response.Passed)
+}
 
+func TestClient_UserInfoAuth(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	// 接口权限值,目前只支持auth_user和auth_base两个值。具体说明看文档介绍
+	bm.Set("scopes", []string{"auth_user"})
+	bm.Set("state", "init")
+
+	// 发起请求
+	aliRsp, err := client.UserInfoAuth(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
 }
 
 func TestClient_UserInfoShare(t *testing.T) {

+ 27 - 0
alipay/model.go

@@ -615,3 +615,30 @@ type userCertifyOpenQueryResponse struct {
 	IdentityInfo string   `json:"identity_info,omitempty"`
 	MaterialInfo string   `json:"material_info,omitempty"`
 }
+
+// ===================================================
+type UserInfoAuthResponse 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"`
+	} `json:"alipay_user_info_auth_response,omitempty"`
+	AlipayCertSn string `json:"alipay_cert_sn,omitempty"`
+	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)
+}

+ 1 - 1
constant.go

@@ -7,5 +7,5 @@ const (
 	SUCCESS    = "SUCCESS"
 	FAIL       = "FAIL"
 	OK         = "OK"
-	Version    = "1.5.3"
+	Version    = "1.5.4"
 )

+ 35 - 0
examples/alipay/alipay_UserInfoAuth.go

@@ -0,0 +1,35 @@
+package alipay
+
+import (
+	"fmt"
+
+	"github.com/iGoogle-ink/gopay"
+	"github.com/iGoogle-ink/gopay/alipay"
+)
+
+func UserInfoAuth() {
+	//aliPayPublicKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wn1sU/8Q0rYLlZ6sq3enrPZw2ptp6FecHR2bBFLjJ+sKzepROd0bKddgj+Mr1ffr3Ej78mLdWV8IzLfpXUi945DkrQcOUWLY0MHhYVG2jSs/qzFfpzmtut2Cl2TozYpE84zom9ei06u2AXLMBkU6VpznZl+R4qIgnUfByt3Ix5b3h4Cl6gzXMAB1hJrrrCkq+WvWb3Fy0vmk/DUbJEz8i8mQPff2gsHBE1nMPvHVAMw1GMk9ImB4PxucVek4ZbUzVqxZXphaAgUXFK2FSFU+Q+q1SPvHbUsjtIyL+cLA6H/6ybFF9Ffp27Y14AHPw29+243/SpMisbGcj2KD+evBwIDAQAB"
+	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="
+	//初始化支付宝客户端
+	//    appId:应用ID
+	//    privateKey:应用秘钥
+	//    isProd:是否是正式环境
+	client := alipay.NewClient("2016091200494382", privateKey, false)
+	//配置公共参数
+	client.SetCharset("utf-8").
+		SetSignType("RSA2")
+
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	// 接口权限值,目前只支持auth_user和auth_base两个值。具体说明看文档介绍
+	bm.Set("scopes", []string{"auth_user"})
+	bm.Set("state", "init")
+
+	// 发起请求
+	aliRsp, err := client.UserInfoAuth(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}

+ 6 - 0
release_note.txt

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