Jerry 6 tahun lalu
induk
melakukan
6b16308a7a

+ 1 - 3
README.md

@@ -220,9 +220,7 @@ client.SetAliPayRootCertSN().               //设置支付宝根证书SN,通
     SetAppAuthToken().                      //设置第三方应用授权
     SetAuthToken()                          //设置个人信息授权
 
-client, err := client.SetAppCertSnByPath("appCertPublicKey.crt")
-client, err := client.SetAliPayPublicCertSnByPath("alipayCertPublicKey_RSA2.crt")
-client, err := client.SetAliPayRootCertSnByPath("alipayRootCert.crt")
+err := client.SetCertSnByPath("appCertPublicKey.crt", "alipayRootCert.crt", "alipayCertPublicKey_RSA2.crt")
 ```
 
 ## 2、初始化并赋值BodyMap(client的方法所需的入参)

+ 28 - 30
alipay/alipay_client.go

@@ -184,7 +184,7 @@ func (a *Client) TradeRefund(body gopay.BodyMap) (aliRsp *TradeRefundResponse, e
 	return
 }
 
-// alipay.trade.refund(统一收单退款页面接口)
+// alipay.trade.page.refund(统一收单退款页面接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.page.refund
 func (a *Client) TradePageRefund(body gopay.BodyMap) (aliRsp *TradePageRefundResponse, err error) {
 	var (
@@ -193,7 +193,7 @@ func (a *Client) TradePageRefund(body gopay.BodyMap) (aliRsp *TradePageRefundRes
 	if body.Get("out_trade_no") == gopay.NULL && body.Get("trade_no") == gopay.NULL {
 		return nil, errors.New("out_trade_no and trade_no are not allowed to be NULL at the same time")
 	}
-	if bs, err = a.doAliPay(body, "	alipay.trade.page.refund"); err != nil {
+	if bs, err = a.doAliPay(body, "alipay.trade.page.refund"); err != nil {
 		return
 	}
 	aliRsp = new(TradePageRefundResponse)
@@ -365,7 +365,7 @@ func (a *Client) SystemOauthToken(body gopay.BodyMap) (aliRsp *SystemOauthTokenR
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.Response.AccessToken == gopay.NULL {
+	if aliRsp.Response == nil && aliRsp.ErrorResponse != nil {
 		info := aliRsp.ErrorResponse
 		return nil, fmt.Errorf(`{"code":"%s","msg":"%s","sub_code":"%s","sub_msg":"%s"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
@@ -589,43 +589,41 @@ func (a *Client) doAliPay(body gopay.BodyMap, method string) (bs []byte, err err
 	}
 	pubBody.Set("sign", sign)
 	param := FormatURLParam(pubBody)
-	if method == "alipay.trade.app.pay" {
+
+	switch method {
+	case "alipay.trade.app.pay":
 		return []byte(param), nil
-	}
-	if method == "alipay.user.certify.open.certify" {
+	case "alipay.trade.page.pay":
 		if !a.IsProd {
 			return []byte(zfbSandboxBaseUrl + "?" + param), nil
-		} else {
-			return []byte(zfbBaseUrl + "?" + param), nil
 		}
-	}
-	if method == "alipay.trade.page.pay" {
+		return []byte(zfbBaseUrl + "?" + param), nil
+	case "alipay.trade.wap.pay":
 		if !a.IsProd {
 			return []byte(zfbSandboxBaseUrl + "?" + param), nil
+		}
+		return []byte(zfbBaseUrl + "?" + param), nil
+	case "alipay.user.certify.open.certify":
+		if !a.IsProd {
+			return []byte(zfbSandboxBaseUrl + "?" + param), nil
+		}
+		return []byte(zfbBaseUrl + "?" + param), nil
+	default:
+		httpClient := gopay.NewHttpClient()
+		if !a.IsProd {
+			url = zfbSandboxBaseUrlUtf8
 		} else {
-			return []byte(zfbBaseUrl + "?" + param), nil
+			url = zfbBaseUrlUtf8
 		}
-	}
-	httpClient := gopay.NewHttpClient()
-	if !a.IsProd {
-		url = zfbSandboxBaseUrlUtf8
-	} else {
-		url = zfbBaseUrlUtf8
-	}
-	res, bs, errs := httpClient.Type(gopay.TypeForm).Post(url).SendString(param).EndBytes()
-	if len(errs) > 0 {
-		return nil, errs[0]
-	}
-	if res.StatusCode != 200 {
-		return nil, fmt.Errorf("HTTP Request Error, StatusCode = %d", res.StatusCode)
-	}
-	if method == "alipay.trade.wap.pay" {
-		if res.Request.URL.String() == zfbSandboxBaseUrl || res.Request.URL.String() == zfbBaseUrl {
-			return nil, errors.New("alipay.trade.wap.pay error,please check the parameters")
+		res, bs, errs := httpClient.Type(gopay.TypeForm).Post(url).SendString(param).EndBytes()
+		if len(errs) > 0 {
+			return nil, errs[0]
+		}
+		if res.StatusCode != 200 {
+			return nil, fmt.Errorf("HTTP Request Error, StatusCode = %d", res.StatusCode)
 		}
-		return []byte(res.Request.URL.String()), nil
+		return bs, nil
 	}
-	return bs, nil
 }
 
 func getSignData(bs []byte) (signData string) {

+ 387 - 49
alipay/alipay_client_test.go

@@ -1,60 +1,411 @@
 package alipay
 
 import (
-	"encoding/json"
 	"fmt"
-	"strings"
+	"os"
 	"testing"
 
 	"github.com/iGoogle-ink/gopay"
 )
 
-type List struct {
-	BillList []fundBillListInfo `json:"bill_list"`
+var (
+	client          *Client
+	appid           = "2016091200494382"
+	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="
+)
+
+func TestMain(m *testing.M) {
+
+	// 初始化支付宝客户端
+	//    appId:应用ID
+	//    privateKey:应用秘钥
+	//    isProd:是否是正式环境
+	client = NewClient(appid, privateKey, false)
+	// 配置公共参数
+	client.SetCharset("utf-8").
+		SetSignType("RSA2").
+		//SetReturnUrl("https://www.gopay.ink").
+		SetNotifyUrl("https://www.gopay.ink")
+
+	//err := client.SetCertSnByPath("cert/appCertPublicKey.crt", "cert/alipayRootCert.crt", "cert/alipayCertPublicKey_RSA2.crt")
+	//if err != nil {
+	//	fmt.Println("SetCertSnByPath:", err)
+	//	return
+	//}
+
+	os.Exit(m.Run())
 }
 
-func TestJsonToString(t *testing.T) {
+func TestClient_TradePrecreate(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("subject", "预创建创建订单")
+	bm.Set("out_trade_no", gopay.GetRandomString(32))
+	bm.Set("total_amount", "100")
+
+	// 创建订单
+	aliRsp, err := client.TradePrecreate(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+	fmt.Println("aliRsp.QrCode:", aliRsp.Response.QrCode)
+	fmt.Println("aliRsp.OutTradeNo:", aliRsp.Response.OutTradeNo)
+}
 
-	list := new(List)
-	infos := make([]fundBillListInfo, 0)
+func TestClient_TradeCreate(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("subject", "创建订单")
+	bm.Set("buyer_id", "2088802095984694")
+	bm.Set("out_trade_no", "GZ201901301040355709")
+	bm.Set("total_amount", "0.01")
 
-	infos = append(infos, fundBillListInfo{Amount: "1.0.0", FundChannel: "iguiyu"})
-	infos = append(infos, fundBillListInfo{Amount: "2.0.2", FundChannel: "Jerry"})
+	// 创建订单
+	aliRsp, err := client.TradeCreate(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+	fmt.Println("aliRsp.TradeNo:", aliRsp.Response.TradeNo)
+}
 
-	list.BillList = infos
+func TestClient_TradeAppPay(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("subject", "测试APP支付")
+	bm.Set("out_trade_no", "GZ201901301040355706100469")
+	bm.Set("total_amount", "1.00")
 
-	bs, err := json.Marshal(list)
+	// 手机APP支付参数请求
+	payParam, err := client.TradeAppPay(bm)
 	if err != nil {
 		fmt.Println("err:", err)
 		return
 	}
-	fmt.Println("string:", string(bs))
+	fmt.Println("payParam:", payParam)
 }
 
-type People struct {
-	Name string `json:"name,omitempty"`
-	Age  int    `json:"age,omitempty"`
-	List []*struct {
-		Address string `json:"address,omitempty"`
-		Age     int    `json:"age,omitempty"`
-		Phone   string `json:"phone,omitempty"`
-	} `json:"list,omitempty"`
+func TestClient_TradeCancel(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("out_trade_no", "GZ201909081743431443")
+
+	// 撤销支付订单
+	aliRsp, err := client.TradeCancel(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
 }
 
-func TestAliPayParams(t *testing.T) {
-	bodyMap := make(gopay.BodyMap)
+func TestClient_TradeClose(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("out_trade_no", "GZ201909081743431443")
 
-	//people := new(People)
-	//people.Name = "Jerry"
-	//people.Age = 18
-	people := make(map[string]interface{})
-	people["name"] = "jerry"
-	people["age"] = 18
-	bodyMap.Set("people", people)
+	// 条码支付
+	aliRsp, err := client.TradeClose(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_TradePay(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("subject", "条码支付")
+	bm.Set("scene", "bar_code")
+	bm.Set("auth_code", "286248566432274952")
+	bm.Set("out_trade_no", "GZ201909081743431443")
+	bm.Set("total_amount", "0.01")
+	bm.Set("timeout_express", "2m")
 
-	fmt.Println("result:", bodyMap.Get("people"))
+	// 条码支付
+	aliRsp, err := client.TradePay(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+
+	// 同步返回验签
+	ok, err := VerifySyncSign(aliPayPublicKey, aliRsp.SignData, aliRsp.Sign)
+	if err != nil {
+		fmt.Println("err:::", err)
+	}
+	fmt.Println("同步返回验签:", ok)
 }
 
+func TestClient_TradeQuery(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("out_trade_no", "GZ201909081743431443")
+
+	// 查询订单
+	aliRsp, err := client.TradeQuery(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_TradeWapPay(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("subject", "手机网站测试支付")
+	bm.Set("out_trade_no", "GZ201909081743431443")
+	bm.Set("quit_url", "https://www.gopay.ink")
+	bm.Set("total_amount", "100.00")
+	bm.Set("product_code", "QUICK_WAP_WAY")
+
+	// 手机网站支付请求
+	payUrl, err := client.TradeWapPay(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("payUrl:", payUrl)
+}
+
+func TestClient_TradePagePay(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("subject", "网站测试支付")
+	bm.Set("out_trade_no", "GZ201909081743431443")
+	bm.Set("total_amount", "88.88")
+	bm.Set("product_code", "FAST_INSTANT_TRADE_PAY")
+
+	// 电脑网站支付请求
+	payUrl, err := client.TradePagePay(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("payUrl:", payUrl)
+}
+
+func TestClient_TradeRefund(t *testing.T) {
+	// 请求参数
+	body := make(gopay.BodyMap)
+	body.Set("out_trade_no", "GZ201909081743431443")
+	body.Set("refund_amount", "5")
+	body.Set("refund_reason", "测试退款")
+
+	// 发起退款请求
+	aliRsp, err := client.TradeRefund(body)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_TradePageRefund(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("out_trade_no", "GZ201909081743431443")
+	bm.Set("refund_amount", "5")
+	bm.Set("out_request_no", gopay.GetRandomString(32))
+
+	// 发起退款请求
+	aliRsp, err := client.TradePageRefund(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_SystemOauthToken(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("grant_type", "authorization_code")
+	bm.Set("code", "3a06216ac8f84b8c93507bb9774bWX11")
+
+	// 发起请求
+	aliRsp, err := client.SystemOauthToken(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+	fmt.Println("aliRsp:", aliRsp.Response.AccessToken)
+	fmt.Println("aliRsp:", aliRsp.SignData)
+}
+
+func TestClient_TradeOrderSettle(t *testing.T) {
+	//请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("out_request_no", "201907301518083384")
+	bm.Set("trade_no", "2019072522001484690549776067")
+
+	var listParams []OpenApiRoyaltyDetailInfoPojo
+	listParams = append(listParams, OpenApiRoyaltyDetailInfoPojo{"transfer", "2088802095984694", "userId", "userId", "2088102363632794", "0.01", "分账给2088102363632794"})
+
+	bm.Set("royalty_parameters", listParams)
+	//fmt.Println("listParams:", bm.Get("royalty_parameters"))
+
+	// 发起交易结算接口
+	aliRsp, err := client.TradeOrderSettle(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_OpenAuthTokenApp(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("grant_type", "authorization_code")
+	bm.Set("code", "866185490c4e40efa9f71efea6766X02")
+
+	// 发起请求
+	aliRsp, err := client.OpenAuthTokenApp(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_TradeFastPayRefundQuery(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("out_trade_no", "GZ201909081743431443")
+	bm.Set("out_request_no", "GZ201909081743431443")
+
+	// 发起退款查询请求
+	aliRsp, err := client.TradeFastPayRefundQuery(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_FundTransToaccountTransfer(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("out_biz_no", gopay.GetRandomString(32))
+	bm.Set("payee_type", "ALIPAY_LOGONID")
+	bm.Set("payee_account", "otmdfd2378@sandbox.com")
+	bm.Set("amount", "1000")
+	bm.Set("payer_show_name", "发钱人名字")
+	bm.Set("payee_real_name", "沙箱环境")
+	bm.Set("remark", "转账测试")
+
+	// 转账
+	aliRsp, err := client.FundTransToaccountTransfer(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_UserCertifyOpenInit(t *testing.T) {
+	//请求参数
+	bm := make(gopay.BodyMap)
+	bm.Set("outer_order_no", "ZGYD201809132323000001234")
+	// 认证场景码:FACE:多因子人脸认证,CERT_PHOTO:多因子证照认证,CERT_PHOTO_FACE :多因子证照和人脸认证,SMART_FACE:多因子快捷认证
+	bm.Set("biz_code", "FACE")
+	// 需要验证的身份信息参数,格式为json
+	identity := make(map[string]string)
+	identity["identity_type"] = "CERT_INFO"
+	identity["cert_type"] = "IDENTITY_CARD"
+	identity["cert_name"] = "张三"
+	identity["cert_no"] = "310123199012301234"
+	bm.Set("identity_param", identity)
+	// 商户个性化配置,格式为json
+	merchant := make(map[string]string)
+	merchant["return_url"] = "https://www.gopay.ink"
+	bm.Set("merchant_config", merchant)
+
+	// 发起请求
+	aliRsp, err := client.UserCertifyOpenInit(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+func TestClient_UserCertifyOpenCertify(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	// 本次申请操作的唯一标识,由开放认证初始化接口调用后生成,后续的操作都需要用到
+	bm.Set("certify_id", "OC201809253000000393900404029253")
+
+	// 发起请求
+	certifyUrl, err := client.UserCertifyOpenCertify(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("certifyUrl:", certifyUrl)
+}
+
+func TestClient_UserCertifyOpenQuery(t *testing.T) {
+	// 请求参数
+	bm := make(gopay.BodyMap)
+	// 本次申请操作的唯一标识,由开放认证初始化接口调用后生成,后续的操作都需要用到
+	bm.Set("certify_id", "OC201809253000000393900404029253")
+
+	// 发起请求
+	aliRsp, err := client.UserCertifyOpenQuery(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+	fmt.Println("aliRsp.Response.Passed:", aliRsp.Response.Passed)
+
+}
+
+func TestClient_UserInfoShare(t *testing.T) {
+	// 发起请求
+	aliRsp, err := client.UserInfoShare()
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+
+	// 同步返回验签
+	ok, err := VerifySyncSign(aliPayPublicKey, aliRsp.SignData, aliRsp.Sign)
+	if err != nil {
+		fmt.Println("VerifySign-err:", err)
+		return
+	}
+	fmt.Println("ok:", ok)
+}
+
+func TestClient_ZhimaCreditScoreGet(t *testing.T) {
+	// 请求参数
+	body := make(gopay.BodyMap)
+	body.Set("transaction_id", gopay.GetRandomString(48))
+	body.Set("product_code", "w1010100100000000001")
+
+	// 芝麻分
+	aliRsp, err := client.ZhimaCreditScoreGet(body)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}
+
+// =================================================
+
 func TestSyncVerifySign(t *testing.T) {
 	signData := `{"code":"10000","msg":"Success","buyer_logon_id":"854***@qq.com","buyer_pay_amount":"0.01","buyer_user_id":"2088102363632794","fund_bill_list":[{"amount":"0.01","fund_channel":"PCREDIT"}],"gmt_payment":"2019-08-29 20:14:05","invoice_amount":"0.01","out_trade_no":"GZ201901301040361012","point_amount":"0.00","receipt_amount":"0.01","total_amount":"0.01","trade_no":"2019082922001432790585537960"}`
 	sign := "bk3SzX0CZRI811IJioS2XKQHcgMixUT8mYyGQj+vcOAQas7GIYi6LpykqqSc3m7+yvqoG0TdX/c2JjYnpw/J53JxtC2IC4vsLuIPIgghVo5qafsfSxEJ22w20RZDatI2dYqFVcj8Jp+4aesQ8zMMNw7cX9NLyk7kw3DecYeyQp+zrZMueZPqLh88Z+54G+e6QuSU++0ouqQVd4PkpPqy6YI+8MdMUX4Ve0jOQxMmYH8BC6n5ZsTH/uEaLEtzYVZdSw/xdSQ7K1SH73aEH8XbRYx6rL7RkKksrdvhezX+ThDjQ+fTWjvNFrGcg3fmqXRy2elvoalu+BQmqlkWWjEJYA=="
@@ -97,43 +448,30 @@ func TestVerifySign(t *testing.T) {
 	}
 	fmt.Println("OK:", ok)
 }
-func TestSubString(t *testing.T) {
-	str := `{"alipay_trade_pay_response":{"code":"10000","msg":"Success","buyer_logon_id":"854***@qq.com","buyer_pay_amount":"0.01","buyer_user_id":"2088102363632794","fund_bill_list":[{"amount":"0.01","fund_channel":"PCREDIT"}],"gmt_payment":"2019-08-29 20:22:02","invoice_amount":"0.01","out_trade_no":"GZ201901301040361013","point_amount":"0.00","receipt_amount":"0.01","total_amount":"0.01","trade_no":"2019082922001432790585666965"},"sign":"DSX/wmE0nnuxQrWfJZtq0fNntcx5UYtVV35P2VZpoTC2KlIWr4eGNiXcetbb7AkI/1Tyd0+cNtcGMgB7SYzTB15/wDE0vJ+eT5ucqhNkER1kcuCC0k9OkZzU5w8wCJzOgAy52Wso9KnrwkY86mJWt3dC8DNCCi1rlf1a8bTGIBG/diJaKAgP1lGT3aW8jeGGM98zLabqDUNvck2qkgctGR49kBb0ZYmIzmY0x5goVyKnaCkcC/d1VTIIMz81mJbeqU8UZk6TqEplCC8J+dYEUj04pAO4/lwIg/YZdKj3Pz1136/+uy669Pew88+74J/u/zPsehC44PxcUk9YKmkNyw=="}`
-
-	index := strings.Index(str, `":`)
-	fmt.Println("index:", index)
-	indexEnd := strings.Index(str, `,"sign"`)
-	fmt.Println("indexEnd:", indexEnd)
-
-	fmt.Println("sub:", str[index+2:indexEnd])
-}
 
 func TestGetCertSN(t *testing.T) {
-	sn, err := GetCertSN("../examples/alipay_cert/alipayCertPublicKey_RSA2.crt")
+	sn, err := GetCertSN("cert/alipayCertPublicKey_RSA2.crt")
 	if err != nil {
 		fmt.Println("err:", err)
 		return
 	}
+	// 04afd423ea5bd6f5c5482854ed73278c
 	fmt.Println("alipayCertPublicKey_RSA2:", sn)
 
-	sn, err = GetCertSN("../examples/alipay_cert/appCertPublicKey.crt")
+	sn, err = GetCertSN("cert/appCertPublicKey.crt")
 	if err != nil {
 		fmt.Println("err:", err)
 		return
 	}
-	if sn != "4498aaa8ab0c8986c15c41b36186db7d" {
-		t.Fatal("get sigle cert sn error")
-	}
+	// 4498aaa8ab0c8986c15c41b36186db7d
 	fmt.Println("appCertPublicKey:", sn)
 
-	sn, err = GetRootCertSN("../examples/alipay_cert/alipayRootCert.crt")
+	sn, err = GetRootCertSN("cert/alipayRootCert.crt")
 	if err != nil {
 		fmt.Println("err:", err)
 		return
 	}
-	if sn != "687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6" {
-		t.Fatal("get cert chain sn error")
-	}
+	// 687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6
 	fmt.Println("alipay_root_cert_sn:", sn)
 }
 

+ 14 - 28
alipay/alipay_params.go

@@ -66,43 +66,29 @@ func (a *Client) SetAliPayRootCertSN(aliPayRootCertSN string) (client *Client) {
 	return a
 }
 
-// 设置 app_cert_sn 通过应用公钥证书路径
+// 设置 app_cert_sn、alipay_root_cert_sn、alipay_cert_sn 通过应用公钥证书路径
 //    appCertPath:应用公钥证书路径
-func (a *Client) SetAppCertSnByPath(appCertPath string) (client *Client, err error) {
-	sn, err := GetCertSN(appCertPath)
+//    aliPayRootCertPath:支付宝根证书文件路径
+//    aliPayPublicCertPath:支付宝公钥证书文件路径
+func (a *Client) SetCertSnByPath(appCertPath, aliPayRootCertPath, aliPayPublicCertPath string) (err error) {
+	appCertSn, err := GetCertSN(appCertPath)
 	if err != nil {
-		return a, fmt.Errorf("get app_cert_sn return err, but alse return alipay client. err: %v", err)
+		return fmt.Errorf("get app_cert_sn return err, but alse return alipay client. err: %v", err)
 	}
-	a.mu.Lock()
-	a.AppCertSN = sn
-	a.mu.Unlock()
-	return a, nil
-}
-
-// 设置 alipay_cert_sn 通过 支付宝公钥证书文件路径
-//    aliPayPublicCertPath:支付宝公钥证书文件路径
-func (a *Client) SetAliPayPublicCertSnByPath(aliPayPublicCertPath string) (client *Client, err error) {
-	sn, err := GetCertSN(aliPayPublicCertPath)
+	rootCertSn, err := GetRootCertSN(aliPayRootCertPath)
 	if err != nil {
-		return a, fmt.Errorf("get alipay_cert_sn return err, but alse return alipay client. err: %v", err)
+		return fmt.Errorf("get alipay_root_cert_sn return err, but alse return alipay client. err: %v", err)
 	}
-	a.mu.Lock()
-	a.AliPayPublicCertSN = sn
-	a.mu.Unlock()
-	return a, nil
-}
-
-// 设置 alipay_root_cert_sn 通过支付宝CA根证书文件路径
-//    aliPayRootCertPath:支付宝CA根证书文件路径
-func (a *Client) SetAliPayRootCertSnByPath(aliPayRootCertPath string) (client *Client, err error) {
-	sn, err := GetRootCertSN(aliPayRootCertPath)
+	publicCertSn, err := GetCertSN(aliPayPublicCertPath)
 	if err != nil {
-		return a, fmt.Errorf("get alipay_root_cert_sn return err, but alse return alipay client. err: %v", err)
+		return fmt.Errorf("get alipay_cert_sn return err, but alse return alipay client. err: %v", err)
 	}
 	a.mu.Lock()
-	a.AliPayRootCertSN = sn
+	a.AppCertSN = appCertSn
+	a.AliPayRootCertSN = rootCertSn
+	a.AliPayPublicCertSN = publicCertSn
 	a.mu.Unlock()
-	return a, nil
+	return nil
 }
 
 // 设置支付后的ReturnUrl

+ 8 - 11
alipay/alipay_service_api.go

@@ -334,18 +334,16 @@ func GetRootCertSN(rootCertPath string) (sn string, err error) {
 		certData           []byte
 		cert               *x509.Certificate
 		name, serialNumber string
+		certEnd            = `-----END CERTIFICATE-----`
 		h                  hash.Hash
 	)
 	certData, err = ioutil.ReadFile(rootCertPath)
 	if err != nil {
-		return "", err
+		return gopay.NULL, err
 	}
-	pems := strings.Split(string(certData), "\n\n")
-	for i := 0; i < len(pems); i++ {
-		if pems[i] == gopay.NULL {
-			continue
-		}
-		if block, _ := pem.Decode([]byte(pems[i])); block != nil {
+	pems := strings.Split(string(certData), certEnd)
+	for _, c := range pems {
+		if block, _ := pem.Decode([]byte(c + certEnd)); block != nil {
 			if cert, err = x509.ParseCertificate(block.Bytes); err != nil {
 				continue
 			}
@@ -360,13 +358,12 @@ func GetRootCertSN(rootCertPath string) (sn string, err error) {
 			if sn == gopay.NULL {
 				sn += hex.EncodeToString(h.Sum(nil))
 			} else {
-				sn += "_"
-				sn += hex.EncodeToString(h.Sum(nil))
+				sn += "_" + hex.EncodeToString(h.Sum(nil))
 			}
 		}
 	}
-	if sn == "" {
-		return "", errors.New("failed to get sn,please check your cert")
+	if sn == gopay.NULL {
+		return gopay.NULL, errors.New("failed to get sn,please check your cert")
 	}
 	return sn, nil
 }

+ 0 - 0
examples/alipay_cert/alipayCertPublicKey_RSA2.crt → alipay/cert/alipayCertPublicKey_RSA2.crt


+ 0 - 0
examples/alipay_cert/alipayRootCert.crt → alipay/cert/alipayRootCert.crt


+ 0 - 0
examples/alipay_cert/appCertPublicKey.crt → alipay/cert/appCertPublicKey.crt


+ 0 - 0
examples/alipay_cert/java_sdk.txt → alipay/cert/java_sdk.txt


+ 2 - 1
examples/alipay/alipay_FundTransToaccountTransfer.go

@@ -17,6 +17,7 @@ func FundTransToaccountTransfer() {
 	//配置公共参数
 	client.SetCharset("utf-8").
 		SetSignType("RSA2")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	out_biz_no := gopay.GetRandomString(32)
@@ -27,7 +28,7 @@ func FundTransToaccountTransfer() {
 	body.Set("payer_show_name", "发钱人名字")
 	body.Set("payee_real_name", "沙箱环境")
 	body.Set("remark", "转账测试")
-	//创建订单
+	//转账
 	aliRsp, err := client.FundTransToaccountTransfer(body)
 	if err != nil {
 		fmt.Println("err:", err)

+ 1 - 0
examples/alipay/alipay_OpenAuthTokenApp.go

@@ -18,6 +18,7 @@ func OpenAuthTokenApp() {
 	//配置公共参数
 	client.SetCharset("utf-8").
 		SetSignType("RSA2")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("grant_type", "authorization_code")

+ 3 - 3
examples/alipay/alipay_ServiceApi.go

@@ -82,14 +82,14 @@ func ParseNotifyResultAndVerifySign(req *http.Request) {
 }
 
 func GetCertSN() {
-	sn, err := alipay.GetCertSN("alipay_cert/appCertPublicKey.crt")
+	sn, err := alipay.GetCertSN("cert/appCertPublicKey.crt")
 	if err != nil {
 		fmt.Println("err:", err)
 		return
 	}
 	fmt.Println("sn:", sn)
 
-	sn, err = alipay.GetCertSN("alipay_cert/alipayCertPublicKey_RSA2.crt")
+	sn, err = alipay.GetCertSN("cert/alipayCertPublicKey_RSA2.crt")
 	if err != nil {
 		fmt.Println("err:", err)
 		return
@@ -98,7 +98,7 @@ func GetCertSN() {
 }
 
 func GetRootCertSN() {
-	sn, err := alipay.GetRootCertSN("alipay_cert/alipayRootCert.crt")
+	sn, err := alipay.GetRootCertSN("cert/alipayRootCert.crt")
 	if err != nil {
 		fmt.Println("err:", err)
 		return

+ 1 - 0
examples/alipay/alipay_SystemOauthToken.go

@@ -18,6 +18,7 @@ func SystemOauthToken() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetNotifyUrl("https://www.gopay.ink")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("grant_type", "authorization_code")

+ 1 - 0
examples/alipay/alipay_TradeAppPay.go

@@ -19,6 +19,7 @@ func TradeAppPay() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetNotifyUrl("https://www.gopay.ink")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("subject", "测试APP支付")

+ 1 - 0
examples/alipay/alipay_TradeCancel.go

@@ -19,6 +19,7 @@ func TradeCancel() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetNotifyUrl("https://www.gopay.ink")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("out_trade_no", "GYWX201901301040355706100457")

+ 1 - 0
examples/alipay/alipay_TradeClose.go

@@ -19,6 +19,7 @@ func TradeClose() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetNotifyUrl("https://www.gopay.ink")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("out_trade_no", "GYWX201901301040355706100459")

+ 1 - 0
examples/alipay/alipay_TradeCreate.go

@@ -20,6 +20,7 @@ func TradeCreate() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetNotifyUrl("https://www.gopay.ink")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("subject", "创建订单")

+ 1 - 0
examples/alipay/alipay_TradeFastPayRefundQuery.go

@@ -18,6 +18,7 @@ func TradeFastPayRefundQuery() {
 	//配置公共参数
 	client.SetCharset("utf-8").
 		SetSignType("RSA2")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("out_trade_no", "GZ201907301420334577")

+ 1 - 0
examples/alipay/alipay_TradeOrderSettle.go

@@ -17,6 +17,7 @@ func TradeOrderSettle() {
 	//配置公共参数
 	client.SetCharset("utf-8").
 		SetSignType("RSA2")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("out_request_no", "201907301518083384")

+ 1 - 0
examples/alipay/alipay_TradePagePay.go

@@ -19,6 +19,7 @@ func TradePagePay() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetNotifyUrl("https://www.gopay.ink")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("subject", "网站测试支付")

+ 1 - 0
examples/alipay/alipay_TradePay.go

@@ -20,6 +20,7 @@ func TradePay() {
 		SetSignType("RSA2").
 		//SetAppAuthToken("201908BB03f542de8ecc42b985900f5080407abc").
 		SetNotifyUrl("https://www.gopay.ink")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("subject", "条码支付")

+ 1 - 0
examples/alipay/alipay_TradePrecreate.go

@@ -18,6 +18,7 @@ func TradePrecreate() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetNotifyUrl("https://www.gopay.ink")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("subject", "预创建创建订单")

+ 1 - 0
examples/alipay/alipay_TradeQuery.go

@@ -19,6 +19,7 @@ func TradeQuery() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetAppAuthToken("201908BB03f542de8ecc42b985900f5080407abc")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("out_trade_no", "GZ201909081743431443")

+ 1 - 0
examples/alipay/alipay_TradeRefund.go

@@ -18,6 +18,7 @@ func TradeRefund() {
 	//配置公共参数
 	client.SetCharset("utf-8").
 		SetSignType("RSA2")
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	body.Set("out_trade_no", "GZ201907301420334577")

+ 1 - 1
examples/alipay/alipay_UserCertifyOpenCertify.go

@@ -19,7 +19,7 @@ func UserCertifyOpenCertify() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2")
 
-	//请求参数
+	// 请求参数
 	bm := make(gopay.BodyMap)
 	// 本次申请操作的唯一标识,由开放认证初始化接口调用后生成,后续的操作都需要用到
 	bm.Set("certify_id", "OC201809253000000393900404029253")

+ 1 - 1
examples/alipay/alipay_UserCertifyOpenInit.go

@@ -19,7 +19,7 @@ func UserCertifyOpenInit() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2")
 
-	//请求参数
+	// 请求参数
 	bm := make(gopay.BodyMap)
 	bm.Set("outer_order_no", "ZGYD201809132323000001234")
 	// 认证场景码:FACE:多因子人脸认证,CERT_PHOTO:多因子证照认证,CERT_PHOTO_FACE :多因子证照和人脸认证,SMART_FACE:多因子快捷认证

+ 1 - 1
examples/alipay/alipay_UserCertifyOpenQuery.go

@@ -19,7 +19,7 @@ func UserCertifyOpenQuery() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2")
 
-	//请求参数
+	// 请求参数
 	bm := make(gopay.BodyMap)
 	// 本次申请操作的唯一标识,由开放认证初始化接口调用后生成,后续的操作都需要用到
 	bm.Set("certify_id", "OC201809253000000393900404029253")

+ 1 - 1
examples/alipay/alipay_UserInfoShare.go

@@ -19,7 +19,7 @@ func UserInfoShare() {
 		SetSignType("RSA2").
 		SetAuthToken("authusrB3888b190f6df4aea964d66129f8a5X11")
 
-	//发起请求
+	// 发起请求
 	aliRsp, err := client.UserInfoShare()
 	if err != nil {
 		fmt.Println("err:", err)

+ 1 - 0
examples/alipay/alipay_ZhimaCreditScoreGet.go

@@ -18,6 +18,7 @@ func ZhimaCreditScoreGet() {
 	client.SetCharset("utf-8").
 		SetSignType("RSA2").
 		SetAuthToken("") //必须设置此参数
+
 	//请求参数
 	body := make(gopay.BodyMap)
 	transaction_id := gopay.GetRandomString(48)