Jerry 6 лет назад
Родитель
Сommit
60737f9bed
6 измененных файлов с 358 добавлено и 46 удалено
  1. 71 14
      alipay_client.go
  2. 72 0
      alipay_client_test.go
  3. 124 0
      alipay_params.go
  4. 61 0
      util.go
  5. 2 2
      wechat_client.go
  6. 28 30
      wechat_client_test.go

+ 71 - 14
alipay_client.go

@@ -2,28 +2,32 @@ package gopay
 
 import (
 	"crypto/tls"
+	"log"
+	"time"
 )
 
 type aliPayClient struct {
-	AppId     string
-	MchId     string
-	secretKey string
-	isProd    bool
+	AppId           string
+	aliPayPublicKey string
+	privateKey      string
+	ReturnUrl       string
+	NotifyUrl       string
+	Charset         string
+	SignType        string
+	isProd          bool
 }
 
 //初始化支付宝客户端
 //    appId:应用ID
-//    MchID:商户ID
+//    aliPayPublicKey:支付宝公钥
+//    privateKey:应用私钥
 //    isProd:是否是正式环境
-//    secretKey:key,(当isProd为true时,此参数必传;false时,此参数为空)
-func NewAlipayClient(appId, mchId string, isProd bool, secretKey ...string) *aliPayClient {
-	client := new(aliPayClient)
+func NewAliPayClient(appId, aliPayPublicKey, privateKey string, isProd bool) (client *aliPayClient) {
+	client = new(aliPayClient)
 	client.AppId = appId
-	client.MchId = mchId
+	client.aliPayPublicKey = aliPayPublicKey
+	client.privateKey = privateKey
 	client.isProd = isProd
-	if isProd && len(secretKey) > 0 {
-		client.secretKey = secretKey[0]
-	}
 	return client
 }
 
@@ -78,8 +82,16 @@ func (this *aliPayClient) AliPayTradeAppPay() {
 }
 
 //alipay.trade.wap.pay(手机网站支付接口2.0)
-func (this *aliPayClient) AliPayTradeWapPay() {
+func (this *aliPayClient) AliPayTradeWapPay(body BodyMap) (err error) {
+	var bytes []byte
 
+	bytes, err = this.doAliPay(body, "alipay.trade.wap.pay", nil)
+	if err != nil {
+		//log.Println("err::", err.Error())
+		return err
+	}
+	log.Println("Result:", string(bytes))
+	return nil
 }
 
 //alipay.trade.orderinfo.sync(支付宝订单信息同步接口)
@@ -102,8 +114,53 @@ 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) {
-
+	//===============获取签名===================
+	timeStamp := time.Now().Format(TimeLayout)
+	pKey := FormatPrivateKey(this.privateKey)
+	sign, err := getRsaSign(this.AppId, this.SignType, this.Charset, method, timeStamp, pKey, body)
+	if err != nil {
+		return nil, err
+	}
+	log.Println("rsaSign:", sign)
+	//===============生成参数===================
+	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 = body
+	b.Sign = sign
+
+	//===============发起请求===================
+	agent := HttpAgent()
+	if !this.isProd {
+		//沙箱环境
+		agent.Post(zfb_sanbox_base_url)
+	} else {
+		//正式环境
+		agent.Post(zfb_base_url)
+	}
+	_, bytes, errs := agent.EndBytes()
+	if len(errs) > 0 {
+		return nil, errs[0]
+	}
 	return bytes, nil
 }

+ 72 - 0
alipay_client_test.go

@@ -1,8 +1,10 @@
 package gopay
 
 import (
+	"encoding/json"
 	"fmt"
 	"github.com/smartwalle/alipay"
+	"log"
 	"testing"
 )
 
@@ -26,3 +28,73 @@ func TestPay(t *testing.T) {
 	}
 	fmt.Println("支付URL:", payURL)
 }
