Jerry 6 лет назад
Родитель
Сommit
8842d4e5f3

+ 10 - 4
README.md

@@ -80,8 +80,11 @@
 * 单笔转账到支付宝账户接口(商户给支付宝用户转账):client.AlipayFundTransToaccountTransfer()
 * 换取授权访问令牌(获取access_token,user_id等信息):client.AliPaySystemOauthToken()
 * 支付宝会员授权信息查询接口(App支付宝登录):client.AlipayUserInfoShare()
-* 换取应用授权令牌(获取app_auth_token,auth_app_id,user_id等信息):client.AlipayOpenAuthTokenApp()
+* 换取应用授权令牌(获取app_auth_token,auth_app_id,user_id等信息):client.AliPayOpenAuthTokenApp()
 * 获取芝麻信用分:client.ZhimaCreditScoreGet()
+* 身份认证初始化服务:client.AliPayUserCertifyOpenInit()
+* 身份认证开始认证:client.AliPayUserCertifyOpenCertify()
+* 身份认证记录查询:client.AliPayUserCertifyOpenQuery()
 
 ### 支付宝公共API
 
@@ -130,7 +133,7 @@ func main() {
 # 二、文档说明
 
 * [GoDoc](https://godoc.org/github.com/iGoogle-ink/gopay)
-
+* 所有方法,如有问题,请仔细查看 examples
 * 有问题请加群。在此,非常感谢那些加群后,提出意见和反馈问题的同志们!另外,仅 Fork 的同志顺手点个星呗,您的支持给了我源源不断的动力
 
 QQ群:
@@ -140,7 +143,7 @@ QQ群:
 
 ---
 
-## 1、初始化GoPay客户端并做配置
+## 1、初始化GoPay客户端并做配置(所有https请求,已忽略https双向认证:InsecureSkipVerify: true)
 
 * #### 微信客户端,如无需更改Appid、Mchid和ApiKey,推荐在 init()方法中初始化,全局适用
 
@@ -285,8 +288,11 @@ aliRsp, err := client.AliPayTradeOrderSettle(bm)
 aliRsp, err := client.AliPayTradePrecreate(bm)
 aliRsp, err := client.AlipayFundTransToaccountTransfer(bm)
 aliRsp, err := client.AliPaySystemOauthToken(bm)
-aliRsp, err := client.AlipayOpenAuthTokenApp(bm)
+aliRsp, err := client.AliPayOpenAuthTokenApp(bm)
 aliRsp, err := client.ZhimaCreditScoreGet(bm)
+aliRsp, err := client.AliPayUserCertifyOpenInit(bm)
+aliRsp, err := client.AliPayUserCertifyOpenCertify(bm)
+aliRsp, err := client.AliPayUserCertifyOpenQuery(bm)
 ```
 
 ## 4、微信统一下单后,获取微信小程序支付、APP支付、微信内H5支付所需要的 paySign

+ 162 - 118
alipay_client.go

@@ -24,7 +24,7 @@ type AliPayClient struct {
 	IsProd           bool
 }
 
-//初始化支付宝客户端
+// 初始化支付宝客户端
 //    注意:如果使用支付宝公钥证书验签,请设置 支付宝根证书SN(client.SetAlipayRootCertSN())、应用公钥证书SN(client.SetAppCertSN())
 //    appId:应用ID
 //    PrivateKey:应用私钥
@@ -37,16 +37,13 @@ func NewAliPayClient(appId, privateKey string, isProd bool) (client *AliPayClien
 	}
 }
 
-//alipay.trade.fastpay.refund.query(统一收单交易退款查询)
+// alipay.trade.fastpay.refund.query(统一收单交易退款查询)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query
 func (a *AliPayClient) AliPayTradeFastPayRefundQuery(body BodyMap) (aliRsp *AliPayTradeFastpayRefundQueryResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	p1 = body.Get("out_trade_no")
-	p2 = body.Get("trade_no")
-	if p1 == null && p2 == null {
+	if body.Get("out_trade_no") == null && body.Get("trade_no") == 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.fastpay.refund.query"); err != nil {
@@ -56,24 +53,21 @@ func (a *AliPayClient) AliPayTradeFastPayRefundQuery(body BodyMap) (aliRsp *AliP
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPayTradeFastpayRefundQueryResponse.Code != "10000" {
-		info := aliRsp.AliPayTradeFastpayRefundQueryResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.order.settle(统一收单交易结算接口)
+// alipay.trade.order.settle(统一收单交易结算接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.order.settle
 func (a *AliPayClient) AliPayTradeOrderSettle(body BodyMap) (aliRsp *AliPayTradeOrderSettleResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	p1 = body.Get("out_request_no")
-	p2 = body.Get("trade_no")
-	if p1 == null || p2 == null {
+	if body.Get("out_request_no") == null || body.Get("trade_no") == null {
 		return nil, errors.New("out_request_no or trade_no are not allowed to be null")
 	}
 	if bs, err = a.doAliPay(body, "alipay.trade.order.settle"); err != nil {
@@ -83,24 +77,21 @@ func (a *AliPayClient) AliPayTradeOrderSettle(body BodyMap) (aliRsp *AliPayTrade
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPayTradeOrderSettleResponse.Code != "10000" {
-		info := aliRsp.AliPayTradeOrderSettleResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.create(统一收单交易创建接口)
+// alipay.trade.create(统一收单交易创建接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.create
 func (a *AliPayClient) AliPayTradeCreate(body BodyMap) (aliRsp *AliPayTradeCreateResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	p1 = body.Get("out_trade_no")
-	p2 = body.Get("buyer_id")
-	if p1 == null && p2 == null {
+	if body.Get("out_trade_no") == null && body.Get("buyer_id") == null {
 		return nil, errors.New("out_trade_no and buyer_id are not allowed to be null at the same time")
 	}
 	if bs, err = a.doAliPay(body, "alipay.trade.create"); err != nil {
@@ -110,24 +101,21 @@ func (a *AliPayClient) AliPayTradeCreate(body BodyMap) (aliRsp *AliPayTradeCreat
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPayTradeCreateResponse.Code != "10000" {
-		info := aliRsp.AliPayTradeCreateResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.close(统一收单交易关闭接口)
+// alipay.trade.close(统一收单交易关闭接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.close
 func (a *AliPayClient) AliPayTradeClose(body BodyMap) (aliRsp *AliPayTradeCloseResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	p1 = body.Get("out_trade_no")
-	p2 = body.Get("trade_no")
-	if p1 == null && p2 == null {
+	if body.Get("out_trade_no") == null && body.Get("trade_no") == 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.close"); err != nil {
@@ -137,24 +125,21 @@ func (a *AliPayClient) AliPayTradeClose(body BodyMap) (aliRsp *AliPayTradeCloseR
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPayTradeCloseResponse.Code != "10000" {
-		info := aliRsp.AliPayTradeCloseResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.cancel(统一收单交易撤销接口)
+// alipay.trade.cancel(统一收单交易撤销接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.cancel
 func (a *AliPayClient) AliPayTradeCancel(body BodyMap) (aliRsp *AliPayTradeCancelResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	p1 = body.Get("out_trade_no")
-	p2 = body.Get("trade_no")
-	if p1 == null && p2 == null {
+	if body.Get("out_trade_no") == null && body.Get("trade_no") == 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.cancel"); err != nil {
@@ -164,24 +149,21 @@ func (a *AliPayClient) AliPayTradeCancel(body BodyMap) (aliRsp *AliPayTradeCance
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPayTradeCancelResponse.Code != "10000" {
-		info := aliRsp.AliPayTradeCancelResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.refund(统一收单交易退款接口)
+// alipay.trade.refund(统一收单交易退款接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.refund
 func (a *AliPayClient) AliPayTradeRefund(body BodyMap) (aliRsp *AliPayTradeRefundResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	p1 = body.Get("out_trade_no")
-	p2 = body.Get("trade_no")
-	if p1 == null && p2 == null {
+	if body.Get("out_trade_no") == null && body.Get("trade_no") == 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.refund"); err != nil {
@@ -191,24 +173,21 @@ func (a *AliPayClient) AliPayTradeRefund(body BodyMap) (aliRsp *AliPayTradeRefun
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AlipayTradeRefundResponse.Code != "10000" {
-		info := aliRsp.AlipayTradeRefundResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.refund(统一收单退款页面接口)
+// alipay.trade.refund(统一收单退款页面接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.page.refund
 func (a *AliPayClient) AliPayTradePageRefund(body BodyMap) (aliRsp *AliPayTradePageRefundResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	p1 = body.Get("out_trade_no")
-	p2 = body.Get("trade_no")
-	if p1 == null && p2 == null {
+	if body.Get("out_trade_no") == null && body.Get("trade_no") == 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 {
@@ -218,20 +197,19 @@ func (a *AliPayClient) AliPayTradePageRefund(body BodyMap) (aliRsp *AliPayTradeP
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPayTradePageRefundResponse.Code != "10000" {
-		info := aliRsp.AliPayTradePageRefundResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.precreate(统一收单线下交易预创建)
+// alipay.trade.precreate(统一收单线下交易预创建)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.precreate
 func (a *AliPayClient) AliPayTradePrecreate(body BodyMap) (aliRsp *AlipayTradePrecreateResponse, err error) {
 	var bs []byte
-	p := body.Get("out_trade_no")
-	if p == null {
+	if body.Get("out_trade_no") == null {
 		return nil, errors.New("out_trade_no is not allowed to be null")
 	}
 	if bs, err = a.doAliPay(body, "alipay.trade.precreate"); err != nil {
@@ -241,20 +219,19 @@ func (a *AliPayClient) AliPayTradePrecreate(body BodyMap) (aliRsp *AlipayTradePr
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AlipayTradePrecreateResponse.Code != "10000" {
-		info := aliRsp.AlipayTradePrecreateResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.pay(统一收单交易支付接口)
+// alipay.trade.pay(统一收单交易支付接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.pay
 func (a *AliPayClient) AliPayTradePay(body BodyMap) (aliRsp *AliPayTradePayResponse, err error) {
 	var bs []byte
-	p := body.Get("out_trade_no")
-	if p == null {
+	if body.Get("out_trade_no") == null {
 		return nil, errors.New("out_trade_no is not allowed to be null")
 	}
 	if bs, err = a.doAliPay(body, "alipay.trade.pay"); err != nil {
@@ -264,24 +241,21 @@ func (a *AliPayClient) AliPayTradePay(body BodyMap) (aliRsp *AliPayTradePayRespo
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPayTradePayResponse.Code != "10000" {
-		info := aliRsp.AliPayTradePayResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.query(统一收单线下交易查询)
+// alipay.trade.query(统一收单线下交易查询)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.query
 func (a *AliPayClient) AliPayTradeQuery(body BodyMap) (aliRsp *AliPayTradeQueryResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	p1 = body.Get("out_trade_no")
-	p2 = body.Get("trade_no")
-	if p1 == null && p2 == null {
+	if body.Get("out_trade_no") == null && body.Get("trade_no") == 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.query"); err != nil {
@@ -291,20 +265,19 @@ func (a *AliPayClient) AliPayTradeQuery(body BodyMap) (aliRsp *AliPayTradeQueryR
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPayTradeQueryResponse.Code != "10000" {
-		info := aliRsp.AliPayTradeQueryResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.app.pay(app支付接口2.0)
+// alipay.trade.app.pay(app支付接口2.0)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.app.pay
 func (a *AliPayClient) AliPayTradeAppPay(body BodyMap) (payParam string, err error) {
 	var bs []byte
-	trade := body.Get("out_trade_no")
-	if trade == null {
+	if body.Get("out_trade_no") == null {
 		return null, errors.New("out_trade_no is not allowed to be null")
 	}
 	if bs, err = a.doAliPay(body, "alipay.trade.app.pay"); err != nil {
@@ -314,12 +287,11 @@ func (a *AliPayClient) AliPayTradeAppPay(body BodyMap) (payParam string, err err
 	return
 }
 
-//alipay.trade.wap.pay(手机网站支付接口2.0)
+// alipay.trade.wap.pay(手机网站支付接口2.0)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.wap.pay
 func (a *AliPayClient) AliPayTradeWapPay(body BodyMap) (payUrl string, err error) {
 	var bs []byte
-	trade := body.Get("out_trade_no")
-	if trade == null {
+	if body.Get("out_trade_no") == null {
 		return null, errors.New("out_trade_no is not allowed to be null")
 	}
 	body.Set("product_code", "QUICK_WAP_WAY")
@@ -330,12 +302,11 @@ func (a *AliPayClient) AliPayTradeWapPay(body BodyMap) (payUrl string, err error
 	return
 }
 
-//alipay.trade.page.pay(统一收单下单并支付页面接口)
+// alipay.trade.page.pay(统一收单下单并支付页面接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.page.pay
 func (a *AliPayClient) AliPayTradePagePay(body BodyMap) (payUrl string, err error) {
 	var bs []byte
-	trade := body.Get("out_trade_no")
-	if trade == null {
+	if body.Get("out_trade_no") == null {
 		return null, errors.New("out_trade_no is not allowed to be null")
 	}
 	body.Set("product_code", "FAST_INSTANT_TRADE_PAY")
@@ -346,12 +317,11 @@ func (a *AliPayClient) AliPayTradePagePay(body BodyMap) (payUrl string, err erro
 	return
 }
 
-//alipay.fund.trans.toaccount.transfer(单笔转账到支付宝账户接口)
+// alipay.fund.trans.toaccount.transfer(单笔转账到支付宝账户接口)
 //    文档地址:https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer
 func (a *AliPayClient) AlipayFundTransToaccountTransfer(body BodyMap) (aliRsp *AlipayFundTransToaccountTransferResponse, err error) {
 	var bs []byte
-	trade1 := body.Get("out_biz_no")
-	if trade1 == null {
+	if body.Get("out_biz_no") == null {
 		return nil, errors.New("out_biz_no is not allowed to be null")
 	}
 	if bs, err = a.doAliPay(body, "alipay.fund.trans.toaccount.transfer"); err != nil {
@@ -361,31 +331,28 @@ func (a *AliPayClient) AlipayFundTransToaccountTransfer(body BodyMap) (aliRsp *A
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AlipayFundTransToaccountTransferResponse.Code != "10000" {
-		info := aliRsp.AlipayFundTransToaccountTransferResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.trade.orderinfo.sync(支付宝订单信息同步接口)
+// alipay.trade.orderinfo.sync(支付宝订单信息同步接口)
 //    文档地址:https://docs.open.alipay.com/api_1/alipay.trade.orderinfo.sync
 func (a *AliPayClient) AliPayTradeOrderinfoSync(body BodyMap) {
 
 }
 
-//alipay.system.oauth.token(换取授权访问令牌)
+// alipay.system.oauth.token(换取授权访问令牌)
 //    文档地址:https://docs.open.alipay.com/api_9/alipay.system.oauth.token
 func (a *AliPayClient) AliPaySystemOauthToken(body BodyMap) (aliRsp *AliPaySystemOauthTokenResponse, err error) {
 	var bs []byte
-	grantType := body.Get("grant_type")
-	if grantType == null {
+	if body.Get("grant_type") == null {
 		return nil, errors.New("grant_type is not allowed to be null")
 	}
-	code := body.Get("code")
-	refreshToken := body.Get("refresh_token")
-	if code == null && refreshToken == null {
+	if body.Get("code") == null && body.Get("refresh_token") == null {
 		return nil, errors.New("code and refresh_token are not allowed to be null at the same time")
 	}
 	if bs, err = aliPaySystemOauthToken(a.AppId, a.PrivateKey, body, "alipay.system.oauth.token", a.IsProd); err != nil {
@@ -395,7 +362,7 @@ func (a *AliPayClient) AliPaySystemOauthToken(body BodyMap) (aliRsp *AliPaySyste
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AliPaySystemOauthTokenResponse.AccessToken == null {
+	if aliRsp.Response.AccessToken == null {
 		info := aliRsp.ErrorResponse
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
@@ -403,7 +370,7 @@ func (a *AliPayClient) AliPaySystemOauthToken(body BodyMap) (aliRsp *AliPaySyste
 	return
 }
 
-//alipay.user.info.share(支付宝会员授权信息查询接口)
+// alipay.user.info.share(支付宝会员授权信息查询接口)
 //    body:此接口无需body参数
 //    文档地址:https://docs.open.alipay.com/api_2/alipay.user.info.share
 func (a *AliPayClient) AlipayUserInfoShare() (aliRsp *AlipayUserInfoShareResponse, err error) {
@@ -415,53 +382,49 @@ func (a *AliPayClient) AlipayUserInfoShare() (aliRsp *AlipayUserInfoShareRespons
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AlipayUserInfoShareResponse.Code != "10000" {
-		info := aliRsp.AlipayUserInfoShareResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//alipay.open.auth.token.app(换取应用授权令牌)
+// alipay.open.auth.token.app(换取应用授权令牌)
 //    文档地址:https://docs.open.alipay.com/api_9/alipay.open.auth.token.app
-func (a *AliPayClient) AlipayOpenAuthTokenApp(body BodyMap) (aliRsp *AlipayOpenAuthTokenAppResponse, err error) {
+func (a *AliPayClient) AliPayOpenAuthTokenApp(body BodyMap) (aliRsp *AliPayOpenAuthTokenAppResponse, err error) {
 	var bs []byte
-	grantType := body.Get("grant_type")
-	if grantType == null {
+	if body.Get("grant_type") == null {
 		return nil, errors.New("grant_type is not allowed to be null")
 	}
-	code := body.Get("code")
-	refreshToken := body.Get("refresh_token")
-	if code == null && refreshToken == null {
+	if body.Get("code") == null && body.Get("refresh_token") == null {
 		return nil, errors.New("code and refresh_token are not allowed to be null at the same time")
 	}
 	if bs, err = a.doAliPay(body, "alipay.open.auth.token.app"); err != nil {
 		return
 	}
-	aliRsp = new(AlipayOpenAuthTokenAppResponse)
+	aliRsp = new(AliPayOpenAuthTokenAppResponse)
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.AlipayOpenAuthTokenAppResponse.Code != "10000" {
-		info := aliRsp.AlipayOpenAuthTokenAppResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//zhima.credit.score.get(芝麻分)
+// zhima.credit.score.get(芝麻分)
 //    文档地址:https://docs.open.alipay.com/api_8/zhima.credit.score.get
 func (a *AliPayClient) ZhimaCreditScoreGet(body BodyMap) (aliRsp *ZhimaCreditScoreGetResponse, err error) {
 	var (
-		p1, p2 string
-		bs     []byte
+		bs []byte
 	)
-	if p1 = body.Get("product_code"); p1 == null {
+	if body.Get("product_code") == null {
 		body.Set("product_code", "w1010100100000000001")
 	}
-	if p2 = body.Get("transaction_id"); p2 == null {
+	if body.Get("transaction_id") == null {
 		return nil, errors.New("transaction_id is not allowed to be null")
 	}
 	if bs, err = a.doAliPay(body, "zhima.credit.score.get"); err != nil {
@@ -471,15 +434,96 @@ func (a *AliPayClient) ZhimaCreditScoreGet(body BodyMap) (aliRsp *ZhimaCreditSco
 	if err = json.Unmarshal(bs, aliRsp); err != nil {
 		return nil, err
 	}
-	if aliRsp.ZhimaCreditScoreGetResponse.Code != "10000" {
-		info := aliRsp.ZhimaCreditScoreGetResponse
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
 		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
 	}
 	aliRsp.SignData = getSignData(bs)
 	return
 }
 
-//向支付宝发送请求
+// alipay.user.certify.open.initialize(身份认证初始化服务)
+//    文档地址:https://docs.open.alipay.com/api_2/alipay.user.certify.open.initialize
+func (a *AliPayClient) AliPayUserCertifyOpenInit(body BodyMap) (aliRsp *AliPayUserCertifyOpenInitResponse, err error) {
+	var (
+		bs []byte
+	)
+	if body.Get("biz_code") == null {
+		return nil, errors.New("biz_code is not allowed to be null")
+	}
+	if body.Get("outer_order_no") == null {
+		return nil, errors.New("outer_order_no is not allowed to be null")
+	}
+	if body.Get("identity_param") == null {
+		return nil, errors.New("identity_param is not allowed to be null")
+	}
+	if body.Get("merchant_config") == null {
+		return nil, errors.New("merchant_config is not allowed to be null")
+	}
+	if bs, err = a.doAliPay(body, "alipay.user.certify.open.initialize"); err != nil {
+		return
+	}
+	aliRsp = new(AliPayUserCertifyOpenInitResponse)
+	if err = json.Unmarshal(bs, aliRsp); err != nil {
+		return nil, err
+	}
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
+		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
+	}
+	aliRsp.SignData = getSignData(bs)
+	return
+}
+
+// alipay.user.certify.open.certify(身份认证开始认证)
+//    文档地址:https://docs.open.alipay.com/api_2/alipay.user.certify.open.certify
+func (a *AliPayClient) AliPayUserCertifyOpenCertify(body BodyMap) (aliRsp *AliPayUserCertifyOpenCertifyResponse, err error) {
+	var (
+		bs []byte
+	)
+	if body.Get("certify_id") == null {
+		return nil, errors.New("certify_id is not allowed to be null")
+	}
+	if bs, err = a.doAliPay(body, "alipay.user.certify.open.certify"); err != nil {
+		return
+	}
+	aliRsp = new(AliPayUserCertifyOpenCertifyResponse)
+	if err = json.Unmarshal(bs, aliRsp); err != nil {
+		return nil, err
+	}
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
+		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
+	}
+	aliRsp.SignData = getSignData(bs)
+	return
+}
+
+// alipay.user.certify.open.query(身份认证记录查询)
+//    文档地址:https://docs.open.alipay.com/api_2/alipay.user.certify.open.query
+func (a *AliPayClient) AliPayUserCertifyOpenQuery(body BodyMap) (aliRsp *AliPayUserCertifyOpenQueryResponse, err error) {
+	var (
+		bs []byte
+	)
+	if body.Get("certify_id") == null {
+		return nil, errors.New("certify_id is not allowed to be null")
+	}
+	if bs, err = a.doAliPay(body, "alipay.user.certify.open.query"); err != nil {
+		return
+	}
+	aliRsp = new(AliPayUserCertifyOpenQueryResponse)
+	if err = json.Unmarshal(bs, aliRsp); err != nil {
+		return nil, err
+	}
+	if aliRsp.Response.Code != "10000" {
+		info := aliRsp.Response
+		return nil, fmt.Errorf(`{"code":"%v","msg":"%v","sub_code":"%v","sub_msg":"%v"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
+	}
+	aliRsp.SignData = getSignData(bs)
+	return
+}
+
+// 向支付宝发送请求
 func (a *AliPayClient) doAliPay(body BodyMap, method string) (bytes []byte, err error) {
 	var (
 		bodyStr, sign, url, urlParam string

+ 91 - 45
alipay_rsp.go

@@ -68,9 +68,9 @@ type AliPayUserPhone struct {
 
 //===================================================
 type AliPayTradePayResponse struct {
-	AliPayTradePayResponse payResponse `json:"alipay_trade_pay_response,omitempty"`
-	SignData               string      `json:"-"`
-	Sign                   string      `json:"sign"`
+	Response payResponse `json:"alipay_trade_pay_response,omitempty"`
+	SignData string      `json:"-"`
+	Sign     string      `json:"sign"`
 }
 
 type payResponse struct {
@@ -131,9 +131,9 @@ type payResponse struct {
 
 //===================================================
 type AliPayTradeQueryResponse struct {
-	AliPayTradeQueryResponse queryResponse `json:"alipay_trade_query_response,omitempty"`
-	SignData                 string        `json:"-"`
-	Sign                     string        `json:"sign"`
+	Response queryResponse `json:"alipay_trade_query_response,omitempty"`
+	SignData string        `json:"-"`
+	Sign     string        `json:"sign"`
 }
 
 type queryResponse struct {
@@ -194,9 +194,9 @@ type queryResponse struct {
 
 //===================================================
 type AliPayTradeCreateResponse struct {
-	AliPayTradeCreateResponse createResponse `json:"alipay_trade_create_response,omitempty"`
-	SignData                  string         `json:"-"`
-	Sign                      string         `json:"sign"`
+	Response createResponse `json:"alipay_trade_create_response,omitempty"`
+	SignData string         `json:"-"`
+	Sign     string         `json:"sign"`
 }
 
 type createResponse struct {
@@ -210,9 +210,9 @@ type createResponse struct {
 
 //===================================================
 type AliPayTradeCloseResponse struct {
-	AliPayTradeCloseResponse closeResponse `json:"alipay_trade_close_response,omitempty"`
-	SignData                 string        `json:"-"`
-	Sign                     string        `json:"sign"`
+	Response closeResponse `json:"alipay_trade_close_response,omitempty"`
+	SignData string        `json:"-"`
+	Sign     string        `json:"sign"`
 }
 
 type closeResponse struct {
@@ -226,9 +226,9 @@ type closeResponse struct {
 
 //===================================================
 type AliPayTradeCancelResponse struct {
-	AliPayTradeCancelResponse cancelResponse `json:"alipay_trade_cancel_response,omitempty"`
-	SignData                  string         `json:"-"`
-	Sign                      string         `json:"sign"`
+	Response cancelResponse `json:"alipay_trade_cancel_response,omitempty"`
+	SignData string         `json:"-"`
+	Sign     string         `json:"sign"`
 }
 
 type cancelResponse struct {
@@ -246,8 +246,8 @@ type cancelResponse struct {
 
 //===================================================
 type AliPaySystemOauthTokenResponse struct {
-	AliPaySystemOauthTokenResponse oauthTokenInfo `json:"alipay_system_oauth_token_response,omitempty"`
-	ErrorResponse                  struct {
+	Response      oauthTokenInfo `json:"alipay_system_oauth_token_response,omitempty"`
+	ErrorResponse struct {
 		Code    string `json:"code,omitempty"`
 		Msg     string `json:"msg,omitempty"`
 		SubCode string `json:"sub_code,omitempty"`
@@ -267,9 +267,9 @@ type oauthTokenInfo struct {
 
 //===================================================
 type AlipayUserInfoShareResponse struct {
-	AlipayUserInfoShareResponse userInfoShare `json:"alipay_user_info_share_response,omitempty"`
-	SignData                    string        `json:"-"`
-	Sign                        string        `json:"sign"`
+	Response userInfoShare `json:"alipay_user_info_share_response,omitempty"`
+	SignData string        `json:"-"`
+	Sign     string        `json:"sign"`
 }
 
 type userInfoShare struct {
@@ -291,9 +291,9 @@ type userInfoShare struct {
 
 //===================================================
 type AliPayTradeRefundResponse struct {
-	AlipayTradeRefundResponse refundResponse `json:"alipay_trade_refund_response,omitempty"`
-	SignData                  string         `json:"-"`
-	Sign                      string         `json:"sign"`
+	Response refundResponse `json:"alipay_trade_refund_response,omitempty"`
+	SignData string         `json:"-"`
+	Sign     string         `json:"sign"`
 }
 
 type refundResponse struct {
@@ -331,9 +331,9 @@ type tradeFundBill struct {
 
 //===================================================
 type AliPayTradeFastpayRefundQueryResponse struct {
-	AliPayTradeFastpayRefundQueryResponse refundQueryResponse `json:"alipay_trade_fastpay_refund_query_response,omitempty"`
-	SignData                              string              `json:"-"`
-	Sign                                  string              `json:"sign"`
+	Response refundQueryResponse `json:"alipay_trade_fastpay_refund_query_response,omitempty"`
+	SignData string              `json:"-"`
+	Sign     string              `json:"sign"`
 }
 
 type refundQueryResponse struct {
@@ -367,9 +367,9 @@ type refundQueryResponse struct {
 
 //===================================================
 type AliPayTradeOrderSettleResponse struct {
-	AliPayTradeOrderSettleResponse orderSettleResponse `json:"alipay_trade_order_settle_response,omitempty"`
-	SignData                       string              `json:"-"`
-	Sign                           string              `json:"sign"`
+	Response orderSettleResponse `json:"alipay_trade_order_settle_response,omitempty"`
+	SignData string              `json:"-"`
+	Sign     string              `json:"sign"`
 }
 type orderSettleResponse struct {
 	Code    string `json:"code,omitempty"`
@@ -381,9 +381,9 @@ type orderSettleResponse struct {
 
 //===================================================
 type AlipayTradePrecreateResponse struct {
-	AlipayTradePrecreateResponse precreateResponse `json:"alipay_trade_precreate_response,omitempty"`
-	SignData                     string            `json:"-"`
-	Sign                         string            `json:"sign"`
+	Response precreateResponse `json:"alipay_trade_precreate_response,omitempty"`
+	SignData string            `json:"-"`
+	Sign     string            `json:"sign"`
 }
 
 type precreateResponse struct {
@@ -397,9 +397,9 @@ type precreateResponse struct {
 
 //===================================================
 type AliPayTradePageRefundResponse struct {
-	AliPayTradePageRefundResponse pageRefundResponse `json:"alipay_trade_page_refund_response,omitempty"`
-	SignData                      string             `json:"-"`
-	Sign                          string             `json:"sign"`
+	Response pageRefundResponse `json:"alipay_trade_page_refund_response,omitempty"`
+	SignData string             `json:"-"`
+	Sign     string             `json:"sign"`
 }
 
 type pageRefundResponse struct {
@@ -415,9 +415,9 @@ type pageRefundResponse struct {
 
 //===================================================
 type AlipayFundTransToaccountTransferResponse struct {
-	AlipayFundTransToaccountTransferResponse transToaccountTransferResponse `json:"alipay_fund_trans_toaccount_transfer_response,omitempty"`
-	SignData                                 string                         `json:"-"`
-	Sign                                     string                         `json:"sign"`
+	Response transToaccountTransferResponse `json:"alipay_fund_trans_toaccount_transfer_response,omitempty"`
+	SignData string                         `json:"-"`
+	Sign     string                         `json:"sign"`
 }
 
 type transToaccountTransferResponse struct {
@@ -432,9 +432,9 @@ type transToaccountTransferResponse struct {
 
 //===================================================
 type ZhimaCreditScoreGetResponse struct {
-	ZhimaCreditScoreGetResponse scoreGetResponse `json:"zhima_credit_score_get_response,omitempty"`
-	SignData                    string           `json:"-"`
-	Sign                        string           `json:"sign"`
+	Response scoreGetResponse `json:"zhima_credit_score_get_response,omitempty"`
+	SignData string           `json:"-"`
+	Sign     string           `json:"sign"`
 }
 
 type scoreGetResponse struct {
@@ -447,10 +447,10 @@ type scoreGetResponse struct {
 }
 
 //===================================================
-type AlipayOpenAuthTokenAppResponse struct {
-	AlipayOpenAuthTokenAppResponse authTokenAppResponse `json:"alipay_open_auth_token_app_response,omitempty"`
-	SignData                       string               `json:"-"`
-	Sign                           string               `json:"sign"`
+type AliPayOpenAuthTokenAppResponse struct {
+	Response authTokenAppResponse `json:"alipay_open_auth_token_app_response,omitempty"`
+	SignData string               `json:"-"`
+	Sign     string               `json:"sign"`
 }
 
 type authTokenAppResponse struct {
@@ -473,3 +473,49 @@ type authTokenAppResponse struct {
 		UserId          string `json:"user_id,omitempty"`
 	} `json:"tokens,omitempty"`
 }
+
+//===================================================
+type AliPayUserCertifyOpenInitResponse struct {
+	Response userCertifyOpenInitResponse `json:"alipay_user_certify_open_initialize_response,omitempty"`
+	SignData string                      `json:"-"`
+	Sign     string                      `json:"sign"`
+}
+
+type userCertifyOpenInitResponse struct {
+	Code      string `json:"code,omitempty"`
+	Msg       string `json:"msg,omitempty"`
+	SubCode   string `json:"sub_code,omitempty"`
+	SubMsg    string `json:"sub_msg,omitempty"`
+	CertifyId string `json:"certify_id,omitempty"`
+}
+
+//===================================================
+type AliPayUserCertifyOpenCertifyResponse struct {
+	Response userCertifyOpenCertifyResponse `json:"alipay_user_certify_open_certify_response,omitempty"`
+	SignData string                         `json:"-"`
+	Sign     string                         `json:"sign"`
+}
+
+type userCertifyOpenCertifyResponse struct {
+	Code    string `json:"code,omitempty"`
+	Msg     string `json:"msg,omitempty"`
+	SubCode string `json:"sub_code,omitempty"`
+	SubMsg  string `json:"sub_msg,omitempty"`
+}
+
+//===================================================
+type AliPayUserCertifyOpenQueryResponse struct {
+	Response userCertifyOpenQueryResponse `json:"alipay_user_certify_open_query_response,omitempty"`
+	SignData string                       `json:"-"`
+	Sign     string                       `json:"sign"`
+}
+
+type userCertifyOpenQueryResponse struct {
+	Code         string   `json:"code,omitempty"`
+	Msg          string   `json:"msg,omitempty"`
+	SubCode      string   `json:"sub_code,omitempty"`
+	SubMsg       string   `json:"sub_msg,omitempty"`
+	Passed       []string `json:"passed,omitempty"`
+	IdentityInfo string   `json:"identity_info,omitempty"`
+	MaterialInfo string   `json:"material_info,omitempty"`
+}

+ 3 - 3
alipay_service_api.go

@@ -280,8 +280,8 @@ func GetCertSN(certPath string) (sn string, err error) {
 			}
 		}
 	}
-	if sn == ""{
-		return "",errors.New("failed to get sn,please check your cert")
+	if sn == "" {
+		return "", errors.New("failed to get sn,please check your cert")
 	}
 	return sn, nil
 }
@@ -385,7 +385,7 @@ func AliPaySystemOauthToken(appId, privateKey, grantType, codeOrToken string) (r
 	if err = json.Unmarshal(bs, rsp); err != nil {
 		return nil, fmt.Errorf("json.Unmarshal:%v", err.Error())
 	}
-	if rsp.AliPaySystemOauthTokenResponse.AccessToken == "" {
+	if rsp.Response.AccessToken == "" {
 		return nil, errors.New("access_token is null")
 	}
 	return

+ 1 - 1
constant.go

@@ -4,7 +4,7 @@ const (
 	null       string = ""
 	TimeLayout string = "2006-01-02 15:04:05"
 	DateLayout string = "2006-01-02"
-	Version    string = "1.4.1"
+	Version    string = "1.4.2"
 	//微信
 	//===========================================================================================
 

+ 3 - 3
examples/alipay/alipay_AliPaySystemOauthToken.go

@@ -29,13 +29,13 @@ func AliPaySystemOauthToken() {
 		return
 	}
 	fmt.Println("aliRsp:", *aliRsp)
-	fmt.Println("aliRsp:", aliRsp.AliPaySystemOauthTokenResponse.AccessToken)
+	fmt.Println("aliRsp:", aliRsp.Response.AccessToken)
 	fmt.Println("aliRsp:", aliRsp.SignData)
 
 	//支付宝小程序创建订单
 	body2 := make(gopay.BodyMap)
 	body2.Set("subject", "创建订单")
-	body2.Set("buyer_id", aliRsp.AliPaySystemOauthTokenResponse.UserId)
+	body2.Set("buyer_id", aliRsp.Response.UserId)
 	body2.Set("out_trade_no", "GZ201901301040355708")
 	body2.Set("total_amount", "0.01")
 
@@ -45,5 +45,5 @@ func AliPaySystemOauthToken() {
 		return
 	}
 	fmt.Println("rsp:", *rsp)
-	fmt.Println("TradeNo:", rsp.AliPayTradeCreateResponse.TradeNo)
+	fmt.Println("TradeNo:", rsp.Response.TradeNo)
 }

+ 1 - 1
examples/alipay/alipay_AliPayTradeCreate.go

@@ -32,5 +32,5 @@ func AliPayTradeCreate() {
 		return
 	}
 	fmt.Println("aliRsp:", *aliRsp)
-	fmt.Println("aliRsp.TradeNo:", aliRsp.AliPayTradeCreateResponse.TradeNo)
+	fmt.Println("aliRsp.TradeNo:", aliRsp.Response.TradeNo)
 }

+ 2 - 2
examples/alipay/alipay_AliPayTradePrecreate.go

@@ -29,6 +29,6 @@ func AliPayTradePrecreate() {
 		return
 	}
 	fmt.Println("aliRsp:", *aliRsp)
-	fmt.Println("aliRsp.QrCode:", aliRsp.AlipayTradePrecreateResponse.QrCode)
-	fmt.Println("aliRsp.OutTradeNo:", aliRsp.AlipayTradePrecreateResponse.OutTradeNo)
+	fmt.Println("aliRsp.QrCode:", aliRsp.Response.QrCode)
+	fmt.Println("aliRsp.OutTradeNo:", aliRsp.Response.OutTradeNo)
 }

+ 34 - 0
examples/alipay/alipay_AliPayUserCertifyOpenCertify.go

@@ -0,0 +1,34 @@
+package alipay
+
+import (
+	"fmt"
+
+	"github.com/iGoogle-ink/gopay"
+)
+
+func AliPayUserCertifyOpenCertify() {
+	//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="
+	//初始化支付宝客户端
+	//    appId:应用ID
+	//    privateKey:应用秘钥
+	//    isProd:是否是正式环境
+	client := gopay.NewAliPayClient("2016091200494382", privateKey, false)
+	//配置公共参数
+	client.SetCharset("utf-8").
+		SetSignType("RSA2")
+
+	//请求参数
+	bm := make(gopay.BodyMap)
+	// 本次申请操作的唯一标识,由开放认证初始化接口调用后生成,后续的操作都需要用到
+	bm.Set("certify_id", "OC201809253000000393900404029253")
+
+	//发起请求
+	aliRsp, err := client.AliPayUserCertifyOpenCertify(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+
+}

+ 45 - 0
examples/alipay/alipay_AliPayUserCertifyOpenInit.go

@@ -0,0 +1,45 @@
+package alipay
+
+import (
+	"fmt"
+
+	"github.com/iGoogle-ink/gopay"
+)
+
+func AliPayUserCertifyOpenInit() {
+	//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="
+	//初始化支付宝客户端
+	//    appId:应用ID
+	//    privateKey:应用秘钥
+	//    isProd:是否是正式环境
+	client := gopay.NewAliPayClient("2016091200494382", privateKey, false)
+	//配置公共参数
+	client.SetCharset("utf-8").
+		SetSignType("RSA2")
+
+	//请求参数
+	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.AliPayUserCertifyOpenInit(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+}

+ 34 - 0
examples/alipay/alipay_AliPayUserCertifyOpenQuery.go

@@ -0,0 +1,34 @@
+package alipay
+
+import (
+	"fmt"
+
+	"github.com/iGoogle-ink/gopay"
+)
+
+func AliPayUserCertifyOpenQuery() {
+	//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="
+	//初始化支付宝客户端
+	//    appId:应用ID
+	//    privateKey:应用秘钥
+	//    isProd:是否是正式环境
+	client := gopay.NewAliPayClient("2016091200494382", privateKey, false)
+	//配置公共参数
+	client.SetCharset("utf-8").
+		SetSignType("RSA2")
+
+	//请求参数
+	bm := make(gopay.BodyMap)
+	// 本次申请操作的唯一标识,由开放认证初始化接口调用后生成,后续的操作都需要用到
+	bm.Set("certify_id", "OC201809253000000393900404029253")
+
+	//发起请求
+	aliRsp, err := client.AliPayUserCertifyOpenQuery(bm)
+	if err != nil {
+		fmt.Println("err:", err)
+		return
+	}
+	fmt.Println("aliRsp:", *aliRsp)
+	fmt.Println("aliRsp.Response.Passed:", aliRsp.Response.Passed)
+}

+ 1 - 1
examples/alipay/alipay_AlipayOpenAuthTokenApp.go

@@ -22,7 +22,7 @@ func AlipayOpenAuthTokenApp() {
 	body.Set("grant_type", "authorization_code")
 	body.Set("code", "866185490c4e40efa9f71efea6766X02")
 	//发起请求
-	aliRsp, err := client.AlipayOpenAuthTokenApp(body)
+	aliRsp, err := client.AliPayOpenAuthTokenApp(body)
 	if err != nil {
 		fmt.Println("err:", err)
 		return

+ 1 - 0
go.mod

@@ -3,6 +3,7 @@ module github.com/iGoogle-ink/gopay
 go 1.13
 
 require (
+	github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
 	github.com/parnurzeal/gorequest v0.2.16
 	github.com/pkg/errors v0.8.1 // indirect
 	golang.org/x/net v0.0.0-20191109021931-daa7c04131f5 // indirect

+ 0 - 10
go.sum

@@ -2,25 +2,15 @@ github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 h1:pEtiCjIXx3RvGjl
 github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
 github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM=
 github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/parnurzeal/gorequest v0.2.16 h1:T/5x+/4BT+nj+3eSknXmCTnEVGSzFzPGdpqmUVVZXHQ=
 github.com/parnurzeal/gorequest v0.2.16/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE=
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20191109021931-daa7c04131f5 h1:bHNaocaoJxYBo5cw41UyTMLjYlb8wPY7+WFrnklbHOM=
 golang.org/x/net v0.0.0-20191109021931-daa7c04131f5/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 moul.io/http2curl v1.0.0 h1:6XwpyZOYsgZJrU8exnG87ncVkU1FVCcTRpwzOkTDUi8=
 moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE=

+ 16 - 0
release_note.txt

@@ -1,3 +1,19 @@
+
+版本号:Release 1.4.2
+发布时间:2019/11/11 16:43
+修改记录:
+   (1) 支付宝:新增Client方法:client.AliPayUserCertifyOpenInit(),身份认证初始化服务
+   (2) 支付宝:新增Client方法:client.AliPayUserCertifyOpenCertify(),身份认证开始认证
+   (3) 支付宝:新增Client方法:client.AliPayUserCertifyOpenQuery(),身份认证记录查询
+   (4) 支付宝:所有方法的返回结构体下的 XxxResponse 字段,统一修改为 Response,如:
+       type AliPayTradeCreateResponse struct {
+        Response createResponse `json:"alipay_trade_create_response,omitempty"`
+        SignData string         `json:"-"`
+        Sign     string         `json:"sign"`
+       }
+   (5) 支付宝:修改一些代码格式问题
+   (6) 支付宝:client.AlipayOpenAuthTokenApp() 修改为 client.AliPayOpenAuthTokenApp()
+
 版本号:Release 1.4.1
 发布时间:2019/11/04 14:28
 修改记录: