diff --git a/alipay/merchant_api.go b/alipay/merchant_api.go index 4519cb2f..4e49ff5e 100644 --- a/alipay/merchant_api.go +++ b/alipay/merchant_api.go @@ -191,3 +191,26 @@ func (a *Client) TradeRoyaltyRateQuery(ctx context.Context, bm gopay.BodyMap) (a aliRsp.SignData = signData return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) } + +// alipay.security.risk.customerrisk.send(商户数据同步) +// 文档地址:https://opendocs.alipay.com/open/02qth4 +func (a *Client) SecurityCustomerRiskSend(ctx context.Context, bm gopay.BodyMap) (aliRsp *SecurityCustomerRiskSendRsp, err error) { + err = bm.CheckEmptyError("process_code", "trade_no") + if err != nil { + return nil, err + } + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "alipay.security.risk.customerrisk.send"); err != nil { + return nil, err + } + aliRsp = new(SecurityCustomerRiskSendRsp) + 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 + } + signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn) + aliRsp.SignData = signData + return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) +} diff --git a/alipay/model_merchant.go b/alipay/model_merchant.go index e2ac5160..9d05aacf 100644 --- a/alipay/model_merchant.go +++ b/alipay/model_merchant.go @@ -56,6 +56,13 @@ type TradeRoyaltyRateQueryResponse struct { Sign string `json:"sign"` } +type SecurityCustomerRiskSendRsp struct { + Response *SecurityCustomerRiskSend `json:"alipay_security_risk_customerrisk_send_response"` + AlipayCertSn string `json:"alipay_cert_sn,omitempty"` + SignData string `json:"-"` + Sign string `json:"sign"` +} + // =========================================================分割========================================================= type TradeRelationBind struct { @@ -120,3 +127,7 @@ type TradeRoyaltyRateQuery struct { UserId string `json:"user_id,omitempty"` MaxRatio string `json:"max_ratio,omitempty"` } + +type SecurityCustomerRiskSend struct { + ErrorResponse +} diff --git a/alipay/model_zhima.go b/alipay/model_zhima.go index 970774be..f8a7ebfb 100644 --- a/alipay/model_zhima.go +++ b/alipay/model_zhima.go @@ -147,6 +147,20 @@ type ZhimaCustomerJobworthSceneUseRsp struct { Sign string `json:"sign"` } +type ZhimaCustomerJobworthAuthQueryRsp struct { + Response *ZhimaCustomerJobworthAuthQuery `json:"zhima_customer_jobworth_authentication_query_response"` + AlipayCertSn string `json:"alipay_cert_sn,omitempty"` + SignData string `json:"-"` + Sign string `json:"sign"` +} + +type ZhimaCustomerJobworthAuthPreConsultRsp struct { + Response *ZhimaCustomerJobworthAuthPreConsult `json:"zhima_customer_jobworth_authentication_preconsult_response"` + AlipayCertSn string `json:"alipay_cert_sn,omitempty"` + SignData string `json:"-"` + Sign string `json:"sign"` +} + type ZhimaCreditPeZmgoSettleApplyRsp struct { Response *ZhimaCreditPeZmgoSettleApply `json:"zhima_credit_pe_zmgo_settle_apply_response"` AlipayCertSn string `json:"alipay_cert_sn,omitempty"` @@ -154,6 +168,34 @@ type ZhimaCreditPeZmgoSettleApplyRsp struct { Sign string `json:"sign"` } +type ZhimaCreditPayAfterUseAgreementQueryRsp struct { + Response *ZhimaCreditPayAfterUseAgreementQuery `json:"zhima_credit_payafteruse_creditagreement_query_response"` + AlipayCertSn string `json:"alipay_cert_sn,omitempty"` + SignData string `json:"-"` + Sign string `json:"sign"` +} + +type ZhimaCreditPayAfterUseCreditBizOrderRsp struct { + Response *ZhimaCreditPayAfterUseCreditBizOrder `json:"zhima_credit_payafteruse_creditbizorder_order_response"` + AlipayCertSn string `json:"alipay_cert_sn,omitempty"` + SignData string `json:"-"` + Sign string `json:"sign"` +} + +type ZhimaCreditPayAfterUseCreditBizOrderQueryRsp struct { + Response *ZhimaCreditPayAfterUseCreditBizOrderQuery `json:"zhima_credit_payafteruse_creditbizorder_query_response"` + AlipayCertSn string `json:"alipay_cert_sn,omitempty"` + SignData string `json:"-"` + Sign string `json:"sign"` +} + +type ZhimaCreditPayAfterUseCreditBizOrderFinishRsp struct { + Response *ZhimaCreditPayAfterUseCreditBizOrderFinish `json:"zhima_credit_payafteruse_creditbizorder_finish_response"` + AlipayCertSn string `json:"alipay_cert_sn,omitempty"` + SignData string `json:"-"` + Sign string `json:"sign"` +} + // =========================================================分割========================================================= type ScoreGet struct { @@ -401,6 +443,21 @@ type ZhimaCustomerJobworthSceneUse struct { ErrorResponse } +type ZhimaCustomerJobworthAuthQuery struct { + ErrorResponse + IdentityResult string `json:"identity_result"` + IdentityResultSkipUrl string `json:"identity_result_skip_url"` + TokenStatus string `json:"token_status"` + UserId string `json:"user_id"` + OpenId string `json:"open_id"` +} + +type ZhimaCustomerJobworthAuthPreConsult struct { + ErrorResponse + PreCheckSuccess bool `json:"pre_check_success"` + Reason string `json:"reason"` +} + type ZhimaCreditPeZmgoSettleApply struct { ErrorResponse OutRequestNo string `json:"out_request_no"` @@ -409,3 +466,39 @@ type ZhimaCreditPeZmgoSettleApply struct { SettleStatus string `json:"settle_status"` FailReason string `json:"fail_reason"` } + +type ZhimaCreditPayAfterUseAgreementQuery struct { + ErrorResponse + OutAgreementNo string `json:"out_agreement_no"` + AgreementStatus string `json:"agreement_status"` + CreditAgreementId string `json:"credit_agreement_id"` + BizTime string `json:"biz_time"` + ExtInfo string `json:"ext_info"` + AlipayUserId string `json:"alipay_user_id"` + OpenId string `json:"open_id"` +} + +type ZhimaCreditPayAfterUseCreditBizOrder struct { + ErrorResponse + OutOrderNo string `json:"out_order_no"` + CreditBizOrderId string `json:"credit_biz_order_id"` +} + +type ZhimaCreditPayAfterUseCreditBizOrderQuery struct { + ErrorResponse + CreditBizOrderId string `json:"credit_biz_order_id"` + CreditAgreementId string `json:"credit_agreement_id"` + TotalAmount string `json:"total_amount"` + CreateTime string `json:"create_time"` + ZmServiceId string `json:"zm_service_id"` + ProductCode string `json:"product_code"` + OrderStatus string `json:"order_status"` + TradeNo string `json:"trade_no"` +} + +type ZhimaCreditPayAfterUseCreditBizOrderFinish struct { + ErrorResponse + OutRequestNo string `json:"out_request_no"` + CreditBizOrderId string `json:"credit_biz_order_id"` + OrderStatus string `json:"order_status"` +} diff --git a/alipay/request.go b/alipay/request.go index 4901ab15..f4233952 100644 --- a/alipay/request.go +++ b/alipay/request.go @@ -162,7 +162,7 @@ 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", "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 { diff --git a/alipay/zhima_api.go b/alipay/zhima_api.go index ecdec434..3159859b 100644 --- a/alipay/zhima_api.go +++ b/alipay/zhima_api.go @@ -490,6 +490,105 @@ func (a *Client) ZhimaCreditPeZmgoPaysignConfirm(ctx context.Context, bm gopay.B return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) } +// zhima.credit.payafteruse.creditagreement.sign(信用服务开通/授权) +// 文档地址:https://opendocs.alipay.com/open/03uloz +func (a *Client) ZhimaCreditPayAfterUseAgreementSign(ctx context.Context, bm gopay.BodyMap) (orderStr string, err error) { + err = bm.CheckEmptyError("out_agreement_no", "zm_service_id") + if err != nil { + return gopay.NULL, err + } + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "zhima.credit.payafteruse.creditagreement.sign"); err != nil { + return gopay.NULL, err + } + orderStr = string(bs) + return orderStr, nil +} + +// zhima.credit.payafteruse.creditagreement.query(查询服务开通/授权信息) +// 文档地址:https://opendocs.alipay.com/open/03ulp0 +func (a *Client) ZhimaCreditPayAfterUseAgreementQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *ZhimaCreditPayAfterUseAgreementQueryRsp, err error) { + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "zhima.credit.payafteruse.creditagreement.query"); err != nil { + return nil, err + } + aliRsp = new(ZhimaCreditPayAfterUseAgreementQueryRsp) + 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 + } + signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn) + aliRsp.SignData = signData + return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) +} + +// zhima.credit.payafteruse.creditbizorder.order(芝麻信用服务下单(免用户确认场景)) +// 文档地址:https://opendocs.alipay.com/open/03ulpo +func (a *Client) ZhimaCreditPayAfterUseCreditBizOrder(ctx context.Context, bm gopay.BodyMap) (aliRsp *ZhimaCreditPayAfterUseCreditBizOrderRsp, err error) { + err = bm.CheckEmptyError("out_order_no", "credit_agreement_id", "subject") + if err != nil { + return nil, err + } + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "zhima.credit.payafteruse.creditbizorder.order"); err != nil { + return nil, err + } + aliRsp = new(ZhimaCreditPayAfterUseCreditBizOrderRsp) + 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 + } + signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn) + aliRsp.SignData = signData + return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) +} + +// zhima.credit.payafteruse.creditbizorder.query(信用服务订单查询) +// 文档地址:https://opendocs.alipay.com/open/03vtet +func (a *Client) ZhimaCreditPayAfterUseCreditBizOrderQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *ZhimaCreditPayAfterUseCreditBizOrderQueryRsp, err error) { + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "zhima.credit.payafteruse.creditbizorder.query"); err != nil { + return nil, err + } + aliRsp = new(ZhimaCreditPayAfterUseCreditBizOrderQueryRsp) + 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 + } + signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn) + aliRsp.SignData = signData + return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) +} + +// zhima.credit.payafteruse.creditbizorder.finish(结束信用服务订单) +// 文档地址:https://opendocs.alipay.com/open/03vteu +func (a *Client) ZhimaCreditPayAfterUseCreditBizOrderFinish(ctx context.Context, bm gopay.BodyMap) (aliRsp *ZhimaCreditPayAfterUseCreditBizOrderFinishRsp, err error) { + err = bm.CheckEmptyError("out_request_no", "credit_biz_order_id") + if err != nil { + return nil, err + } + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "zhima.credit.payafteruse.creditbizorder.finish"); err != nil { + return nil, err + } + aliRsp = new(ZhimaCreditPayAfterUseCreditBizOrderFinishRsp) + 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 + } + signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn) + aliRsp.SignData = signData + return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) +} + // zhima.customer.jobworth.adapter.query(职得工作证信息匹配度查询) // 文档地址:https://opendocs.alipay.com/apis/022mvz func (a *Client) ZhimaCustomerJobworthAdapterQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *ZhimaCustomerJobworthAdapterQueryRsp, err error) { @@ -527,3 +626,49 @@ func (a *Client) ZhimaCustomerJobworthSceneUse(ctx context.Context, bm gopay.Bod aliRsp.SignData = signData return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) } + +// zhima.customer.jobworth.authentication.query(职得身份认证查询接口) +// 文档地址:https://opendocs.alipay.com/open/351177b5_zhima.customer.jobworth.authentication.query +func (a *Client) ZhimaCustomerJobworthAuthQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *ZhimaCustomerJobworthAuthQueryRsp, err error) { + err = bm.CheckEmptyError("conn_key", "once_token", "query_type", "identity_type", "service_id") + if err != nil { + return nil, err + } + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "zhima.customer.jobworth.authentication.query"); err != nil { + return nil, err + } + aliRsp = new(ZhimaCustomerJobworthAuthQueryRsp) + 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 + } + signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn) + aliRsp.SignData = signData + return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) +} + +// zhima.customer.jobworth.authentication.preconsult(身份验真预咨询服务) +// 文档地址:https://opendocs.alipay.com/open/16f72e43_zhima.customer.jobworth.authentication.preconsult +func (a *Client) ZhimaCustomerJobworthAuthPreConsult(ctx context.Context, bm gopay.BodyMap) (aliRsp *ZhimaCustomerJobworthAuthPreConsultRsp, err error) { + err = bm.CheckEmptyError("out_agreement_no", "once_token", "identity_type", "query_type", "zm_service_id") + if err != nil { + return nil, err + } + var bs []byte + if bs, err = a.doAliPay(ctx, bm, "zhima.customer.jobworth.authentication.preconsult"); err != nil { + return nil, err + } + aliRsp = new(ZhimaCustomerJobworthAuthPreConsultRsp) + 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 + } + signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn) + aliRsp.SignData = signData + return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr) +} diff --git a/doc/alipay.md b/doc/alipay.md index 175ee8aa..b500aab2 100644 --- a/doc/alipay.md +++ b/doc/alipay.md @@ -441,29 +441,29 @@ xlog.Infof("%+v", phone) * 芝麻GO支付下单链路签约确认: `client.ZhimaCreditPeZmgoPaysignConfirm()` * 芝麻先享 * 服务开通 - * 信用服务开通/授权接口:TODO:https://opendocs.alipay.com/open/03uloz - * 查询服务开通/授权信息接口:TODO:https://opendocs.alipay.com/open/03ulp0 + * 信用服务开通/授权接口:`client.ZhimaCreditPayAfterUseAgreementSign()` + * 查询服务开通/授权信息接口:`client.ZhimaCreditPayAfterUseAgreementQuery()` * 信用下单 - * 芝麻先享信用服务下单(免用户确认场景)接口:TODO:https://opendocs.alipay.com/open/03ulpo - * 芝麻先享信用服务下单(用户确认场景)接口:TODO:https://opendocs.alipay.com/open/03ulpp - * 信用服务订单查询接口:TODO:https://opendocs.alipay.com/open/03vtet - * 结束信用服务订单接口:TODO:https://opendocs.alipay.com/open/03vteu + * 芝麻先享信用服务下单(免用户确认场景)接口:`client.ZhimaCreditPayAfterUseCreditBizOrder()` + * 芝麻先享信用服务下单(用户确认场景)接口:支付宝 SDK 实现 + * 信用服务订单查询接口:`client.ZhimaCreditPayAfterUseCreditBizOrderQuery()` + * 结束信用服务订单接口:`client.ZhimaCreditPayAfterUseCreditBizOrderFinish()` * 扣款 - * 统一收单交易订单支付接口:TODO:https://opendocs.alipay.com/open/2e81a85f_alipay.trade.order.pay + * 统一收单交易订单支付接口:`client.TradeOrderPay()` * 芝麻免押 * 创建免押订单接口:`client:FundAuthOrderAppFreeze()` * 完结免押订单接口:`client.FundAuthOrderUnfreeze()` * 查询免押订单接口:`client.FundAuthOperationDetailQuery()` * 取消免押订单接口:`client.FundAuthOperationCancel()` * 芝麻身份信息验证 - * 信用服务开通/授权接口:TODO:https://opendocs.alipay.com/open/63612668_zhima.credit.payafteruse.creditagreement.sign - * 职得身份认证查询接口:TODO:https://opendocs.alipay.com/open/351177b5_zhima.customer.jobworth.authentication.query + * 信用服务开通/授权接口:`client.ZhimaCreditPayAfterUseAgreementSign()` + * 职得身份认证查询接口:`client.ZhimaCustomerJobworthAuthQuery()` * 职得工作证信息匹配度查询: `client.ZhimaCustomerJobworthAdapterQuery()` * 职得工作证外部渠道应用数据回流: `client.ZhimaCustomerJobworthSceneUse()` - * 身份验真预咨询服务接口:TODO:https://opendocs.alipay.com/open/16f72e43_zhima.customer.jobworth.authentication.preconsult + * 身份验真预咨询服务接口:`client.ZhimaCustomerJobworthAuthPreConsult()` * 安全产品 * 交易安全防护 - * 商户数据同步:TODO:https://opendocs.alipay.com/open/02qth4 + * 商户数据同步:`client.SecurityCustomerRiskSend()` * 其他产品 * 花芝轻会员结算申请: `client.PcreditHuabeiAuthSettleApply()` * NFC用户卡信息同步: `client.CommerceTransportNfccardSend()`