+
+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)
+	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("product_code", "QUICK_WAP_WAY")
+
+	err := client.AliPayTradeWapPay(body)
+	if err != nil {
+		log.Println("err2:", err)
+	}
+
+}
+
+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("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())
+		return
+	}
+	fmt.Println("result:", string(bytes))
+}
+
+func TestFormatPrivateKey(t *testing.T) {
+	privateKey := "MIIEowIBAAKCAQEAxorj0SisU93LxawVWybZzDYfq8bxzw9VIOKDSW1M5ombl/MvZTT9IuBSGvqUxXFSWqY05e+CBlquFrOHTzKttmzeZJEKHpGAkW+4TsX6N4ZCHfz3Sz5MBAzBqQvscUD0FTZ+VlQbQ1HjQiKLbHaNY+fFVn3q2XL6dNtWwFhad592M1lCbzEjZ7yqFcxJ0jIDBh1lWwemHu52iW3YkvLD5lE8IXRiJedhgPFXCFAkX5HLcc0/jicRTarQ9gRNpHC6B87T2SDjKmgxqcws4CVdYJbztU1KLrsbMALFMOp24x8xsLgR88XeraQyUWe6V3lt1OYEOd9XLHWRx33bRHSwIDAQABAoIBAHjrGfjG1r11Nae8OH19WeRfikZqMdcztVsD2YWcxdsaL+MJPvJapVjaWecIehcN/2QqGcl4Zy5Lh/9Xc68uZFHYWFHTa+BWKYFqE0wWk1/Bqv7slAgFdvJ4enHkSypmrsFEoQkezEPh2ZDrzRJP2ajg/XTB14h72EHXXCxlIyP6q9ldlHyYSc+KOdC3WYOg1FoFXsliZHVKGZUxo4jck+xwdTGRAIKYpdLjpw7DqAWS6N25cx4XK9GuBYoV7AkIM0kpdjDDXAciG2aws6ef4kumWuW/JSbdrFWGLdiAN8GVpBx6+9WTeDKerS9KyDLNf6rsz9Hm3LNWOYCMLlrEFiECgYEA/XB6pZGrbmSebn2lZO+WFs3LYCXoCUy4ePouLYZO7lKsHNeTYRxCc6cbEmap0hpuMCYVPJkqK+nL/CDwBad1QChN5rPVFl2rLtLu0owvoAuTVjWjYNPgDfWb3spXh0p+lZ9oi53kZd4iDGe/jQJzAcpUa3Yj2me6XFFTD+8FNCkCgYEAyIxrkCo2oqGg1aJ7xc9+aBcpsrVg/upptdTgiMGSVZ3XuixufZV36lzJOdmCBoFGKwmLgKkStJSOm3SHUqdEKQBbHI95aG3HgnAMRXOtkn1exExfpAmCnAAnAx8RONorOTjrMrW0BO0/NII7O7NkLg/ocahr/lXEylsC8dLlMCgYBDiwiEu6/Oee5nUAEWR2veo/YBp9iRMeswAqzv4Q2EInBQN3vFs7xaCj0CyG2V2wlmt5+NSNyeW27LwRN2zkxHTvaD94VgspH+pqSTZF0E8FDR9vWVxqG91qk11QNCwS2/Pn6kRu4p3+t/Ft9L+00fOwcIpLGlcWOPWvUiF/dxEQKBgQCNEEhwpWC80FejLaFGKIdPjEtmSrKpXBV0rfTF+LkizuUBJ3/9zQNRyeGxnnuRj+nlvO1e3sWACySHRu4G53MvR8qqVr13ecfuuA0nOvPojuq4THKrlzVsUqGelXBrlEdiFFJMY7axfvBzoYIyqq+aoTxFjJ6Z/czFOZyp6tnpxQKBgClvDZ9pUc+WH28fDnDPd36bC6HmBq/fkxo92RJey1aRFSoCtKNW5Eaqem8iDD+WAVYak2Vg7xUHkhwIEyVVfHIxZBXc0X1w3jNFjG1/Fyul4hLjqCH2QI8gOjHXAcDZe+MJa8b33ZTiiilUu5A0N8+Xz8qpMQ84cXODHJcPMPYb"
+
+	pKey := FormatPrivateKey(privateKey)
+	fmt.Println(pKey)
+
+}
+
+func TestFormatPublickKey(t *testing.T) {
+	aliPayPublicKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp8gueNlkbiDidz6FBQEBpqoRgH8h7JtsPtYW0nzAqy1MME4mFnDSMfSKlreUomS3a55gmBopL1eF4/Km/dEnaL5tCY9+24SKn1D4iyls+lvz/ZjvUjVwxoUYBh8kkcxMZSDeDz8//o+9qZTrICVP2a4sBB8T0XmU4gxfw8FsmtoomBH1nLk3AO7wgRN2a3+SRSAmxrhIGDmF1lljSlhY32eJpJ2TZQKaWNW+7yDBU/0Wt3kQVY84vr14yYagnSCiIfqyVFqePayRtmVJDr5qvSXr51tdqs2zKZCu+26X7JAF4BSsaq4gmY5DmDTm4TohCnBduI1+bPGD+igVmtl05wIDAQAB"
+
+	pKey := FormatPublickKey(aliPayPublicKey)
+	fmt.Println(pKey)
+}

