Prechádzať zdrojové kódy

finish alipay wap 2.0

Jerry 7 rokov pred
rodič
commit
489d24b44f
4 zmenil súbory, kde vykonal 190 pridanie a 126 odobranie
  1. 69 49
      alipay_client.go
  2. 46 37
      alipay_client_test.go
  3. 58 40
      alipay_params.go
  4. 17 0
      alipay_rsp.go

+ 69 - 49
alipay_client.go

@@ -1,8 +1,9 @@
 package gopay
 
 import (
-	"crypto/tls"
 	"encoding/json"
+	"fmt"
+	"github.com/parnurzeal/gorequest"
 	"log"
 	"time"
 )
@@ -78,21 +79,34 @@ func (this *aliPayClient) AliPayTradeQuery() {
 }
 
 //alipay.trade.app.pay(app支付接口2.0)
-func (this *aliPayClient) AliPayTradeAppPay() {
-
+func (this *aliPayClient) AliPayTradeAppPay(body BodyMap) (aRsp *AliPayTradePayAppResponse, err error) {
+	var bytes []byte
+	bytes, err = this.doAliPay(body, "alipay.trade.app.pay")
+	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 rsp, nil
 }
 
 //alipay.trade.wap.pay(手机网站支付接口2.0)
-func (this *aliPayClient) AliPayTradeWapPay(body BodyMap) (err error) {
+func (this *aliPayClient) AliPayTradeWapPay(body BodyMap) (payUrl string, err error) {
 	var bytes []byte
-
-	bytes, err = this.doAliPay(body, "alipay.trade.wap.pay", nil)
+	bytes, err = this.doAliPay(body, "alipay.trade.wap.pay")
 	if err != nil {
 		//log.Println("err::", err.Error())
-		return err
+		return null, err
 	}
-	log.Println("Result:", string(bytes))
-	return nil
+	payUrl = string(bytes)
+	//fmt.Println("URL::", payUrl)
+	return payUrl, nil
 }
 
 //alipay.trade.orderinfo.sync(支付宝订单信息同步接口)
@@ -115,67 +129,73 @@ func (this *aliPayClient) ZhimaCreditScoreGet() {
 
 }
 
-/*
-https://openapi.alipay.com/gateway.do?timestamp=2013-01-01 08:08:08&method=alipay.trade.wap.pay&app_id=1990&sign_type=RSA2&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE&version=1.0&biz_content=
-  {
-    "body":"对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。",
-    "subject":"大乐透",
-    "out_trade_no":"70501111111S001111119",
-    "timeout_express":"90m",
-    "total_amount":9.00,
-    "product_code":"QUICK_WAP_WAY"
-  }
-*/
 //向支付宝发送请求
-func (this *aliPayClient) doAliPay(body BodyMap, method string, tlsConfig ...*tls.Config) (bytes []byte, err error) {
+func (this *aliPayClient) doAliPay(body BodyMap, method string) (bytes []byte, err error) {
 	//===============转换body参数===================
 	bodyStr, err := json.Marshal(body)
 	if err != nil {
 		log.Println("json.Marshal:", err)
 		return nil, err
 	}
-	//log.Println("bodyStr:", string(bodyStr))
+	//fmt.Println(string(bodyStr))
 	//===============生成参数===================
-	timeStamp := time.Now().Format(TimeLayout)
-	b := new(aliPayPublicBody)
-	b.AppId = this.AppId
-	b.Method = method
-	b.Format = "JSON"
-	b.ReturnUrl = this.ReturnUrl
-	b.Charset = this.Charset
-	b.SignType = this.SignType
-	b.Timestamp = timeStamp
-	b.Version = "1.0"
-	b.NotifyUrl = this.NotifyUrl
-	b.BizContent = string(bodyStr)
+	reqBody := make(BodyMap)
+	reqBody.Set("app_id", this.AppId)
+	reqBody.Set("method", method)
+	reqBody.Set("format", "JSON")
+	if this.ReturnUrl != null {
+		reqBody.Set("return_url", this.ReturnUrl)
+	}
+	if this.Charset == "" {
+		reqBody.Set("charset", "utf-8")
+	} else {
+		reqBody.Set("charset", this.Charset)
+	}
+	if this.SignType == "" {
+		reqBody.Set("sign_type", "RSA2")
+	} else {
+		reqBody.Set("sign_type", this.SignType)
+	}
+	reqBody.Set("timestamp", time.Now().Format(TimeLayout))
+	reqBody.Set("version", "1.0")
+	if this.NotifyUrl != null {
+		reqBody.Set("notify_url", this.NotifyUrl)
+	}
+	reqBody.Set("biz_content", string(bodyStr))
 	//===============获取签名===================
-
 	pKey := FormatPrivateKey(this.privateKey)
-	sign, err := getRsaSign(b, pKey)
+	sign, err := getRsaSign(reqBody, pKey)
 	if err != nil {
 		return nil, err
 	}
-	log.Println("rsaSign:", sign)
-	b.Sign = sign
+	reqBody.Set("sign", sign)
+	//fmt.Println("rsaSign:", sign)
 	//===============发起请求===================
-	agent := HttpAgent()
+	urlParam := FormatAliPayURLParam(reqBody)
+	//fmt.Println("urlParam:", urlParam)
+	var url string
+	agent := gorequest.New()
 	if !this.isProd {
 		//沙箱环境
-		agent.Post(zfb_sanbox_base_url)
+		url = zfb_sanbox_base_url
+		//fmt.Println(url)
+		agent.Post(url)
 	} else {
 		//正式环境
-		agent.Post(zfb_base_url)
+		url = zfb_base_url
+		//fmt.Println(url)
+		agent.Post(url)
 	}
-	//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).
+	rsp, b, errs := agent.
+		Type("form-data").
+		SendString(urlParam).
 		EndBytes()
 	if len(errs) > 0 {
 		return nil, errs[0]
 	}
-	return bytes, nil
+	if method == "alipay.trade.wap.pay" {
+		//fmt.Println("rsp:::", rsp.Request.URL)
+		return []byte(rsp.Request.URL.String()), nil
+	}
+	return b, nil
 }

+ 46 - 37
alipay_client_test.go

@@ -10,19 +10,22 @@ import (
 
 func TestPay(t *testing.T) {
 	//网页&移动应用
-	var AlipayAppId = "2016091200494382"
-	var AlipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wn1sU/8Q0rYLlZ6sq3enrPZw2ptp6FecHR2bBFLjJ+sKzepROd0bKddgj+Mr1ffr3Ej78mLdWV8IzLfpXUi945DkrQcOUWLY0MHhYVG2jSs/qzFfpzmtut2Cl2TozYpE84zom9ei06u2AXLMBkU6VpznZl+R4qIgnUfByt3Ix5b3h4Cl6gzXMAB1hJrrrCkq+WvWb3Fy0vmk/DUbJEz8i8mQPff2gsHBE1nMPvHVAMw1GMk9ImB4PxucVek4ZbUzVqxZXphaAgUXFK2FSFU+Q+q1SPvHbUsjtIyL+cLA6H/6ybFF9Ffp27Y14AHPw29+243/SpMisbGcj2KD+evBwIDAQAB"
-	//私钥通用
-	var AlipayPrivateKey = "MIIEowIBAAKCAQEAxorj0SisU93LxawVWybZzDYfq8bxzw9VIOKDSW1M5ombl/MvZTT9IuBSGvqUxXFSWqY05e+CBlquFrOHTzKttmzeZJEKHpGAkW+4TsX6N4ZCHfz3Sz5MBAzBqQvscUD0FTZ+VlQbQ1HjQiKLbHaNY+fFVn3q2XL6dNtWwFhad592M1lCbzEjZ7yqFcxJ0jIDBh1lWwemHu52iW3YkvLD5lE8IXRiJedh++gPFXCFAkX5HLcc0/jicRTarQ9gRNpHC6B87T2SDjKmgxqcws4CVdYJbztU1KLrsbMALFMOp24x8xsLgR88XeraQyUWe6V3lt1OYEOd9XLHWRx33bRHSwIDAQABAoIBAHjrGfjG1r11Nae8OH19WeRfikZqMdcztVsD2YWcxdsaL+MJPvJapVjaWecIehcN/2QqGcl4Zy5Lh/9Xc68uZFHYWFHTa+BWKYFqE0wWk1/Bqv7slAgFdvJ4enHkSypmrsFEoQkezEPh2ZDrzRJP2ajg/XTB14h72EHXXCxlIyP6q9ldlHyYSc+KOdC3WYOg1FoFXsliZHVKGZUxo4jck+xwdTGRAIKYpdLjpw7DqAWS6N25cx4XK9GuBYoV7AkIM0kpdjDDXAciG2aws6ef4kumWuW/JSbdrFWGLdiAN8GVpBx6+9WTeDKerS9KyDLNf6rsz9Hm3LNWOYCMLlrEFiECgYEA/XB6pZGrbmSebn2lZO+WFs3LYCXoCUy4ePouLYZO7lKsHNeTYRxCc6cbEmap0hpuMCYVPJkqK+nL/CDwBad1QChN5rPVFl2rLtLu0owvoAuTVjWjYNPgDfWb3spXh0p+lZ9oi53kZd4iDGe/jQJzAcpUa3Yj2me6XFFTD+8FNCkCgYEAyIxrkCo2oqGg1aJ7xc9+aBcpsrVg/uppt++dTgiMGSVZ3XuixufZV36lzJOdmCBoFGKwmLgKkStJSOm3SHUqdEKQBbHI95aG3HgnAMRXOtkn1exExfpAmCnAAnAx8RONorOTjrMrW0BO0/NII7O7NkLg/ocahr/lXEylsC8dLlMCgYBDiwiEu6/Oee5nUAEWR2veo/YBp9iRMeswAqzv4Q2EInBQN3vFs7xaCj0CyG2V2wlmt5+NSNyeW27LwRN2zkxHTvaD94VgspH+pqSTZF0E8FDR9vWVxqG91qk11QNCwS2/Pn6kRu4p3+t/Ft9L+00fOwcIpLGlcWOPWvUiF/dxEQKBgQCNEEhwpWC80FejLaFGKIdPjEtmSrKpXBV0rfTF+LkizuUBJ3/9zQNRyeGxnnuRj+nlvO1e3sWACySHRu4G53MvR8qqVr13ecfuuA0nOvPojuq4THKrlzVsUqGelXBrlEdiFFJMY7axfvBzoYIyqq+aoTxFjJ6Z/czFOZyp6tnpxQKBgClvDZ9pUc+WH28fDnDPd36bC6HmBq/fkxo92RJey1aRFSoCtKNW5Eaqem8iDD+WAVYak2Vg7xUHkhwIEyVVfHIxZBXc0X1w3jNFjG1/Fyul4hLjqCH2QI8gOjHXAcDZe+MJa8b33ZTiiilUu5A0N8+Xz8qpMQ84cXODHJcPMPYb"
-	client := alipay.New(AlipayAppId, AlipayPublicKey, AlipayPrivateKey, false)
-
-	p := alipay.AliPayTradeWapPay{}
-	p.NotifyURL = "https://wx1.iguiyu.com/v1/parking/alipay/recharge/notify"
-	p.Subject = "充值"
-	p.OutTradeNo = GetRandomString(32)
+	AlipayAppId := "2016091200494382"
+	aliPayPublicKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp8gueNlkbiDidz6FBQEBpqoRgH8h7JtsPtYW0nzAqy1MME4mFnDSMfSKlreUomS3a55gmBopL1eF4/Km/dEnaL5tCY9+24SKn1D4iyls+lvz/ZjvUjVwxoUYBh8kkcxMZSDeDz8//o+9qZTrICVP2a4sBB8T0XmU4gxfw8FsmtoomBH1nLk3AO7wgRN2a3+SRSAmxrhIGDmF1lljSlhY32eJpJ2TZQKaWNW+7yDBU/0Wt3kQVY84vr14yYagnSCiIfqyVFqePayRtmVJDr5qvSXr51tdqs2zKZCu+26X7JAF4BSsaq4gmY5DmDTm4TohCnBduI1+bPGD+igVmtl05wIDAQAB"
+	privateKey := "MIIEowIBAAKCAQEAxcVdmw2Rie/nPjylx/VOIKJa4bofSZhdikpb38vVQvVOjgiV6xfhNTpv5dA5+Sdx6O2lF+KKngkC0sdbY3jWTWgk0fx5rTB1M6wzqZxJdchU8HcGm/dIIq5aBnet4RjsYU++3q0cQbZSUMzznMgf1Lz7gHFZS3IIYUMAZloYpcklqxJNXq1ZREthW96FbZyn1rbycdXjlpEbqIHDJuVqUL74eh+53xL9Tj8GCOoRBA0iqlPLVL4JpL7e4E6defftaypqB2aC0fJO8trNrbWCYxsIyeFjZeRKqVzYMFc+RFfDyIK3yC3hjzMOKoxWXkYw4uml/Qrkwt7NVvCzvR9NeQIDAQABAoIBABbBqAywWf/KOAyEQ/snMc81f0mb9f+s5Y6FEd9FgAuNWHWlbUK447QRPlDuTc1qiYPo3GdMLPEUTlvcjpp6jAYqJpp297VC7yl79hHdJuLDo2pr97m4kXdUIo299acCDCkCWQ8cUjUJep1Lh/iRWoBLIpFb+Y9h1q8CW6hrU4y3zZYRaww3rjj7zl19vaEXF5uf/mmsoIToa2bl3vVW4GK1utkhF8iiK5VvBgiWEmTCVpNCCOKbv5Ma8xDrip0CqzCghqIYVTOwqS65FOoGrwzq/4Ivli2/tjnfm6BZcgbxUf6CoKj4ism8P3r5io9yrj/9RXkihjuPw6DmTWVYkLUCgYEA8ECyT9oi2b04c9RzE5s2nzO87TqI/zL0yhSd7Xlmn4JfNg49YI0TXfyupJ7BQSyuu/DAGdiLPWSoHolDhtDBLSaA9l1x26iGcs/ihu8H5jIz0De1NuM4Ef3vLD6LF9khCpzqnyWyCcOFh384Tu3q7kqmncF4Mqj/zJtglfed15sCgYEA0rvZc5ECUZuT0MyRU4Mj2IrRwc6aqO2tnxqEevZRnfmnTWiGfT8Op2CvHw9hKnQdWJUYqWrudG63HVx8/8Lvyx8XZlXVlKjU92rlaek6dO1Pw/z4DTuxE6WPoup2WfA1kjzrmhdTNzacrj6pJt/38HPRdhLnWVMkHTE6bBEkgnsCgYEA0zneS4xaRZsyDcxEHIHDBTdErEFhfxU62IxFySqKCkViFjFwzvlZhLGKjhsxh26UdZIWIuMakDB2CtrdrqLMpDiM+41udBP3mOuimsV+6WlL2o2P2iDtBAyBAiI+wgnZHe6V7LQEksb/GADG7cYJXdXuJRaa6ddhhm84/MDGWm8CgYAzISrQdGWIoWPK7GdySMZAuuXLzTIPPKO8j7WHFA6XcsRZ7rt61frbN4Ul1xhvMX8RSBOUv4Ids+Mv94nIkGaX9PI7fSX2DMSnR0NkYBcz2YRZ/B2/MDV1m9zu3U5b4gFNewR6/Z/OLKz1RfTKntrMd31h1ZJWROrlPlV7dOlT0wKBgEKY2m8grGRWFOmaMlDuN/fICtcv2KCDmC+ogs/QlGjsIld8YXkOrZiDr3u3V4YYlqJqKSmiJm2pDffDC7xtAiJ3o2dU9MH5RoLkefJSnDC3npKUY7iu7oBpsJJ0vFFWTkH8KHnnfWhElBSU9vPXakxIHLXLltF27hn3Ry4N826k"
+	client, err := alipay.New(AlipayAppId, aliPayPublicKey, privateKey, false)
+	if err != nil {
+		log.Println("err:", err)
+		return
+	}
+
+	p := alipay.TradeWapPay{}
+	p.NotifyURL = "https://api.iguiyu.com"
+	p.Subject = "测试支付"
+	p.OutTradeNo = "GYWX201901301040355706100402"
 	p.TotalAmount = "0.01"
-	p.ProductCode = "充值"
-	var payURL, err = client.TradeWapPay(p)
+	p.ProductCode = "QUICK_WAP_WAY"
+	payURL, err := client.TradeWapPay(p)
 	if err != nil {
 		fmt.Println(err)
 	}
@@ -30,52 +33,59 @@ func TestPay(t *testing.T) {
 }
 
 func TestAliPayClient_AliPayTradeWapPay(t *testing.T) {
-	aliPayPublicKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp8gueNlkbiDidz6FBQEBpqoRgH8h7JtsPtYW0nzAqy1MME4mFnDSMfSKlreUomS3a55gmBopL1eF4/Km/dEnaL5tCY9+24SKn1D4iyls+lvz/ZjvUjVwxoUYBh8kkcxMZSDeDz8//o+9qZTrICVP2a4sBB8T0XmU4gxfw8FsmtoomBH1nLk3AO7wgRN2a3+SRSAmxrhIGDmF1lljSlhY32eJpJ2TZQKaWNW+7yDBU/0Wt3kQVY84vr14yYagnSCiIfqyVFqePayRtmVJDr5qvSXr51tdqs2zKZCu+26X7JAF4BSsaq4gmY5DmDTm4TohCnBduI1+bPGD+igVmtl05wIDAQAB"
-	privateKey := "MIIEowIBAAKCAQEAxcVdmw2Rie/nPjylx/VOIKJa4bofSZhdikpb38vVQvVOjgiV6xfhNTpv5dA5+Sdx6O2lF+KKngkC0sdbY3jWTWgk0fx5rTB1M6wzqZxJdchU8HcGm/dIIq5aBnet4RjsYU++3q0cQbZSUMzznMgf1Lz7gHFZS3IIYUMAZloYpcklqxJNXq1ZREthW96FbZyn1rbycdXjlpEbqIHDJuVqUL74eh+53xL9Tj8GCOoRBA0iqlPLVL4JpL7e4E6defftaypqB2aC0fJO8trNrbWCYxsIyeFjZeRKqVzYMFc+RFfDyIK3yC3hjzMOKoxWXkYw4uml/Qrkwt7NVvCzvR9NeQIDAQABAoIBABbBqAywWf/KOAyEQ/snMc81f0mb9f+s5Y6FEd9FgAuNWHWlbUK447QRPlDuTc1qiYPo3GdMLPEUTlvcjpp6jAYqJpp297VC7yl79hHdJuLDo2pr97m4kXdUIo299acCDCkCWQ8cUjUJep1Lh/iRWoBLIpFb+Y9h1q8CW6hrU4y3zZYRaww3rjj7zl19vaEXF5uf/mmsoIToa2bl3vVW4GK1utkhF8iiK5VvBgiWEmTCVpNCCOKbv5Ma8xDrip0CqzCghqIYVTOwqS65FOoGrwzq/4Ivli2/tjnfm6BZcgbxUf6CoKj4ism8P3r5io9yrj/9RXkihjuPw6DmTWVYkLUCgYEA8ECyT9oi2b04c9RzE5s2nzO87TqI/zL0yhSd7Xlmn4JfNg49YI0TXfyupJ7BQSyuu/DAGdiLPWSoHolDhtDBLSaA9l1x26iGcs/ihu8H5jIz0De1NuM4Ef3vLD6LF9khCpzqnyWyCcOFh384Tu3q7kqmncF4Mqj/zJtglfed15sCgYEA0rvZc5ECUZuT0MyRU4Mj2IrRwc6aqO2tnxqEevZRnfmnTWiGfT8Op2CvHw9hKnQdWJUYqWrudG63HVx8/8Lvyx8XZlXVlKjU92rlaek6dO1Pw/z4DTuxE6WPoup2WfA1kjzrmhdTNzacrj6pJt/38HPRdhLnWVMkHTE6bBEkgnsCgYEA0zneS4xaRZsyDcxEHIHDBTdErEFhfxU62IxFySqKCkViFjFwzvlZhLGKjhsxh26UdZIWIuMakDB2CtrdrqLMpDiM+41udBP3mOuimsV+6WlL2o2P2iDtBAyBAiI+wgnZHe6V7LQEksb/GADG7cYJXdXuJRaa6ddhhm84/MDGWm8CgYAzISrQdGWIoWPK7GdySMZAuuXLzTIPPKO8j7WHFA6XcsRZ7rt61frbN4Ul1xhvMX8RSBOUv4Ids+Mv94nIkGaX9PI7fSX2DMSnR0NkYBcz2YRZ/B2/MDV1m9zu3U5b4gFNewR6/Z/OLKz1RfTKntrMd31h1ZJWROrlPlV7dOlT0wKBgEKY2m8grGRWFOmaMlDuN/fICtcv2KCDmC+ogs/QlGjsIld8YXkOrZiDr3u3V4YYlqJqKSmiJm2pDffDC7xtAiJ3o2dU9MH5RoLkefJSnDC3npKUY7iu7oBpsJJ0vFFWTkH8KHnnfWhElBSU9vPXakxIHLXLltF27hn3Ry4N826k"
-	client := NewAliPayClient("2018112762320936", aliPayPublicKey, privateKey, true)
+	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="
+	client := NewAliPayClient("2016091200494382", aliPayPublicKey, privateKey, false)
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
-		SetReturnUrl("https://api.iguiyu.com").
 		SetNotifyUrl("https://api.iguiyu.com")
 
 	body := make(BodyMap)
 	body.Set("subject", "测试支付")
-	body.Set("out_trade_no", "GYWX201901301040355706100401")
-	body.Set("total_amount", "1.00")
+	body.Set("out_trade_no", "GYWX201901301040355706100408")
+	body.Set("quit_url", "https://www.igoogle.ink")
+	body.Set("total_amount", "0.01")
 	body.Set("product_code", "QUICK_WAP_WAY")
 
-	err := client.AliPayTradeWapPay(body)
+	payUrl, err := client.AliPayTradeWapPay(body)
 	if err != nil {
 		log.Println("err2:", err)
+		return
 	}
+	fmt.Println("payUrl:", payUrl)
+}
 
+func TestAliPayClient_AliPayTradeAppPay(t *testing.T) {
+	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="
+	client := NewAliPayClient("2016091200494382", aliPayPublicKey, privateKey, false)
+	client.SetCharset("utf-8").
+		SetSignType("RSA2").
+		SetNotifyUrl("https://api.iguiyu.com")
+
+	body := make(BodyMap)
+	body.Set("subject", "测试支付")
+	body.Set("out_trade_no", "GYWX201901301040355706100405")
+	body.Set("total_amount", "1.00")
+	body.Set("product_code", "QUICK_MSECURITY_PAY")
+
+	aRsp, err := client.AliPayTradeAppPay(body)
+	if err != nil {
+		log.Println("err2:", err)
+		return
+	}
+	fmt.Println("aRsp:", aRsp)
 }
 
 func TestAliPayParams(t *testing.T) {
-	//body := new(aliPayPublicBody)
-	//body.AppId = "2018112762320936"
-	//body.Method = "alipay.trade.wap.pay"
-	//body.Format = "JSON"
-	//body.ReturnUrl = "https://www"
-	//body.Charset = "utf-8"
-	//body.SignType = "RSA2"
-	//body.Sign = "asddgfnkjsdklasjdklfl"
-	//body.Timestamp = "2006-01-02 15:04:05"
-	//body.Version = "1.0"
-	//body.NotifyUrl = "https://www"
 
 	bodyMap := make(BodyMap)
 	bodyMap.Set("subject", "测试支付")
 	bodyMap.Set("out_trade_no", "GYWX201901301040355706100401")
+	bodyMap.Set("quit_url", "https://www.igoogle.ink")
 	bodyMap.Set("total_amount", "1.00")
 	bodyMap.Set("product_code", "QUICK_WAP_WAY")
 
-	//fmt.Println("bodyMap:", bodyMap)
-
-	//body.BizContent = bodyMap
-
-	//fmt.Println(body.BizContent)
-
 	bytes, err := json.Marshal(bodyMap)
 	if err != nil {
 		fmt.Println("err:", err.Error())
@@ -89,7 +99,6 @@ func TestFormatPrivateKey(t *testing.T) {
 
 	pKey := FormatPrivateKey(privateKey)
 	fmt.Println(pKey)
-
 }
 
 func TestFormatPublickKey(t *testing.T) {

+ 58 - 40
alipay_params.go

@@ -17,22 +17,21 @@ import (
 	"encoding/pem"
 	"errors"
 	"hash"
-	"log"
+	"net/url"
+	"sort"
 )
 
-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 string `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
 func (this *aliPayClient) SetReturnUrl(url string) (client *aliPayClient) {
@@ -66,59 +65,78 @@ func (this *aliPayClient) SetSignType(signType string) (client *aliPayClient) {
 	return this
 }
 
-//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(body *aliPayPublicBody, privateKey string) (sign string, err error) {
+//获取蚕食签名
+func getRsaSign(body BodyMap, privateKey string) (sign string, err error) {
 	var (
 		h              hash.Hash
 		key            *rsa.PrivateKey
-		buffer         *bytes.Buffer
-		bodyStr        []byte
+		signStr        string
 		encryptedBytes []byte
 	)
-
+	//解析秘钥
 	block, _ := pem.Decode([]byte(privateKey))
 	if block == nil {
 		return "", errors.New("秘钥错误")
 	}
-	log.Println(block.Type)
+	//log.Println(block.Type)
 	key, err = x509.ParsePKCS1PrivateKey(block.Bytes)
 	if err != nil {
-		log.Println("x509.ParsePKCS1PrivateKey:", err)
+		//log.Println("x509.ParsePKCS1PrivateKey:", err)
 		return "", err
 	}
 
-	switch body.SignType {
+	switch body.Get("sign_type") {
 	case "RSA":
 		h = sha1.New()
 	case "RSA2":
 		h = sha256.New()
 	}
-	buffer = new(bytes.Buffer)
-	buffer.WriteString("app_id=")
-	buffer.WriteString(body.AppId)
-	buffer.WriteString("&biz_content=")
-	buffer.WriteString(string(bodyStr))
-	buffer.WriteString("&charset=")
-	buffer.WriteString(body.Charset)
-	buffer.WriteString("&method=")
-	buffer.WriteString(body.Method)
-	buffer.WriteString("&sign_type=")
-	buffer.WriteString(body.SignType)
-	buffer.WriteString("&timestamp=")
-	buffer.WriteString(body.Timestamp)
-	buffer.WriteString("&version=1.0")
-	log.Println("参数拼接:", buffer.String())
 
-	_, err = h.Write(buffer.Bytes())
+	signStr = sortAliPaySignParams(body)
+	//fmt.Println("原始字符串:",signStr)
+	_, err = h.Write([]byte(signStr))
 	if err != nil {
 		return "", err
 	}
-
 	encryptedBytes, err = rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil))
 	if err != nil {
-		log.Println("rsa.SignPKCS1v15:", err)
+		//log.Println("rsa.SignPKCS1v15:", err)
 		return "", err
 	}
 	secretData := base64.StdEncoding.EncodeToString(encryptedBytes)
 	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("=")
+
+		valueStr := convert2String(body[k])
+		buffer.WriteString(valueStr)
+		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{}
+	for key, value := range body {
+		v.Add(key, value.(string))
+	}
+	urlParam = v.Encode()
+	//fmt.Println("Encode后参数:", urlParam)
+	return
+}

+ 17 - 0
alipay_rsp.go

@@ -4,3 +4,20 @@
 //  * DateTime:2019/1/16 0:30
 //==================================
 package gopay
+
+type AliPayTradePayAppResponse struct {
+	AlipayTradeWapPayResponse AliPayInfo `json:"alipay_trade_wap_pay_response"`
+	Sign                      string     `json:"sign"`
+}
+
+type AliPayInfo struct {
+	Code            string `json:"code"`
+	Msg             string `json:"msg"`
+	SubCode         string `json:"sub_code"`
+	SubMsg          string `json:"sub_msg"`
+	OutTradeNo      string `json:"out_trade_no"`
+	TradeNo         string `json:"trade_no"`
+	TotalAmount     string `json:"total_amount"`
+	SellerId        string `json:"seller_id"`
+	MerchantOrderNo string `json:"merchant_order_no"`
+}