service/vendor/github.com/go-pay/gopay/alipay/payment_api.go

406 lines
16 KiB
Go
Raw Normal View History

2023-12-21 22:17:40 +08:00
package alipay
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/go-pay/gopay"
"github.com/go-pay/gopay/pkg/util"
)
// alipay.trade.pay(统一收单交易支付接口)
// 文档地址https://opendocs.alipay.com/open/02cdx8
func (a *Client) TradePay(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradePayResponse, err error) {
err = bm.CheckEmptyError("out_trade_no", "subject")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.pay"); err != nil {
return nil, err
}
aliRsp = new(TradePayResponse)
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)
}
// alipay.trade.precreate(统一收单线下交易预创建)
// 文档地址https://opendocs.alipay.com/open/02ekfg
func (a *Client) TradePrecreate(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradePrecreateResponse, err error) {
err = bm.CheckEmptyError("out_trade_no", "total_amount", "subject")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.precreate"); err != nil {
return nil, err
}
aliRsp = new(TradePrecreateResponse)
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
}
if aliRsp.NullResponse != nil {
info := aliRsp.NullResponse
return aliRsp, fmt.Errorf(`{"code":"%s","msg":"%s","sub_code":"%s","sub_msg":"%s"}`, info.Code, info.Msg, info.SubCode, info.SubMsg)
}
signData, signDataErr := a.getSignData(bs, aliRsp.AlipayCertSn)
aliRsp.SignData = signData
return aliRsp, a.autoVerifySignByCert(aliRsp.Sign, signData, signDataErr)
}
// 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) {
err = bm.CheckEmptyError("out_trade_no", "total_amount", "subject")
if err != nil {
return util.NULL, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.app.pay"); err != nil {
return util.NULL, err
}
payParam = string(bs)
return payParam, nil
}
// alipay.trade.wap.pay(手机网站支付接口2.0)
// 文档地址https://opendocs.alipay.com/open/02ivbs?scene=21&ref=api
func (a *Client) TradeWapPay(ctx context.Context, bm gopay.BodyMap) (payUrl string, err error) {
bm.Set("product_code", "QUICK_WAP_WAY")
err = bm.CheckEmptyError("out_trade_no", "total_amount", "subject")
if err != nil {
return util.NULL, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.wap.pay"); err != nil {
return util.NULL, err
}
payUrl = string(bs)
return payUrl, nil
}
// alipay.trade.page.pay(统一收单下单并支付页面接口)
// 文档地址https://opendocs.alipay.com/open/028r8t
func (a *Client) TradePagePay(ctx context.Context, bm gopay.BodyMap) (payUrl string, err error) {
bm.Set("product_code", "FAST_INSTANT_TRADE_PAY")
err = bm.CheckEmptyError("out_trade_no", "total_amount", "subject")
if err != nil {
return util.NULL, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.page.pay"); err != nil {
return util.NULL, err
}
payUrl = string(bs)
return payUrl, nil
}
// alipay.trade.create(统一收单交易创建接口)
// 文档地址https://opendocs.alipay.com/open/02ekfj
func (a *Client) TradeCreate(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeCreateResponse, err error) {
err = bm.CheckEmptyError("out_trade_no", "total_amount", "subject")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.create"); err != nil {
return nil, err
}
aliRsp = new(TradeCreateResponse)
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)
}
// alipay.trade.query(统一收单线下交易查询)
// 文档地址https://opendocs.alipay.com/open/02e7gm
func (a *Client) TradeQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeQueryResponse, err error) {
if bm.GetString("out_trade_no") == util.NULL && bm.GetString("trade_no") == util.NULL {
return nil, errors.New("out_trade_no and trade_no are not allowed to be null at the same time")
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.query"); err != nil {
return nil, err
}
aliRsp = new(TradeQueryResponse)
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)
}
// alipay.trade.cancel(统一收单交易撤销接口)
// 文档地址https://opendocs.alipay.com/open/02ekfi
func (a *Client) TradeCancel(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeCancelResponse, err error) {
if bm.GetString("out_trade_no") == util.NULL && bm.GetString("trade_no") == util.NULL {
return nil, errors.New("out_trade_no and trade_no are not allowed to be null at the same time")
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.cancel"); err != nil {
return nil, err
}
aliRsp = new(TradeCancelResponse)
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)
}
// alipay.trade.close(统一收单交易关闭接口)
// 文档地址https://opendocs.alipay.com/open/02e7gn
func (a *Client) TradeClose(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeCloseResponse, err error) {
if bm.GetString("out_trade_no") == util.NULL && bm.GetString("trade_no") == util.NULL {
return nil, errors.New("out_trade_no and trade_no are not allowed to be null at the same time")
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.close"); err != nil {
return nil, err
}
aliRsp = new(TradeCloseResponse)
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)
}
// alipay.trade.refund(统一收单交易退款接口)
// 文档地址https://opendocs.alipay.com/open/02e7go
func (a *Client) TradeRefund(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeRefundResponse, err error) {
if bm.GetString("out_trade_no") == util.NULL && bm.GetString("trade_no") == util.NULL {
return nil, errors.New("out_trade_no and trade_no are not allowed to be null at the same time")
}
err = bm.CheckEmptyError("refund_amount")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.refund"); err != nil {
return nil, err
}
aliRsp = new(TradeRefundResponse)
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)
}
// alipay.trade.page.refund(统一收单退款页面接口)
// 文档地址https://opendocs.alipay.com/apis/api_1/alipay.trade.page.refund
func (a *Client) TradePageRefund(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradePageRefundResponse, err error) {
if bm.GetString("out_trade_no") == util.NULL && bm.GetString("trade_no") == util.NULL {
return nil, errors.New("out_trade_no and trade_no are not allowed to be null at the same time")
}
err = bm.CheckEmptyError("out_request_no", "refund_amount")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.page.refund"); err != nil {
return nil, err
}
aliRsp = new(TradePageRefundResponse)
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)
}
// alipay.trade.fastpay.refund.query(统一收单交易退款查询)
// 文档地址https://opendocs.alipay.com/open/02e7gp
func (a *Client) TradeFastPayRefundQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeFastpayRefundQueryResponse, err error) {
if bm.GetString("out_trade_no") == util.NULL && bm.GetString("trade_no") == util.NULL {
return nil, errors.New("out_trade_no and trade_no are not allowed to be null at the same time")
}
err = bm.CheckEmptyError("out_request_no")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.fastpay.refund.query"); err != nil {
return nil, err
}
aliRsp = new(TradeFastpayRefundQueryResponse)
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)
}
// alipay.trade.orderinfo.sync(支付宝订单信息同步接口)
// 文档地址https://opendocs.alipay.com/open/02cnou
func (a *Client) TradeOrderInfoSync(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeOrderInfoSyncRsp, err error) {
err = bm.CheckEmptyError("out_request_no", "trade_no", "biz_type")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.orderinfo.sync"); err != nil {
return nil, err
}
aliRsp = new(TradeOrderInfoSyncRsp)
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)
}
// alipay.trade.advance.consult(订单咨询服务)
// 文档地址https://opendocs.alipay.com/apis/api_1/alipay.trade.advance.consult
func (a *Client) TradeAdvanceConsult(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeAdvanceConsultRsp, err error) {
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.advance.consult"); err != nil {
return nil, err
}
aliRsp = new(TradeAdvanceConsultRsp)
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)
}
// alipay.pcredit.huabei.auth.settle.apply(花芝轻会员结算申请)
// 文档地址https://opendocs.alipay.com/apis/api_1/alipay.pcredit.huabei.auth.settle.apply
func (a *Client) PcreditHuabeiAuthSettleApply(ctx context.Context, bm gopay.BodyMap) (aliRsp *PcreditHuabeiAuthSettleApplyRsp, err error) {
err = bm.CheckEmptyError("agreement_no", "pay_amount", "out_request_no", "alipay_user_id")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.pcredit.huabei.auth.settle.apply"); err != nil {
return nil, err
}
aliRsp = new(PcreditHuabeiAuthSettleApplyRsp)
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)
}
// alipay.data.dataservice.ad.data.query(广告投放数据查询)
// 文档地址https://opendocs.alipay.com/apis/api_1/alipay.data.dataservice.ad.data.query
func (a *Client) DataDataserviceAdDataQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *DataDataserviceAdDataQueryRsp, err error) {
err = bm.CheckEmptyError("query_type", "biz_token", "ad_level", "start_date", "end_date", "outer_id_list")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.data.dataservice.ad.data.query"); err != nil {
return nil, err
}
aliRsp = new(DataDataserviceAdDataQueryRsp)
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)
}
// mybank.payment.trade.order.create(网商银行全渠道收单业务订单创建)
// 文档地址https://opendocs.alipay.com/apis/api_1/mybank.payment.trade.order.create
func (a *Client) PaymentTradeOrderCreate(ctx context.Context, bm gopay.BodyMap) (aliRsp *PaymentTradeOrderCreateRsp, err error) {
err = bm.CheckEmptyError("partner_id", "out_trade_no", "recon_related_no", "pd_code", "ev_code", "total_amount", "currency_code", "goods_info", "seller_id", "pay_type", "pay_date")
if err != nil {
return nil, err
}
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "mybank.payment.trade.order.create"); err != nil {
return nil, err
}
aliRsp = new(PaymentTradeOrderCreateRsp)
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)
}
// alipay.trade.repaybill.query(还款账单查询)
// 文档地址https://opendocs.alipay.com/apis/api_1/alipay.trade.repaybill.query
func (a *Client) TradeRepaybillQuery(ctx context.Context, bm gopay.BodyMap) (aliRsp *TradeRepaybillQueryRsp, err error) {
var bs []byte
if bs, err = a.doAliPay(ctx, bm, "alipay.trade.repaybill.query"); err != nil {
return nil, err
}
aliRsp = new(TradeRepaybillQueryRsp)
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)
}