+ 124 - 0
alipay_params.go

@@ -4,3 +4,127 @@
 //  * DateTime:2019/1/13 14:42
 //==================================
 package gopay
+
+import (
+	"bytes"
+	"crypto"
+	"crypto/rand"
+	"crypto/rsa"
+	"crypto/sha1"
+	"crypto/sha256"
+	"crypto/x509"
+	"encoding/base64"
+	"encoding/json"
+	"encoding/pem"
+	"errors"
+	"hash"
+	"log"
+)
+
+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"` //业务请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档
+}
+
+//设置支付后的ReturnUrl
+func (this *aliPayClient) SetReturnUrl(url string) (client *aliPayClient) {
+	this.ReturnUrl = url
+	return this
+}
+
+//设置支付宝服务器主动通知商户服务器里指定的页面http/https路径。
+func (this *aliPayClient) SetNotifyUrl(url string) (client *aliPayClient) {
+	this.NotifyUrl = url
+	return this
+}
+
+//设置编码格式,如utf-8,gbk,gb2312等,推荐使用 utf-8
+func (this *aliPayClient) SetCharset(charset string) (client *aliPayClient) {
+	if charset == null {
+		this.Charset = "utf-8"
+	} else {
+		this.Charset = charset
+	}
+	return this
+}
+
+//设置签名算法类型,目前支持RSA2和RSA,推荐使用 RSA2
+func (this *aliPayClient) SetSignType(signType string) (client *aliPayClient) {
+	if signType == null {
+		this.SignType = "RSA2"
+	} else {
+		this.SignType = signType
+	}
+	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(appId, signType, charset, method, timestamp, privateKey string, bodyMap BodyMap) (sign string, err error) {
+	var (
+		h              hash.Hash
+		key            *rsa.PrivateKey
+		buffer         *bytes.Buffer
+		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("秘钥错误")
+	}
+	log.Println(block.Type)
+	key, err = x509.ParsePKCS1PrivateKey(block.Bytes)
+	if err != nil {
+		log.Println("x509.ParsePKCS1PrivateKey:", err)
+		return "", err
+	}
+
+	switch signType {
+	case "RSA":
+		h = sha1.New()
+	case "RSA2":
+		h = sha256.New()
+	}
+	buffer = new(bytes.Buffer)
+	buffer.WriteString("app_id=")
+	buffer.WriteString(appId)
+	buffer.WriteString("&biz_content=")
+	buffer.WriteString(string(bodyStr))
+	buffer.WriteString("&charset=")
+	buffer.WriteString(charset)
+	buffer.WriteString("&method=")
+	buffer.WriteString(method)
+	buffer.WriteString("&sign_type=")
+	buffer.WriteString(signType)
+	buffer.WriteString("&timestamp=")
+	buffer.WriteString(timestamp)
+	buffer.WriteString("&version=1.0")
+	log.Println("参数拼接:", buffer.String())
+
+	_, err = h.Write(buffer.Bytes())
+	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)
+		return "", err
+	}
+	secretData := base64.StdEncoding.EncodeToString(encryptedBytes)
+	return secretData, nil
+}

