Jerry 6 yıl önce
ebeveyn
işleme
2ab6330a54
2 değiştirilmiş dosya ile 42 ekleme ve 33 silme
  1. 23 8
      alipay_client.go
  2. 19 25
      alipay_params.go

+ 23 - 8
alipay_client.go

@@ -2,6 +2,7 @@ package gopay
 
 import (
 	"crypto/tls"
+	"encoding/json"
 	"log"
 	"time"
 )
@@ -127,15 +128,15 @@ https://openapi.alipay.com/gateway.do?timestamp=2013-01-01 08:08:08&method=alipa
 */
 //向支付宝发送请求
 func (this *aliPayClient) doAliPay(body BodyMap, method string, tlsConfig ...*tls.Config) (bytes []byte, err error) {
-	//===============获取签名===================
-	timeStamp := time.Now().Format(TimeLayout)
-	pKey := FormatPrivateKey(this.privateKey)
-	sign, err := getRsaSign(this.AppId, this.SignType, this.Charset, method, timeStamp, pKey, body)
+	//===============转换body参数===================
+	bodyStr, err := json.Marshal(body)
 	if err != nil {
+		log.Println("json.Marshal:", err)
 		return nil, err
 	}
-	log.Println("rsaSign:", sign)
+	//log.Println("bodyStr:", string(bodyStr))
 	//===============生成参数===================
+	timeStamp := time.Now().Format(TimeLayout)
 	b := new(aliPayPublicBody)
 	b.AppId = this.AppId
 	b.Method = method
@@ -146,9 +147,16 @@ func (this *aliPayClient) doAliPay(body BodyMap, method string, tlsConfig ...*tl
 	b.Timestamp = timeStamp
 	b.Version = "1.0"
 	b.NotifyUrl = this.NotifyUrl
-	b.BizContent = body
-	b.Sign = sign
+	b.BizContent = string(bodyStr)
+	//===============获取签名===================
 
+	pKey := FormatPrivateKey(this.privateKey)
+	sign, err := getRsaSign(b, pKey)
+	if err != nil {
+		return nil, err
+	}
+	log.Println("rsaSign:", sign)
+	b.Sign = sign
 	//===============发起请求===================
 	agent := HttpAgent()
 	if !this.isProd {
@@ -158,7 +166,14 @@ func (this *aliPayClient) doAliPay(body BodyMap, method string, tlsConfig ...*tl
 		//正式环境
 		agent.Post(zfb_base_url)
 	}
-	_, bytes, errs := agent.EndBytes()
+	//log.Println("HttpBody:", *b)
+	_, bytes, errs := agent.
+		Set("app_id", b.AppId).
+		Set("", b.Method).
+		Set("", b.AppId).
+		Set("", b.AppId).
+		Set("biz_content", b.BizContent).
+		EndBytes()
 	if len(errs) > 0 {
 		return nil, errs[0]
 	}

+ 19 - 25
alipay_params.go

@@ -14,7 +14,6 @@ import (
 	"crypto/sha256"
 	"crypto/x509"
 	"encoding/base64"
-	"encoding/json"
 	"encoding/pem"
 	"errors"
 	"hash"
@@ -22,17 +21,17 @@ import (
 )
 
 type aliPayPublicBody struct {
-	AppId      string  `json:"app_id"`      //支付宝分配给开发者的应用ID
-	Method     string  `json:"method"`      //接口名称
-	Format     string  `json:"format"`      //仅支持 JSON
-	ReturnUrl  string  `json:"return_url"`  //HTTP/HTTPS开头字符串
-	Charset    string  `json:"charset"`     //请求使用的编码格式,如utf-8,gbk,gb2312等,推荐使用 utf-8
-	SignType   string  `json:"sign_type"`   //商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用 RSA2
-	Sign       string  `json:"sign"`        //商户请求参数的签名串
-	Timestamp  string  `json:"timestamp"`   //发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
-	Version    string  `json:"version"`     //调用的接口版本,固定为:1.0
-	NotifyUrl  string  `json:"notify_url"`  //支付宝服务器主动通知商户服务器里指定的页面http/https路径。
-	BizContent BodyMap `json:"biz_content"` //业务请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档
+	AppId      string `json:"app_id"`      //支付宝分配给开发者的应用ID
+	Method     string `json:"method"`      //接口名称
+	Format     string `json:"format"`      //仅支持 JSON
+	ReturnUrl  string `json:"return_url"`  //HTTP/HTTPS开头字符串
+	Charset    string `json:"charset"`     //请求使用的编码格式,如utf-8,gbk,gb2312等,推荐使用 utf-8
+	SignType   string `json:"sign_type"`   //商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用 RSA2
+	Sign       string `json:"sign"`        //商户请求参数的签名串
+	Timestamp  string `json:"timestamp"`   //发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
+	Version    string `json:"version"`     //调用的接口版本,固定为:1.0
+	NotifyUrl  string `json:"notify_url"`  //支付宝服务器主动通知商户服务器里指定的页面http/https路径。
+	BizContent string `json:"biz_content"` //业务请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档
 }
 
 //设置支付后的ReturnUrl
@@ -68,7 +67,7 @@ func (this *aliPayClient) SetSignType(signType string) (client *aliPayClient) {
 }
 
 //app_id=2014072300007148&biz_content={"button"}&charset=GBK&method=alipay.mobile.public.menu.add&sign_type=RSA2&timestamp=2014-07-24 03:07:50&version=1.0
-func getRsaSign(appId, signType, charset, method, timestamp, privateKey string, bodyMap BodyMap) (sign string, err error) {
+func getRsaSign(body *aliPayPublicBody, privateKey string) (sign string, err error) {
 	var (
 		h              hash.Hash
 		key            *rsa.PrivateKey
@@ -76,12 +75,7 @@ func getRsaSign(appId, signType, charset, method, timestamp, privateKey string,
 		bodyStr        []byte
 		encryptedBytes []byte
 	)
-	bodyStr, err = json.Marshal(bodyMap)
-	if err != nil {
-		log.Println("json.Marshal:", err)
-		return "", err
-	}
-	//log.Println("privateKey:", privateKey)
+
 	block, _ := pem.Decode([]byte(privateKey))
 	if block == nil {
 		return "", errors.New("秘钥错误")
@@ -93,7 +87,7 @@ func getRsaSign(appId, signType, charset, method, timestamp, privateKey string,
 		return "", err
 	}
 
-	switch signType {
+	switch body.SignType {
 	case "RSA":
 		h = sha1.New()
 	case "RSA2":
@@ -101,17 +95,17 @@ func getRsaSign(appId, signType, charset, method, timestamp, privateKey string,
 	}
 	buffer = new(bytes.Buffer)
 	buffer.WriteString("app_id=")
-	buffer.WriteString(appId)
+	buffer.WriteString(body.AppId)
 	buffer.WriteString("&biz_content=")
 	buffer.WriteString(string(bodyStr))
 	buffer.WriteString("&charset=")
-	buffer.WriteString(charset)
+	buffer.WriteString(body.Charset)
 	buffer.WriteString("&method=")
-	buffer.WriteString(method)
+	buffer.WriteString(body.Method)
 	buffer.WriteString("&sign_type=")
-	buffer.WriteString(signType)
+	buffer.WriteString(body.SignType)
 	buffer.WriteString("&timestamp=")
-	buffer.WriteString(timestamp)
+	buffer.WriteString(body.Timestamp)
 	buffer.WriteString("&version=1.0")
 	log.Println("参数拼接:", buffer.String())