Jerry hace 6 años
padre
commit
1dea3fdd9c
Se han modificado 8 ficheros con 75 adiciones y 41 borrados
  1. 36 2
      README.md
  2. 9 14
      alipay_client.go
  3. 10 5
      alipay_client_test.go
  4. 4 4
      alipay_params.go
  5. 5 5
      util.go
  6. 6 6
      wechat_client.go
  7. 4 4
      wechat_params.go
  8. 1 1
      wechat_servier_api.go

+ 36 - 2
README.md

@@ -36,7 +36,7 @@
 ## 支付宝支付
 ## 支付宝支付
 
 
 * 手机网站支付:client.AliPayTradeWapPay()
 * 手机网站支付:client.AliPayTradeWapPay()
-* APP支付:client.AliPayTradeAppPay()(未完成)
+* APP支付:client.AliPayTradeAppPay()
 
 
 ## 支付宝公共API
 ## 支付宝公共API
 
 
@@ -368,7 +368,7 @@ fmt.Println("Response:", wxRsp)
 
 
 > 文档说明[手机网站支付-请求参数说明](https://docs.open.alipay.com/203/107090/) 
 > 文档说明[手机网站支付-请求参数说明](https://docs.open.alipay.com/203/107090/) 
 
 
-> 文档说明[手机网站支付接口2.0](https://docs.open.alipay.com/api_1/alipay.trade.wap.pay) 
+> 文档说明[手机网站支付接口2.0](https://docs.open.alipay.com/api_1/alipay.trade.wap.pay/) 
 
 
 ```go
 ```go
 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="
 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="
@@ -398,6 +398,40 @@ if err != nil {
 fmt.Println("payUrl:", payUrl)
 fmt.Println("payUrl:", payUrl)
 ```
 ```
 
 
+### APP支付
+
+* APP支付是通过服务端获取支付参数后,然后通过Android/iOS客户端的SDK调用支付功能
+
+> 文档说明[APP支付-请求参数说明](https://docs.open.alipay.com/204/105465/) 
+
+> 文档说明[APP支付接口2.0](https://docs.open.alipay.com/api_1/alipay.trade.app.pay/) 
+
+```go
+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 := gopay.NewAliPayClient("2016091200494382", privateKey, false)
+//配置公共参数
+client.SetCharset("utf-8").
+	SetSignType("RSA2").
+	SetNotifyUrl("https://www.igoogle.ink")
+//请求参数
+body := make(gopay.BodyMap)
+body.Set("subject", "测试APP支付")
+body.Set("out_trade_no", "GYWX201901301040355706100411")
+body.Set("total_amount", "1.00")
+body.Set("product_code", "QUICK_MSECURITY_PAY")
+//手机APP支付参数请求
+payParam, err := client.AliPayTradeAppPay(body)
+if err != nil {
+	fmt.Println("err:", err)
+	return
+}
+fmt.Println("payParam:", payParam)
+```
+
 ## License
 ## License
 ```
 ```
 Copyright 2019 Jerry
 Copyright 2019 Jerry

+ 9 - 14
alipay_client.go

@@ -2,7 +2,6 @@ package gopay
 
 
 import (
 import (
 	"encoding/json"
 	"encoding/json"
-	"fmt"
 	"github.com/parnurzeal/gorequest"
 	"github.com/parnurzeal/gorequest"
 	"log"
 	"log"
 	"time"
 	"time"
@@ -76,21 +75,14 @@ func (this *aliPayClient) AliPayTradeQuery() {
 }
 }
 
 
 //alipay.trade.app.pay(app支付接口2.0)
 //alipay.trade.app.pay(app支付接口2.0)
-func (this *aliPayClient) AliPayTradeAppPay(body BodyMap) (aRsp *AliPayTradePayAppResponse, err error) {
+func (this *aliPayClient) AliPayTradeAppPay(body BodyMap) (payParam string, err error) {
 	var bytes []byte
 	var bytes []byte
 	bytes, err = this.doAliPay(body, "alipay.trade.app.pay")
 	bytes, err = this.doAliPay(body, "alipay.trade.app.pay")
 	if err != nil {
 	if err != nil {
-		//log.Println("err::", err.Error())
-		return nil, err
-	}
-	fmt.Println("bytes::", string(bytes))
-	rsp := new(AliPayTradePayAppResponse)
-	err = json.Unmarshal(bytes, rsp)
-	if err != nil {
-		log.Println("解析出错:", err)
-		return nil, err
+		return null, err
 	}
 	}
-	return rsp, nil
+	payParam = string(bytes)
+	return payParam, nil
 }
 }
 
 
 //alipay.trade.wap.pay(手机网站支付接口2.0)
 //alipay.trade.wap.pay(手机网站支付接口2.0)
@@ -143,12 +135,12 @@ func (this *aliPayClient) doAliPay(body BodyMap, method string) (bytes []byte, e
 	if this.ReturnUrl != null {
 	if this.ReturnUrl != null {
 		reqBody.Set("return_url", this.ReturnUrl)
 		reqBody.Set("return_url", this.ReturnUrl)
 	}
 	}
-	if this.Charset == "" {
+	if this.Charset == null {
 		reqBody.Set("charset", "utf-8")
 		reqBody.Set("charset", "utf-8")
 	} else {
 	} else {
 		reqBody.Set("charset", this.Charset)
 		reqBody.Set("charset", this.Charset)
 	}
 	}
-	if this.SignType == "" {
+	if this.SignType == null {
 		reqBody.Set("sign_type", "RSA2")
 		reqBody.Set("sign_type", "RSA2")
 	} else {
 	} else {
 		reqBody.Set("sign_type", this.SignType)
 		reqBody.Set("sign_type", this.SignType)
@@ -170,6 +162,9 @@ func (this *aliPayClient) doAliPay(body BodyMap, method string) (bytes []byte, e
 	//===============发起请求===================
 	//===============发起请求===================
 	urlParam := FormatAliPayURLParam(reqBody)
 	urlParam := FormatAliPayURLParam(reqBody)
 	//fmt.Println("urlParam:", urlParam)
 	//fmt.Println("urlParam:", urlParam)
+	if method == "alipay.trade.app.pay" {
+		return []byte(urlParam), nil
+	}
 	var url string
 	var url string
 	agent := gorequest.New()
 	agent := gorequest.New()
 	if !this.isProd {
 	if !this.isProd {

+ 10 - 5
alipay_client_test.go

@@ -38,23 +38,28 @@ func TestAliPayClient_AliPayTradeWapPay(t *testing.T) {
 func TestAliPayClient_AliPayTradeAppPay(t *testing.T) {
 func TestAliPayClient_AliPayTradeAppPay(t *testing.T) {
 	//aliPayPublicKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wn1sU/8Q0rYLlZ6sq3enrPZw2ptp6FecHR2bBFLjJ+sKzepROd0bKddgj+Mr1ffr3Ej78mLdWV8IzLfpXUi945DkrQcOUWLY0MHhYVG2jSs/qzFfpzmtut2Cl2TozYpE84zom9ei06u2AXLMBkU6VpznZl+R4qIgnUfByt3Ix5b3h4Cl6gzXMAB1hJrrrCkq+WvWb3Fy0vmk/DUbJEz8i8mQPff2gsHBE1nMPvHVAMw1GMk9ImB4PxucVek4ZbUzVqxZXphaAgUXFK2FSFU+Q+q1SPvHbUsjtIyL+cLA6H/6ybFF9Ffp27Y14AHPw29+243/SpMisbGcj2KD+evBwIDAQAB"
 	//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="
 	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 := NewAliPayClient("2016091200494382", privateKey, false)
 	client := NewAliPayClient("2016091200494382", privateKey, false)
+	//配置公共参数
 	client.SetCharset("utf-8").
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetSignType("RSA2").
 		SetNotifyUrl("https://www.igoogle.ink")
 		SetNotifyUrl("https://www.igoogle.ink")
-
+	//请求参数
 	body := make(BodyMap)
 	body := make(BodyMap)
 	body.Set("subject", "测试APP支付")
 	body.Set("subject", "测试APP支付")
 	body.Set("out_trade_no", "GYWX201901301040355706100411")
 	body.Set("out_trade_no", "GYWX201901301040355706100411")
 	body.Set("total_amount", "1.00")
 	body.Set("total_amount", "1.00")
 	body.Set("product_code", "QUICK_MSECURITY_PAY")
 	body.Set("product_code", "QUICK_MSECURITY_PAY")
-
-	aRsp, err := client.AliPayTradeAppPay(body)
+	//手机APP支付参数请求
+	payParam, err := client.AliPayTradeAppPay(body)
 	if err != nil {
 	if err != nil {
-		fmt.Println("err2:", err)
+		fmt.Println("err:", err)
 		return
 		return
 	}
 	}
-	fmt.Println("aRsp:", aRsp)
+	fmt.Println("payParam:", payParam)
 }
 }
 
 
 func TestAliPayParams(t *testing.T) {
 func TestAliPayParams(t *testing.T) {

+ 4 - 4
alipay_params.go

@@ -76,13 +76,13 @@ func getRsaSign(body BodyMap, privateKey string) (sign string, err error) {
 	//解析秘钥
 	//解析秘钥
 	block, _ := pem.Decode([]byte(privateKey))
 	block, _ := pem.Decode([]byte(privateKey))
 	if block == nil {
 	if block == nil {
-		return "", errors.New("秘钥错误")
+		return null, errors.New("秘钥错误")
 	}
 	}
 	//log.Println(block.Type)
 	//log.Println(block.Type)
 	key, err = x509.ParsePKCS1PrivateKey(block.Bytes)
 	key, err = x509.ParsePKCS1PrivateKey(block.Bytes)
 	if err != nil {
 	if err != nil {
 		//log.Println("x509.ParsePKCS1PrivateKey:", err)
 		//log.Println("x509.ParsePKCS1PrivateKey:", err)
-		return "", err
+		return null, err
 	}
 	}
 
 
 	switch body.Get("sign_type") {
 	switch body.Get("sign_type") {
@@ -96,12 +96,12 @@ func getRsaSign(body BodyMap, privateKey string) (sign string, err error) {
 	//fmt.Println("原始字符串:",signStr)
 	//fmt.Println("原始字符串:",signStr)
 	_, err = h.Write([]byte(signStr))
 	_, err = h.Write([]byte(signStr))
 	if err != nil {
 	if err != nil {
-		return "", err
+		return null, err
 	}
 	}
 	encryptedBytes, err = rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil))
 	encryptedBytes, err = rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil))
 	if err != nil {
 	if err != nil {
 		//log.Println("rsa.SignPKCS1v15:", err)
 		//log.Println("rsa.SignPKCS1v15:", err)
-		return "", err
+		return null, err
 	}
 	}
 	secretData := base64.StdEncoding.EncodeToString(encryptedBytes)
 	secretData := base64.StdEncoding.EncodeToString(encryptedBytes)
 	return secretData, nil
 	return secretData, nil

+ 5 - 5
util.go

@@ -18,7 +18,7 @@ func (bm BodyMap) Set(key string, value interface{}) {
 //获取参数
 //获取参数
 func (bm BodyMap) Get(key string) string {
 func (bm BodyMap) Get(key string) string {
 	if bm == nil {
 	if bm == nil {
-		return ""
+		return null
 	}
 	}
 	v := bm[key]
 	v := bm[key]
 	value, ok := v.(int)
 	value, ok := v.(int)
@@ -75,8 +75,8 @@ func ParseDateTime(timeStr string) (datetime time.Time) {
 func FormatDateTime(timeStr string) (formatTime string) {
 func FormatDateTime(timeStr string) (formatTime string) {
 	//2019-01-04T15:40:00Z
 	//2019-01-04T15:40:00Z
 	//2019-01-18 20:51:30+08:00
 	//2019-01-18 20:51:30+08:00
-	if timeStr == "" {
-		return ""
+	if timeStr == null {
+		return null
 	}
 	}
 	replace := strings.Replace(timeStr, "T", " ", 1)
 	replace := strings.Replace(timeStr, "T", " ", 1)
 	formatTime = replace[:19]
 	formatTime = replace[:19]
@@ -86,8 +86,8 @@ func FormatDateTime(timeStr string) (formatTime string) {
 //格式化
 //格式化
 func FormatDate(dateStr string) (formatDate string) {
 func FormatDate(dateStr string) (formatDate string) {
 	//2020-12-30T00:00:00+08:00
 	//2020-12-30T00:00:00+08:00
-	if dateStr == "" {
-		return ""
+	if dateStr == null {
+		return null
 	}
 	}
 	split := strings.Split(dateStr, "T")
 	split := strings.Split(dateStr, "T")
 	formatDate = split[0]
 	formatDate = split[0]

+ 6 - 6
wechat_client.go

@@ -276,12 +276,12 @@ func (this *weChatClient) DownloadFundFlow(body BodyMap, certFilePath, keyFilePa
 		pkcsPool := x509.NewCertPool()
 		pkcsPool := x509.NewCertPool()
 		pkcs, err := ioutil.ReadFile(pkcs12FilePath)
 		pkcs, err := ioutil.ReadFile(pkcs12FilePath)
 		if err != nil {
 		if err != nil {
-			return "", err
+			return null, err
 		}
 		}
 		pkcsPool.AppendCertsFromPEM(pkcs)
 		pkcsPool.AppendCertsFromPEM(pkcs)
 		certificate, err := tls.LoadX509KeyPair(certFilePath, keyFilePath)
 		certificate, err := tls.LoadX509KeyPair(certFilePath, keyFilePath)
 		if err != nil {
 		if err != nil {
-			return "", err
+			return null, err
 		}
 		}
 		tlsConfig := new(tls.Config)
 		tlsConfig := new(tls.Config)
 		tlsConfig.Certificates = []tls.Certificate{certificate}
 		tlsConfig.Certificates = []tls.Certificate{certificate}
@@ -294,7 +294,7 @@ func (this *weChatClient) DownloadFundFlow(body BodyMap, certFilePath, keyFilePa
 	}
 	}
 
 
 	if err != nil {
 	if err != nil {
-		return "", err
+		return null, err
 	}
 	}
 	wxRsp = string(bytes)
 	wxRsp = string(bytes)
 	return wxRsp, nil
 	return wxRsp, nil
@@ -312,12 +312,12 @@ func (this *weChatClient) BatchQueryComment(body BodyMap, certFilePath, keyFileP
 		pkcsPool := x509.NewCertPool()
 		pkcsPool := x509.NewCertPool()
 		pkcs, err := ioutil.ReadFile(pkcs12FilePath)
 		pkcs, err := ioutil.ReadFile(pkcs12FilePath)
 		if err != nil {
 		if err != nil {
-			return "", err
+			return null, err
 		}
 		}
 		pkcsPool.AppendCertsFromPEM(pkcs)
 		pkcsPool.AppendCertsFromPEM(pkcs)
 		certificate, err := tls.LoadX509KeyPair(certFilePath, keyFilePath)
 		certificate, err := tls.LoadX509KeyPair(certFilePath, keyFilePath)
 		if err != nil {
 		if err != nil {
-			return "", err
+			return null, err
 		}
 		}
 		tlsConfig := new(tls.Config)
 		tlsConfig := new(tls.Config)
 		tlsConfig.Certificates = []tls.Certificate{certificate}
 		tlsConfig.Certificates = []tls.Certificate{certificate}
@@ -330,7 +330,7 @@ func (this *weChatClient) BatchQueryComment(body BodyMap, certFilePath, keyFileP
 	}
 	}
 
 
 	if err != nil {
 	if err != nil {
-		return "", err
+		return null, err
 	}
 	}
 
 
 	wxRsp = string(bytes)
 	wxRsp = string(bytes)

+ 4 - 4
wechat_params.go

@@ -64,7 +64,7 @@ func getSanBoxSign(mchId, nonceStr, apiKey, signType string) (key string, err er
 	//沙箱环境:获取key后,重新计算Sign
 	//沙箱环境:获取key后,重新计算Sign
 	key, err = getSanBoxSignKey(mchId, nonceStr, sanboxSign)
 	key, err = getSanBoxSignKey(mchId, nonceStr, sanboxSign)
 	if err != nil {
 	if err != nil {
-		return "", err
+		return null, err
 	}
 	}
 	return
 	return
 }
 }
@@ -83,15 +83,15 @@ func getSanBoxSignKey(mchId, nonceStr, sign string) (key string, err error) {
 		Type("xml").
 		Type("xml").
 		SendString(reqXml).EndBytes()
 		SendString(reqXml).EndBytes()
 	if len(errorList) > 0 {
 	if len(errorList) > 0 {
-		return "", errorList[0]
+		return null, errorList[0]
 	}
 	}
 	keyResponse := new(getSignKeyResponse)
 	keyResponse := new(getSignKeyResponse)
 	err = xml.Unmarshal(byteList, keyResponse)
 	err = xml.Unmarshal(byteList, keyResponse)
 	if err != nil {
 	if err != nil {
-		return "", err
+		return null, err
 	}
 	}
 	if keyResponse.ReturnCode == "FAIL" {
 	if keyResponse.ReturnCode == "FAIL" {
-		return "", errors.New(keyResponse.Retmsg)
+		return null, errors.New(keyResponse.Retmsg)
 	}
 	}
 	return keyResponse.SandboxSignkey, nil
 	return keyResponse.SandboxSignkey, nil
 }
 }

+ 1 - 1
wechat_servier_api.go

@@ -101,7 +101,7 @@ func VerifyPayResultSign(apiKey string, signType string, notifyRsp *WeChatNotify
 	newBody := make(BodyMap)
 	newBody := make(BodyMap)
 	for k, v := range body {
 	for k, v := range body {
 		vStr := convert2String(v)
 		vStr := convert2String(v)
-		if vStr != "" && vStr != "0" {
+		if vStr != null && vStr != "0" {
 			newBody.Set(k, v)
 			newBody.Set(k, v)
 		}
 		}
 	}
 	}