diff --git a/alipay/client_request.go b/alipay/client_request.go index 5bc3b3cd..6a038ae6 100644 --- a/alipay/client_request.go +++ b/alipay/client_request.go @@ -162,7 +162,9 @@ func (a *Client) doAliPay(ctx context.Context, bm gopay.BodyMap, method string, return nil, err } switch method { - case "alipay.trade.app.pay", "alipay.fund.auth.order.app.freeze", "zhima.credit.pe.zmgo.sign.apply", "zhima.credit.payafteruse.creditagreement.sign": + case "alipay.trade.app.pay", "alipay.fund.auth.order.app.freeze", + "alipay.fund.trans.app.pay", "alipay.user.agreement.page.sign", + "zhima.credit.pe.zmgo.sign.apply", "zhima.credit.payafteruse.creditagreement.sign": return []byte(param), nil case "alipay.trade.wap.pay", "alipay.trade.page.pay", "alipay.user.certify.open.certify": if !a.IsProd { @@ -218,7 +220,9 @@ func (a *Client) DoAliPay(ctx context.Context, bm gopay.BodyMap, method string, return nil, err } switch method { - case "alipay.trade.app.pay", "alipay.fund.auth.order.app.freeze": + case "alipay.trade.app.pay", "alipay.fund.auth.order.app.freeze", + "alipay.fund.trans.app.pay", "alipay.user.agreement.page.sign", + "zhima.credit.pe.zmgo.sign.apply", "zhima.credit.payafteruse.creditagreement.sign": return []byte(param), nil case "alipay.trade.wap.pay", "alipay.trade.page.pay", "alipay.user.certify.open.certify": if !a.IsProd { @@ -244,7 +248,7 @@ func (a *Client) DoAliPay(ctx context.Context, bm gopay.BodyMap, method string, } } -// 保持和官方 SDK 命名方式一致 +// Deprecated func (a *Client) PageExecute(ctx context.Context, bm gopay.BodyMap, method string, authToken ...string) (url string, err error) { var ( bizContent string diff --git a/alipay/funds_api.go b/alipay/funds_api.go index 03b7c386..ea65cacb 100644 --- a/alipay/funds_api.go +++ b/alipay/funds_api.go @@ -171,7 +171,7 @@ func (a *Client) FundAuthOrderVoucherCreate(ctx context.Context, bm gopay.BodyMa // alipay.fund.auth.order.app.freeze(线上资金授权冻结接口) // 文档地址: https://opendocs.alipay.com/open/02f912 -func (a *Client) FundAuthOrderAppFreeze(ctx context.Context, bm gopay.BodyMap) (payParam string, err error) { +func (a *Client) FundAuthOrderAppFreeze(ctx context.Context, bm gopay.BodyMap) (orderStr string, err error) { err = bm.CheckEmptyError("out_order_no", "out_request_no", "order_title", "amount", "product_code") if err != nil { return gopay.NULL, err @@ -180,8 +180,8 @@ func (a *Client) FundAuthOrderAppFreeze(ctx context.Context, bm gopay.BodyMap) ( if bs, err = a.doAliPay(ctx, bm, "alipay.fund.auth.order.app.freeze"); err != nil { return "", err } - payParam = string(bs) - return payParam, nil + orderStr = string(bs) + return orderStr, nil } // alipay.fund.auth.order.unfreeze(资金授权解冻接口) @@ -320,25 +320,17 @@ func (a *Client) FundBatchDetailQuery(ctx context.Context, bm gopay.BodyMap) (al // alipay.fund.trans.app.pay(现金红包无线支付接口) // 文档地址: https://opendocs.alipay.com/open/03rbyf -func (a *Client) FundTransAppPay(ctx context.Context, bm gopay.BodyMap) (aliRsp *FundTransAppPayResponse, err error) { +func (a *Client) FundTransAppPay(ctx context.Context, bm gopay.BodyMap) (pageRedirectionData string, err error) { err = bm.CheckEmptyError("out_biz_no", "trans_amount", "product_code", "biz_scene") if err != nil { - return nil, err + return gopay.NULL, err } var bs []byte if bs, err = a.doAliPay(ctx, bm, "alipay.fund.trans.app.pay"); err != nil { - return nil, err - } - aliRsp = new(FundTransAppPayResponse) - if err = json.Unmarshal(bs, aliRsp); err != nil || aliRsp.Response == nil { - return nil, fmt.Errorf("[%w], bytes: %s", gopay.UnmarshalErr, string(bs)) - } - if err = bizErrCheck(aliRsp.Response.ErrorResponse); err != nil { - return aliRsp, err + return "", err } - signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn) - aliRsp.SignData = signData - return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) + pageRedirectionData = string(bs) + return pageRedirectionData, nil } // alipay.fund.trans.payee.bind.query(资金收款账号绑定关系查询) diff --git a/alipay/funds_api_test.go b/alipay/funds_api_test.go index 63873ec5..52fb2437 100644 --- a/alipay/funds_api_test.go +++ b/alipay/funds_api_test.go @@ -98,8 +98,24 @@ func TestClient_FundTransPagePay(t *testing.T) { aliRsp, err := client.FundTransPagePay(ctx, bm) if err != nil { - //xlog.Errorf("client.FundTransPagePay(%+v),error:%+v", bm, err) + xlog.Errorf("client.FundTransPagePay(%+v),err:%+v", bm, err) return } xlog.Debug("aliRsp:", *aliRsp) } + +func TestClient_FundTransAppPay(t *testing.T) { + bm := make(gopay.BodyMap) + bm.Set("out_biz_no", "20180628000035"). + Set("trans_amount", "8.88"). + Set("product_code", "STD_RED_PACKET"). + Set("biz_scene", "PERSONAL_PAY"). + Set("order_title", "钉钉拼手气红包") + + pageRedirectionData, err := client.FundTransAppPay(ctx, bm) + if err != nil { + xlog.Errorf("client.FundTransAppPay(%+v),err:%+v", bm, err) + return + } + xlog.Debug("pageRedirectionData: ", pageRedirectionData) +} diff --git a/alipay/member_api.go b/alipay/member_api.go index 3bd3e86b..fcfdc4bc 100644 --- a/alipay/member_api.go +++ b/alipay/member_api.go @@ -209,7 +209,7 @@ func (a *Client) UserCertifyOpenQuery(ctx context.Context, bm gopay.BodyMap) (al // alipay.user.agreement.page.sign(支付宝个人协议页面签约接口) // 文档地址:https://opendocs.alipay.com/open/8bccfa0b_alipay.user.agreement.page.sign -func (a *Client) UserAgreementPageSign(ctx context.Context, bm gopay.BodyMap) (ret string, err error) { +func (a *Client) UserAgreementPageSign(ctx context.Context, bm gopay.BodyMap) (pageRedirectionData string, err error) { err = bm.CheckEmptyError("personal_product_code") if err != nil { return gopay.NULL, err @@ -221,27 +221,43 @@ func (a *Client) UserAgreementPageSign(ctx context.Context, bm gopay.BodyMap) (r return string(bs), nil } -// alipay.user.agreement.page.sign(APP 支付宝个人协议页面签约接口) -// 文档地址:https://opendocs.alipay.com/open/00a05b 通过 App 唤起支付宝的签约页面 +// alipay.user.agreement.page.sign(支付宝个人协议页面签约接口) - PC转二维码唤起签约页 +// 文档地址:https://opendocs.alipay.com/open/08ayiq?pathHash=a2d4e097#PC%E8%BD%AC%E4%BA%8C%E7%BB%B4%E7%A0%81%E5%94%A4%E8%B5%B7%E7%AD%BE%E7%BA%A6%E9%A1%B5 +func (a *Client) UserAgreementPageSignInQRCode(ctx context.Context, bm gopay.BodyMap) (qrcode string, err error) { + err = bm.CheckEmptyError("personal_product_code", "access_params") + if err != nil { + return gopay.NULL, err + } + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "alipay.user.agreement.page.sign"); err != nil { + return "", err + } + // 该链接里面的 APPID 为固定值,不可修改 + // 生成唤起客户端。把signParams使用 UTF-8 字符集整体做一次 encode + qrcode = "alipays://platformapi/startapp?appId=60000157&appClearTop=false&startMultApp=YES&sign_params=" + url.QueryEscape(string(bs)) + return qrcode, nil +} + +// Deprecated +// 后续会删除,请使用 UserAgreementPageSignInQRCode() 替代 func (a *Client) UserAgreementPageSignInApp(ctx context.Context, bm gopay.BodyMap) (ret string, err error) { - err = bm.CheckEmptyError("personal_product_code") + err = bm.CheckEmptyError("personal_product_code", "access_params") if err != nil { return gopay.NULL, err } - var bs string - // 参考官方示例 - // PageExecute get方式,生成url - if bs, err = a.PageExecute(ctx, bm, "alipay.user.agreement.page.sign"); err != nil { + // 参考官方示例 PageExecute get方式,生成 uri + uri, err := a.PageExecute(ctx, bm, "alipay.user.agreement.page.sign") + if err != nil { return "", err } - // / 生成的url地址去除 http://openapi.alipay.com/gateway.do + // / 生成的url地址去除 http://openapi.alipay.com/gateway.do? replaceUrl := baseUrl + "?" if !a.IsProd { replaceUrl = sandboxBaseUrl + "?" } - signParams := strings.Replace(bs, replaceUrl, "", 1) + signParams := strings.Replace(uri, replaceUrl, "", 1) // 该链接里面的 APPID 为固定值,不可修改) // 生成唤起客户端。把signParams使用 UTF-8 字符集整体做一次 encode diff --git a/alipay/member_api_test.go b/alipay/member_api_test.go index 4d613ab7..ab7adc02 100644 --- a/alipay/member_api_test.go +++ b/alipay/member_api_test.go @@ -122,7 +122,7 @@ func TestUserAgreementTransfer(t *testing.T) { xlog.Debug("aliRsp:", *aliRsp) } -func TestUserAgreementPageSignInApp(t *testing.T) { +func TestUserAgreementPageSignInQRCode(t *testing.T) { // 请求参数 bm := make(gopay.BodyMap) bm.Set("personal_product_code", "CYCLE_PAY_AUTH_P") @@ -143,8 +143,7 @@ func TestUserAgreementPageSignInApp(t *testing.T) { }) // 发起请求 - link, err := client.UserAgreementPageSignInApp(ctx, bm) - xlog.Info(err) + qrcode, err := client.UserAgreementPageSignInQRCode(ctx, bm) if err != nil { if bizErr, ok := IsBizError(err); ok { xlog.Errorf("%+v", bizErr) @@ -153,8 +152,7 @@ func TestUserAgreementPageSignInApp(t *testing.T) { } return } - - xlog.Debug("aliRsp:", link) + xlog.Debug("aliRsp:", qrcode) } func TestUserTwostageCommonUse(t *testing.T) { diff --git a/alipay/mode_funds.go b/alipay/mode_funds.go index 6ab2d533..60b0322a 100644 --- a/alipay/mode_funds.go +++ b/alipay/mode_funds.go @@ -91,13 +91,6 @@ type FundBatchDetailQueryResponse struct { Sign string `json:"sign"` } -type FundTransAppPayResponse struct { - Response *FundTransAppPay `json:"alipay_fund_trans_app_pay_response"` - AlipayCertSn string `json:"alipay_cert_sn,omitempty"` - SignData string `json:"-"` - Sign string `json:"sign"` -} - type FundTransPayeeBindQueryRsp struct { Response *FundTransPayeeBindQuery `json:"alipay_fund_trans_payee_bind_query_response"` AlipayCertSn string `json:"alipay_cert_sn,omitempty"` diff --git a/alipay/payment_api.go b/alipay/payment_api.go index be74e59b..eb14c6d6 100644 --- a/alipay/payment_api.go +++ b/alipay/payment_api.go @@ -61,7 +61,7 @@ func (a *Client) TradePrecreate(ctx context.Context, bm gopay.BodyMap) (aliRsp * // alipay.trade.app.pay(app支付接口2.0) // 文档地址:https://opendocs.alipay.com/open/02e7gq -func (a *Client) TradeAppPay(ctx context.Context, bm gopay.BodyMap) (payParam string, err error) { +func (a *Client) TradeAppPay(ctx context.Context, bm gopay.BodyMap) (orderStr string, err error) { err = bm.CheckEmptyError("out_trade_no", "total_amount", "subject") if err != nil { return gopay.NULL, err @@ -70,8 +70,8 @@ func (a *Client) TradeAppPay(ctx context.Context, bm gopay.BodyMap) (payParam st if bs, err = a.doAliPay(ctx, bm, "alipay.trade.app.pay"); err != nil { return gopay.NULL, err } - payParam = string(bs) - return payParam, nil + orderStr = string(bs) + return orderStr, nil } // alipay.trade.wap.pay(手机网站支付接口2.0) diff --git a/alipay/v3/client_test.go b/alipay/v3/client_test.go index 5b8c4505..dbf113d2 100644 --- a/alipay/v3/client_test.go +++ b/alipay/v3/client_test.go @@ -7,8 +7,8 @@ import ( "github.com/go-pay/gopay" "github.com/go-pay/gopay/alipay/cert" - "github.com/go-pay/gopay/pkg/js" "github.com/go-pay/util" + "github.com/go-pay/util/js" "github.com/go-pay/xlog" ) @@ -68,7 +68,7 @@ func TestDoAliPayAPISelfV3(t *testing.T) { xlog.Errorf("client.TradePrecreate(), err:%v", err) return } - xlog.Debugf("aliRsp:%s", js.Marshal(rsp)) + xlog.Debugf("aliRsp:%s", js.MarshalString(rsp)) if res.StatusCode != Success { xlog.Errorf("aliRsp.StatusCode:%d", res.StatusCode) return @@ -106,7 +106,7 @@ func TestClientV3_Transfer(t *testing.T) { return } - xlog.Debugf("aliRsp:%s", js.Marshal(res)) + xlog.Debugf("aliRsp:%s", js.MarshalString(res)) if res.StatusCode != Success { xlog.Errorf("aliRsp.StatusCode:%d", res.StatusCode) return diff --git a/alipay/v3/payment_api_test.go b/alipay/v3/payment_api_test.go index 04dbba77..a27af500 100644 --- a/alipay/v3/payment_api_test.go +++ b/alipay/v3/payment_api_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/go-pay/gopay" - "github.com/go-pay/gopay/pkg/js" "github.com/go-pay/util" + "github.com/go-pay/util/js" "github.com/go-pay/xlog" ) @@ -22,7 +22,7 @@ func TestTradePrecreate(t *testing.T) { xlog.Errorf("client.TradePrecreate(), err:%v", err) return } - xlog.Debugf("aliRsp:%s", js.Marshal(aliRsp)) + xlog.Debugf("aliRsp:%s", js.MarshalString(aliRsp)) if aliRsp.StatusCode != Success { xlog.Errorf("aliRsp.StatusCode:%d", aliRsp.StatusCode) diff --git a/constant.go b/constant.go index 3b675347..2c1225c2 100644 --- a/constant.go +++ b/constant.go @@ -7,7 +7,7 @@ const ( OK = "OK" DebugOff = 0 DebugOn = 1 - Version = "v1.5.108" + Version = "v1.5.109" ) type DebugSwitch int8 diff --git a/doc/alipay.md b/doc/alipay.md index 52e18e67..54346993 100644 --- a/doc/alipay.md +++ b/doc/alipay.md @@ -278,7 +278,7 @@ xlog.Infof("%+v", phone) * 交易分账查询接口:`client.TradeOrderSettleQuery()` * 商家扣款 * 支付宝个人协议页面签约接口: `client.UserAgreementPageSign()` - * 支付宝个人协议页面签约接口(App 专用,生成唤醒签约页面链接): `client.UserAgreementPageSignInApp()` + * 支付宝个人协议页面签约接口 - PC转二维码唤起签约页: `client.UserAgreementPageSignInQRCode()` * 支付宝个人代扣协议查询接口: `client.UserAgreementQuery()` * 支付宝个人代扣协议解约接口: `client.UserAgreementPageUnSign()` * 周期性扣款协议执行计划修改接口: `client.UserAgreementExecutionplanModify()` diff --git a/pkg/js/json.go b/pkg/js/json.go deleted file mode 100644 index edd65771..00000000 --- a/pkg/js/json.go +++ /dev/null @@ -1,27 +0,0 @@ -package js - -import "encoding/json" - -func MarshalString(v any) string { - bs, err := json.Marshal(v) - if err != nil { - return "" - } - return string(bs) -} - -func Marshal(v any) []byte { - bs, err := json.Marshal(v) - if err != nil { - return nil - } - return bs -} - -func UnmarshalString(jsonStr string, v any) error { - return json.Unmarshal([]byte(jsonStr), v) -} - -func Unmarshal(bs []byte, v any) error { - return json.Unmarshal(bs, v) -} diff --git a/release_note.md b/release_note.md index f08bea9d..a2acb5f9 100644 --- a/release_note.md +++ b/release_note.md @@ -1,3 +1,9 @@ +## 版本号:v1.5.109 + +* 修改记录: + * 支付宝:作废 client.UserAgreementPageSignInApp() 方法,使用 client.UserAgreementPageSignInQRCode() 方法替换。 + * 支付宝:修改 client.FundTransAppPay() 方法返回参数。 + ## 版本号:v1.5.108 * 修改记录: