Jerry 6 éve
szülő
commit
ac0c0097a6

+ 14 - 4
alipay/alipay_client.go

@@ -14,6 +14,7 @@ import (
 type Client struct {
 	AppId              string
 	PrivateKey         string
+	LocationName       string
 	AppCertSN          string
 	AliPayPublicCertSN string
 	AliPayRootCertSN   string
@@ -24,6 +25,7 @@ type Client struct {
 	AppAuthToken       string
 	AuthToken          string
 	IsProd             bool
+	location           *time.Location
 	mu                 sync.RWMutex
 }
 
@@ -522,8 +524,8 @@ func (a *Client) UserCertifyOpenQuery(body gopay.BodyMap) (aliRsp *UserCertifyOp
 // 向支付宝发送请求
 func (a *Client) doAliPay(body gopay.BodyMap, method string) (bs []byte, err error) {
 	var (
-		bodyStr, sign, url string
-		bodyBs             []byte
+		bodyStr, url string
+		bodyBs       []byte
 	)
 	if body != nil {
 		if bodyBs, err = json.Marshal(body); err != nil {
@@ -564,7 +566,14 @@ func (a *Client) doAliPay(body gopay.BodyMap, method string) (bs []byte, err err
 		pubBody.Set("sign_type", a.SignType)
 		a.mu.RUnlock()
 	}
-	pubBody.Set("timestamp", time.Now().Format(gopay.TimeLayout))
+	if a.LocationName != gopay.NULL && a.location != nil {
+		a.mu.RLock()
+		pubBody.Set("timestamp", time.Now().In(a.location).Format(gopay.TimeLayout))
+		a.mu.RUnlock()
+	} else {
+		location, _ := time.LoadLocation(locationShanghai)
+		pubBody.Set("timestamp", time.Now().In(location).Format(gopay.TimeLayout))
+	}
 	pubBody.Set("version", "1.0")
 	if a.NotifyUrl != gopay.NULL {
 		a.mu.RLock()
@@ -584,7 +593,8 @@ func (a *Client) doAliPay(body gopay.BodyMap, method string) (bs []byte, err err
 	if bodyStr != gopay.NULL {
 		pubBody.Set("biz_content", bodyStr)
 	}
-	if sign, err = getRsaSign(pubBody, pubBody.Get("sign_type"), FormatPrivateKey(a.PrivateKey)); err != nil {
+	sign, err := getRsaSign(pubBody, pubBody.Get("sign_type"), FormatPrivateKey(a.PrivateKey))
+	if err != nil {
 		return
 	}
 	pubBody.Set("sign", sign)

+ 2 - 0
alipay/alipay_model.go

@@ -6,6 +6,8 @@ const (
 	zfbSandboxBaseUrl     = "https://openapi.alipaydev.com/gateway.do"
 	zfbBaseUrlUtf8        = "https://openapi.alipay.com/gateway.do?charset=utf-8"
 	zfbSandboxBaseUrlUtf8 = "https://openapi.alipaydev.com/gateway.do?charset=utf-8"
+
+	locationShanghai = "Asia/Shanghai"
 )
 
 type NotifyRequest struct {

+ 15 - 0
alipay/alipay_params.go

@@ -13,6 +13,7 @@ import (
 	"fmt"
 	"hash"
 	"net/url"
+	"time"
 
 	"github.com/iGoogle-ink/gopay"
 )
@@ -39,6 +40,20 @@ type OpenApiRoyaltyDetailInfoPojo struct {
 	Desc         string `json:"desc,omitempty"`
 }
 
+// 设置 时区,默认或者解析出错,均默认:Asia/Shanghai
+func (a *Client) SetLocation(name string) (client *Client) {
+	location, err := time.LoadLocation(name)
+	if err != nil {
+		name = locationShanghai
+		location, _ = time.LoadLocation(name)
+	}
+	a.mu.Lock()
+	a.LocationName = name
+	a.location = location
+	a.mu.Unlock()
+	return a
+}
+
 // 设置 应用公钥证书SN
 //    appCertSN:应用公钥证书SN,通过 alipay.GetCertSN() 获取
 func (a *Client) SetAppCertSN(appCertSN string) (client *Client) {

+ 16 - 23
alipay/alipay_service_api.go

@@ -293,23 +293,19 @@ func FormatPublicKey(publicKey string) (pKey string) {
 //    返回 sn:证书序列号(app_cert_sn、alipay_cert_sn)
 //    返回 err:error 信息
 func GetCertSN(certPath string) (sn string, err error) {
-	var (
-		certData           []byte
-		certs              []*x509.Certificate
-		name, serialNumber string
-		h                  hash.Hash
-	)
-	certData, err = ioutil.ReadFile(certPath)
+	certData, err := ioutil.ReadFile(certPath)
 	if err != nil {
 		return gopay.NULL, err
 	}
+
 	if block, _ := pem.Decode(certData); block != nil {
-		if certs, err = x509.ParseCertificates(block.Bytes); err != nil {
+		cert, err := x509.ParseCertificate(block.Bytes)
+		if err != nil {
 			return gopay.NULL, err
 		}
-		name = certs[0].Issuer.String()
-		serialNumber = certs[0].SerialNumber.String()
-		h = md5.New()
+		name := cert.Issuer.String()
+		serialNumber := cert.SerialNumber.String()
+		h := md5.New()
 		h.Write([]byte(name))
 		h.Write([]byte(serialNumber))
 		if sn == "" {
@@ -330,29 +326,26 @@ func GetCertSN(certPath string) (sn string, err error) {
 //    返回 sn:证书序列号(alipay_root_cert_sn)
 //    返回 err:error 信息
 func GetRootCertSN(rootCertPath string) (sn string, err error) {
-	var (
-		certData           []byte
-		cert               *x509.Certificate
-		name, serialNumber string
-		certEnd            = `-----END CERTIFICATE-----`
-		h                  hash.Hash
-	)
-	certData, err = ioutil.ReadFile(rootCertPath)
+	var certEnd = `-----END CERTIFICATE-----`
+
+	certData, err := ioutil.ReadFile(rootCertPath)
 	if err != nil {
 		return gopay.NULL, err
 	}
+
 	pems := strings.Split(string(certData), certEnd)
 	for _, c := range pems {
 		if block, _ := pem.Decode([]byte(c + certEnd)); block != nil {
-			if cert, err = x509.ParseCertificate(block.Bytes); err != nil {
+			cert, err := x509.ParseCertificate(block.Bytes)
+			if err != nil {
 				continue
 			}
 			if !allowSignatureAlgorithm[cert.SignatureAlgorithm.String()] {
 				continue
 			}
-			name = cert.Issuer.String()
-			serialNumber = cert.SerialNumber.String()
-			h = md5.New()
+			name := cert.Issuer.String()
+			serialNumber := cert.SerialNumber.String()
+			h := md5.New()
 			h.Write([]byte(name))
 			h.Write([]byte(serialNumber))
 			if sn == gopay.NULL {

+ 1 - 0
release_note.txt

@@ -4,6 +4,7 @@
    (1) 模块分包大调整
    (2) 支付宝:修改公共API方法:alipay.GetCertSN(),不再支持支付宝根证书的SN获取
    (3) 支付宝:新增公共API方法:alipay.GetRootCertSN(),获取root证书序列号SN
+   (4) 支付宝:新增Client方法:alipay.SetLocation(),设置时区,不设置或出错均为默认 Asia/Shanghai
 
 版本号:Release 1.4.6
 发布时间:2019/12/09 18:37

+ 13 - 15
wechat/wechat_client.go

@@ -292,26 +292,24 @@ func (w *Client) EntrustPublic(body gopay.BodyMap) (bs []byte, err error) {
 
 // 向微信发送请求
 func (w *Client) doWeChat(body gopay.BodyMap, path string, tlsConfig ...*tls.Config) (bs []byte, err error) {
+	var url = wxBaseUrlCh + path
 	body.Set("appid", w.AppId)
 	body.Set("mch_id", w.MchId)
-	var (
-		sign string
-		url  = wxBaseUrlCh + path
-	)
-	if body.Get("sign") != gopay.NULL {
-		goto GoRequest
-	}
-	if !w.IsProd {
-		body.Set("sign_type", SignType_MD5)
-		if sign, err = getSignBoxSign(w.MchId, w.ApiKey, body); err != nil {
-			return nil, err
+
+	if body.Get("sign") == gopay.NULL {
+		var sign string
+		if !w.IsProd {
+			body.Set("sign_type", SignType_MD5)
+			sign, err = getSignBoxSign(w.MchId, w.ApiKey, body)
+			if err != nil {
+				return nil, err
+			}
+		} else {
+			sign = getReleaseSign(w.ApiKey, body.Get("sign_type"), body)
 		}
-	} else {
-		sign = getReleaseSign(w.ApiKey, body.Get("sign_type"), body)
+		body.Set("sign", sign)
 	}
-	body.Set("sign", sign)
 
-GoRequest:
 	httpClient := gopay.NewHttpClient()
 	if w.IsProd && tlsConfig != nil {
 		httpClient.SetTLSConfig(tlsConfig[0])