Jerry před 6 roky
rodič
revize
6b0261d100
7 změnil soubory, kde provedl 68 přidání a 66 odebrání
  1. 3 25
      alipay_params.go
  2. 7 6
      alipay_service_api.go
  3. 40 0
      util.go
  4. 6 0
      wechat_client.go
  5. 8 28
      wechat_params.go
  6. 0 2
      wechat_rsp.go
  7. 4 5
      wechat_service_api.go

+ 3 - 25
alipay_params.go

@@ -1,7 +1,6 @@
 package gopay
 
 import (
-	"bytes"
 	"crypto"
 	"crypto/rand"
 	"crypto/rsa"
@@ -13,7 +12,6 @@ import (
 	"errors"
 	"hash"
 	"net/url"
-	"sort"
 )
 
 //	AppId      string `json:"app_id"`      //支付宝分配给开发者的应用ID
@@ -83,7 +81,7 @@ func (this *aliPayClient) SetAuthToken(authToken string) (client *aliPayClient)
 }
 
 //获取参数签名
-func getRsaSign(body BodyMap, signType, privateKey string) (sign string, err error) {
+func getRsaSign(bm BodyMap, signType, privateKey string) (sign string, err error) {
 	var (
 		h              hash.Hash
 		key            *rsa.PrivateKey
@@ -115,7 +113,8 @@ func getRsaSign(body BodyMap, signType, privateKey string) (sign string, err err
 		hashs = crypto.SHA256
 	}
 
-	signStr = sortAliPaySignParams(body)
+	//signStr = sortAliPaySignParams(bm)
+	signStr = bm.EncodeAliPaySignParams()
 	//fmt.Println("原始字符串:", signStr)
 	_, err = h.Write([]byte(signStr))
 	if err != nil {
@@ -130,27 +129,6 @@ func getRsaSign(body BodyMap, signType, privateKey string) (sign string, err err
 	return secretData, nil
 }
 
-//获取根据Key排序后的请求参数字符串
-func sortAliPaySignParams(body BodyMap) string {
-	keyList := make([]string, 0)
-	for k := range body {
-		keyList = append(keyList, k)
-	}
-	sort.Strings(keyList)
-	//fmt.Println(keyList)
-	buffer := new(bytes.Buffer)
-	for _, k := range keyList {
-		buffer.WriteString(k)
-		buffer.WriteString("=")
-		buffer.WriteString(body.Get(k))
-		buffer.WriteString("&")
-	}
-	s := buffer.String()
-	i := buffer.Len()
-	//fmt.Println("排序后参数:", s[:i-1])
-	return s[:i-1]
-}
-
 //格式化请求URL参数
 func FormatAliPayURLParam(body BodyMap) (urlParam string) {
 	v := url.Values{}

+ 7 - 6
alipay_service_api.go

@@ -1,7 +1,6 @@
 package gopay
 
 import (
-	"bytes"
 	"crypto"
 	"crypto/aes"
 	"crypto/cipher"
@@ -16,6 +15,7 @@ import (
 	"log"
 	"net/http"
 	"reflect"
+	"strings"
 	"time"
 )
 
@@ -171,7 +171,8 @@ func VerifyAliPayResultSign(aliPayPublicKey string, notifyReq *AliPayNotifyReque
 	}
 
 	pKey := FormatAliPayPublicKey(aliPayPublicKey)
-	signData := sortAliPaySignParams(newBody)
+	//signData := sortAliPaySignParams(newBody)
+	signData := newBody.EncodeAliPaySignParams()
 
 	//log.Println("签名字符串:", signData)
 	err = verifyAliPaySign(signData, notifyReq.Sign, notifyReq.SignType, pKey)
@@ -199,7 +200,7 @@ func jsonToString(v interface{}) (str string) {
 
 //格式化应用秘钥
 func FormatPrivateKey(privateKey string) (pKey string) {
-	buffer := new(bytes.Buffer)
+	var buffer strings.Builder
 	buffer.WriteString("-----BEGIN RSA PRIVATE KEY-----\n")
 
 	rawLen := 64
@@ -218,7 +219,7 @@ func FormatPrivateKey(privateKey string) (pKey string) {
 		} else {
 			buffer.WriteString(privateKey[start:end])
 		}
-		buffer.WriteString("\n")
+		buffer.WriteByte('\n')
 		start += rawLen
 		end = start + rawLen
 	}
@@ -229,7 +230,7 @@ func FormatPrivateKey(privateKey string) (pKey string) {
 
 //格式化支付宝公钥
 func FormatAliPayPublicKey(publicKey string) (pKey string) {
-	buffer := new(bytes.Buffer)
+	var buffer strings.Builder
 	buffer.WriteString("-----BEGIN PUBLIC KEY-----\n")
 
 	rawLen := 64
@@ -248,7 +249,7 @@ func FormatAliPayPublicKey(publicKey string) (pKey string) {
 		} else {
 			buffer.WriteString(publicKey[start:end])
 		}
-		buffer.WriteString("\n")
+		buffer.WriteByte('\n')
 		start += rawLen
 		end = start + rawLen
 	}

+ 40 - 0
util.go

@@ -8,6 +8,7 @@ import (
 	"io"
 	"math/rand"
 	"reflect"
+	"sort"
 	"strconv"
 	"strings"
 	"time"
@@ -121,6 +122,45 @@ func (bm *BodyMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 	return nil
 }
 
+// ("bar=baz&foo=quux") sorted by key.
+func (bm BodyMap) EncodeWeChatSignParams(apiKey string) string {
+	var buf strings.Builder
+	keyList := make([]string, 0, len(bm))
+	for k := range bm {
+		keyList = append(keyList, k)
+	}
+	sort.Strings(keyList)
+	for _, k := range keyList {
+		buf.WriteString(k)
+		buf.WriteByte('=')
+		buf.WriteString(bm.Get(k))
+		buf.WriteByte('&')
+	}
+	buf.WriteString("key")
+	buf.WriteByte('=')
+	buf.WriteString(apiKey)
+	return buf.String()
+}
+
+// ("bar=baz&foo=quux") sorted by key.
+func (bm BodyMap) EncodeAliPaySignParams() string {
+	var buf strings.Builder
+	keyList := make([]string, 0, len(bm))
+	for k := range bm {
+		keyList = append(keyList, k)
+	}
+	sort.Strings(keyList)
+	for _, k := range keyList {
+		buf.WriteString(k)
+		buf.WriteByte('=')
+		buf.WriteString(bm.Get(k))
+		buf.WriteByte('&')
+	}
+	s := buf.String()
+	i := buf.Len()
+	return s[:i-1]
+}
+
 //HttpAgent
 func HttpAgent() (agent *gorequest.SuperAgent) {
 	agent = gorequest.New()

+ 6 - 0
wechat_client.go

@@ -4,8 +4,10 @@ import (
 	"crypto/tls"
 	"crypto/x509"
 	"encoding/xml"
+	"errors"
 	"fmt"
 	"io/ioutil"
+	"strings"
 )
 
 type weChatClient struct {
@@ -434,5 +436,9 @@ func (this *weChatClient) doWeChat(body BodyMap, path string, tlsConfig ...*tls.
 	if res.StatusCode != 200 {
 		return nil, fmt.Errorf("HTTP Request Error, StatusCode = %v", res.StatusCode)
 	}
+	if strings.Contains(string(bytes), "HTML") {
+		return nil, errors.New(string(bytes))
+	}
+	//fmt.Println("bytes:", string(bytes))
 	return bytes, nil
 }

+ 8 - 28
wechat_params.go

@@ -1,14 +1,13 @@
 package gopay
 
 import (
-	"bytes"
 	"crypto/hmac"
 	"crypto/md5"
 	"crypto/sha256"
 	"encoding/hex"
 	"encoding/xml"
 	"errors"
-	"sort"
+	"fmt"
 	"strings"
 )
 
@@ -34,9 +33,9 @@ func (this *weChatClient) SetCountry(country Country) (client *weChatClient) {
 }
 
 //本地通过支付参数计算Sign值
-func getLocalSign(apiKey string, signType string, body BodyMap) (sign string) {
-	signStr := sortWeChatSignParams(apiKey, body)
-	//fmt.Println("signStr:", signStr)
+func getLocalSign(apiKey string, signType string, bm BodyMap) (sign string) {
+	signStr := bm.EncodeWeChatSignParams(apiKey)
+	fmt.Println("signStr:", signStr)
 	var hashSign []byte
 	if signType == SignType_HMAC_SHA256 {
 		hash := hmac.New(sha256.New, []byte(apiKey))
@@ -51,25 +50,6 @@ func getLocalSign(apiKey string, signType string, body BodyMap) (sign string) {
 	return
 }
 
-//获取根据Key排序后的请求参数字符串
-func sortWeChatSignParams(apiKey string, body BodyMap) string {
-	keyList := make([]string, 0)
-	for k := range body {
-		keyList = append(keyList, k)
-	}
-	sort.Strings(keyList)
-	buffer := new(bytes.Buffer)
-	for _, k := range keyList {
-		buffer.WriteString(k)
-		buffer.WriteString("=")
-		buffer.WriteString(body.Get(k))
-		buffer.WriteString("&")
-	}
-	buffer.WriteString("key=")
-	buffer.WriteString(apiKey)
-	return buffer.String()
-}
-
 //从微信提供的接口获取:SandboxSignKey
 func getSanBoxSign(mchId, nonceStr, apiKey, signType string) (key string, err error) {
 	body := make(BodyMap)
@@ -108,24 +88,24 @@ func getSanBoxSignKey(mchId, nonceStr, sign string) (key string, err error) {
 		return null, err
 	}
 	if keyResponse.ReturnCode == "FAIL" {
-		return null, errors.New(keyResponse.Retmsg)
+		return null, errors.New(keyResponse.ReturnMsg)
 	}
 	return keyResponse.SandboxSignkey, nil
 }
 
 //生成请求XML的Body体
 func generateXml(bm BodyMap) (reqXml string) {
-	buffer := new(bytes.Buffer)
+	var buffer strings.Builder
 	buffer.WriteString("<xml>")
 
 	for key := range bm {
-		buffer.WriteString("<")
+		buffer.WriteByte('<')
 		buffer.WriteString(key)
 		buffer.WriteString("><![CDATA[")
 		buffer.WriteString(bm.Get(key))
 		buffer.WriteString("]]></")
 		buffer.WriteString(key)
-		buffer.WriteString(">")
+		buffer.WriteByte('>')
 	}
 	buffer.WriteString("</xml>")
 	reqXml = buffer.String()

+ 0 - 2
wechat_rsp.go

@@ -212,8 +212,6 @@ type WeChatTransfersResponse struct {
 type getSignKeyResponse struct {
 	ReturnCode     string `xml:"return_code,omitempty" json:"return_code,omitempty"`
 	ReturnMsg      string `xml:"return_msg,omitempty" json:"return_msg,omitempty"`
-	Retmsg         string `xml:"retmsg,omitempty" json:"retmsg,omitempty"`
-	Retcode        string `xml:"retcode,omitempty" json:"retcode,omitempty"`
 	MchId          string `xml:"mch_id,omitempty" json:"mch_id,omitempty"`
 	SandboxSignkey string `xml:"sandbox_signkey,omitempty" json:"sandbox_signkey,omitempty"`
 }

+ 4 - 5
wechat_service_api.go

@@ -1,7 +1,6 @@
 package gopay
 
 import (
-	"bytes"
 	"crypto/aes"
 	"crypto/cipher"
 	"crypto/hmac"
@@ -152,7 +151,7 @@ type WeChatNotifyResponse struct {
 
 //返回数据给微信
 func (this *WeChatNotifyResponse) ToXmlString() (xmlStr string) {
-	buffer := new(bytes.Buffer)
+	var buffer strings.Builder
 	buffer.WriteString("<xml><return_code><![CDATA[")
 	buffer.WriteString(this.ReturnCode)
 	buffer.WriteString("]]></return_code>")
@@ -174,7 +173,7 @@ func (this *WeChatNotifyResponse) ToXmlString() (xmlStr string) {
 //
 //    微信小程序支付API:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/payment/wx.requestPayment.html
 func GetMiniPaySign(appId, nonceStr, prepayId, signType, timeStamp, apiKey string) (paySign string) {
-	buffer := new(bytes.Buffer)
+	var buffer strings.Builder
 	buffer.WriteString("appId=")
 	buffer.WriteString(appId)
 
@@ -219,7 +218,7 @@ func GetMiniPaySign(appId, nonceStr, prepayId, signType, timeStamp, apiKey strin
 //
 //    微信内H5支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/external/jsapi.php?chapter=7_7&index=6
 func GetH5PaySign(appId, nonceStr, prepayId, signType, timeStamp, apiKey string) (paySign string) {
-	buffer := new(bytes.Buffer)
+	var buffer strings.Builder
 	buffer.WriteString("appId=")
 	buffer.WriteString(appId)
 
@@ -265,7 +264,7 @@ func GetH5PaySign(appId, nonceStr, prepayId, signType, timeStamp, apiKey string)
 //
 //    APP支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12
 func GetAppPaySign(appid, partnerid, noncestr, prepayid, signType, timestamp, apiKey string) (paySign string) {
-	buffer := new(bytes.Buffer)
+	var buffer strings.Builder
 	buffer.WriteString("appid=")
 	buffer.WriteString(appid)