+ 61 - 0
util.go

@@ -1,6 +1,7 @@
 package gopay
 
 import (
+	"bytes"
 	"math/rand"
 	"strconv"
 	"strings"
@@ -156,3 +157,63 @@ func PKCS7UnPadding(plainText []byte) []byte {
 	unpadding := int(plainText[length-1])   //找到Byte数组最后的填充byte
 	return plainText[:(length - unpadding)] //只截取返回有效数字内的byte数组
 }
+
+//格式化秘钥
+func FormatPrivateKey(privateKey string) (pKey string) {
+	buffer := new(bytes.Buffer)
+	buffer.WriteString("-----BEGIN RSA PRIVATE KEY-----\n")
+
+	rawLen := 64
+	keyLen := len(privateKey)
+	raws := keyLen / rawLen
+	temp := keyLen % rawLen
+
+	if temp > 0 {
+		raws++
+	}
+	start := 0
+	end := start + rawLen
+	for i := 0; i < raws; i++ {
+		if i == raws-1 {
+			buffer.WriteString(privateKey[start:])
+		} else {
+			buffer.WriteString(privateKey[start:end])
+		}
+		buffer.WriteString("\n")
+		start += rawLen
+		end = start + rawLen
+	}
+	buffer.WriteString("-----END RSA PRIVATE KEY-----\n")
+	pKey = buffer.String()
+	return
+}
+
+//格式化秘钥
+func FormatPublickKey(publickKey string) (pKey string) {
+	buffer := new(bytes.Buffer)
+	buffer.WriteString("-----BEGIN PUBLIC KEY-----\n")
+
+	rawLen := 64
+	keyLen := len(publickKey)
+	raws := keyLen / rawLen
+	temp := keyLen % rawLen
+
+	if temp > 0 {
+		raws++
+	}
+	start := 0
+	end := start + rawLen
+	for i := 0; i < raws; i++ {
+		if i == raws-1 {
+			buffer.WriteString(publickKey[start:])
+		} else {
+			buffer.WriteString(publickKey[start:end])
+		}
+		buffer.WriteString("\n")
+		start += rawLen
+		end = start + rawLen
+	}
+	buffer.WriteString("-----END PUBLIC KEY-----\n")
+	pKey = buffer.String()
+	return
+}

+ 2 - 2
wechat_client.go

@@ -20,8 +20,8 @@ type weChatClient struct {
 //    MchID:商户ID
 //    apiKey:API秘钥值
 //    isProd:是否是正式环境
-func NewWeChatClient(appId, mchId, apiKey string, isProd bool) *weChatClient {
-	client := new(weChatClient)
+func NewWeChatClient(appId, mchId, apiKey string, isProd bool) (client *weChatClient) {
+	client = new(weChatClient)
 	client.AppId = appId
 	client.MchId = mchId
 	client.apiKey = apiKey

+ 28 - 30
wechat_client_test.go

@@ -5,20 +5,17 @@ import (
 	"encoding/hex"
 	"fmt"
 	"log"
-	"strconv"
 	"strings"
 	"testing"
-	"time"
 )
 
 func TestWeChatClient_UnifiedOrder(t *testing.T) {
-
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
 	//    apiKey:API秘钥值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数Map
 	body := make(BodyMap)
@@ -30,23 +27,24 @@ func TestWeChatClient_UnifiedOrder(t *testing.T) {
 	body.Set("total_fee", 10)
 	body.Set("spbill_create_ip", "124.77.173.62")
 	body.Set("notify_url", "http://www.igoogle.ink")
-	body.Set("trade_type", TradeType_JsApi)
-	//body.Set("device_info", "WEB")
+	body.Set("trade_type", TradeType_H5)
+	body.Set("device_info", "WEB")
 	body.Set("sign_type", SignType_MD5)
 	//body.Set("scene_info", `{"h5_info": {"type":"Wap","wap_url": "http://www.igoogle.ink","wap_name": "测试支付"}}`)
-	body.Set("openid", OpenID)
+	//body.Set("openid", OpenID)
 
 	//请求支付下单,成功后得到结果
 	wxRsp, err := client.UnifiedOrder(body)
 	if err != nil {
 		fmt.Println("Error:", err)
 	}
-	timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
-	//获取小程序需要的paySign
-	pac := "prepay_id=" + wxRsp.PrepayId
-	paySign := GetMiniPaySign(AppID, wxRsp.NonceStr, pac, SignType_MD5, timeStamp, secretKey)
-	fmt.Println("paySign:", paySign)
-	fmt.Println("Response:", wxRsp)
+	fmt.Println("wxRsp:", *wxRsp)
+	//timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
+	////获取小程序需要的paySign
+	//pac := "prepay_id=" + wxRsp.PrepayId
+	//paySign := GetMiniPaySign(AppID, wxRsp.NonceStr, pac, SignType_MD5, timeStamp, ApiKey)
+	//fmt.Println("paySign:", paySign)
+	//fmt.Println("Response:", wxRsp)
 }
 
 func TestWeChatClient_QueryOrder(t *testing.T) {
@@ -55,7 +53,7 @@ func TestWeChatClient_QueryOrder(t *testing.T) {
 	//    MchID:商户ID
 	//    apiKey:API秘钥值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数结构体
 	body := make(BodyMap)
@@ -75,9 +73,9 @@ func TestWeChatClient_CloseOrder(t *testing.T) {
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
-	//    secretKey:Key值
+	//    ApiKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数结构体
 	body := make(BodyMap)
@@ -97,9 +95,9 @@ func TestWeChatClient_Refund(t *testing.T) {
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
-	//    secretKey:Key值
+	//    ApiKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, true)
+	client := NewWeChatClient(AppID, MchID, ApiKey, true)
 
 	//初始化参数结构体
 	body := make(BodyMap)
@@ -128,9 +126,9 @@ func TestWeChatClient_QueryRefund(t *testing.T) {
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
-	//    secretKey:Key值
+	//    ApiKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数结构体
 	body := make(BodyMap)
@@ -150,9 +148,9 @@ func TestWeChatClient_DownloadBill(t *testing.T) {
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
-	//    secretKey:Key值
+	//    ApiKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数结构体
 	body := make(BodyMap)
@@ -173,9 +171,9 @@ func TestWeChatClient_DownloadFundFlow(t *testing.T) {
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
-	//    secretKey:Key值
+	//    ApiKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数结构体
 	body := make(BodyMap)
@@ -196,9 +194,9 @@ func TestWeChatClient_BatchQueryComment(t *testing.T) {
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
-	//    secretKey:Key值
+	//    ApiKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数结构体
 	body := make(BodyMap)
@@ -220,9 +218,9 @@ func TestWeChatClient_Micropay(t *testing.T) {
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
-	//    secretKey:Key值
+	//    ApiKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数Map
 	body := make(BodyMap)
@@ -248,9 +246,9 @@ func TestWeChatClient_Reverse(t *testing.T) {
 	//初始化微信客户端
 	//    appId:应用ID
 	//    MchID:商户ID
-	//    secretKey:Key值
+	//    ApiKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(AppID, MchID, secretKey, false)
+	client := NewWeChatClient(AppID, MchID, ApiKey, false)
 
 	//初始化参数Map
 	body := make(BodyMap)