Files
baseapi/platformapi/kuaishou_mini/kuaishou_pay.go
邹宗楠 88e7b96fec 1
2023-04-06 18:25:24 +08:00

162 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package kuaishou_mini
import (
"encoding/json"
"errors"
"fmt"
"git.rosy.net.cn/baseapi/utils"
"time"
)
// PreCreateOrder 预下单生成支付信息
func (a *API) PreCreateOrder(param *PreCreateOrderReq) (string, error) {
if a.appId == "" || a.appSecret == "" {
return "", errors.New("appId/appSecret 不能为空")
}
param.Sign = a.sign(utils.Struct2MapByJson(param))
result, err := a.AccessAPI1(a.FullUrl(KuaiShouPreCreateOrder), utils.Struct2MapByJson(param))
if err != nil {
return "", err
}
order := PreCreateOrderResponse{}
if err := utils.Map2StructByJson(result, &order, false); err != nil {
return "", err
}
if order.Result != 1 {
return "", errors.New(order.ErrorMsg)
}
return order.OrderInfo, nil
}
// GetOrderDetail 订单详情查询接口
func (a *API) GetOrderDetail(outOrderNo string) (*PaymentInfo, error) {
data, err := a.AccessAPI1(KuaiShouGetOrderDetail, map[string]interface{}{"out_order_no": outOrderNo})
if err != nil {
return nil, err
}
orderDetail := &GetOrderDetailRes{}
if err := utils.Map2StructByJson(data, orderDetail, false); err != nil {
return nil, err
}
if orderDetail.Result != 1 {
return nil, err
}
if orderDetail.PaymentInfo == "" {
return nil, errors.New("快手支付订单详情返回值为空")
}
paymentInfo := &PaymentInfo{}
if err := json.Unmarshal([]byte(orderDetail.PaymentInfo), paymentInfo); err != nil {
return nil, err
}
return paymentInfo, err
}
// RefundOrder 支付请求退款接口
// 在途资金中的所有货款均是与订单关联的,只有当该订单在途资金中剩余金额超过退款金额时,才可以进行在途资金的退款。
// 当可提现金额也不足退款金额时,会退款失败,为了避免出现订单无法退款的情况出现,请根据业务情况自行保留一部分可提现金额在系统中
func (a *API) RefundOrder(param *RefundParam) (refundNo string, err error) {
data, err := a.AccessAPI1(KuaiShouRefundOrder, utils.Struct2MapByJson(param))
if err != nil {
return "", err
}
var result *RefundRes
if err := utils.Map2StructByJson(data, &result, false); err != nil {
return "", err
}
if result.Result != 1 {
return "", errors.New(result.ErrorMsg)
}
return result.RefundNo, nil
}
// RefundOrderDetail 查询退款订单详情
func (a *API) RefundOrderDetail(outRefundNo string) (*RefundInfo, error) {
data, err := a.AccessAPI1(KuaiShouRefundOrderDetail, map[string]interface{}{"out_refund_no": outRefundNo})
if err != nil {
return nil, err
}
var refundOrderDetail *RefundOrderDetail
if err := utils.Map2StructByJson(data, &refundOrderDetail, false); err != nil {
return nil, err
}
if refundOrderDetail.Result != 1 {
return nil, errors.New(refundOrderDetail.ErrorMsg)
}
var refundInfo *RefundInfo
if err := json.Unmarshal([]byte(refundOrderDetail.RefundInfo), &refundInfo); err != nil {
return nil, err
}
return refundInfo, nil
}
// PaySettleAccounts 结算用于确认一笔在途资金,将其转化为可提现资金。
// 结算规则
// 1、订单履约完成后发起结算结算周期为 订单到达核销状态订单状态为11或15满3天后可发起结算。核销状态通过订单同步接口 (opens new window)进行同步。
// 2、需要主动调用结算接口后才能进行后续资金的提现。
// 3、结算时小程序平台会收取整笔交易的平台服务费。若结算后发生退款则平台服务费不作退还。
func (a *API) PaySettleAccounts4Order(param *OrderSettleAccountParam) (string, error) {
data, err := a.AccessAPI1(KuaiShouGetSettleOrder, utils.Struct2MapByJson(param))
if err != nil {
return "", err
}
var settle *OrderSettleAccountRes
if err := utils.Map2StructByJson(data, &settle, false); err != nil {
return "", err
}
if settle.Result != 1 {
return "", err
}
return settle.SettleNo, nil
}
// QuerySettleInfo 查询结算信息
func (a *API) QuerySettleInfo(outSettleNo string) (*SettleInfo, error) {
data, err := a.AccessAPI1(KuaiShouQuerySettleOrder, map[string]interface{}{"out_settle_no": outSettleNo})
if err != nil {
return nil, err
}
var settle *QuerySettleInfoRes
if err := utils.Map2StructByJson(data, &settle, false); err != nil {
return nil, err
}
if settle.Result != 1 {
return nil, errors.New(settle.ErrorMsg)
}
if settle.SettleInfo == "" {
return nil, errors.New("数据查询为空")
}
var result *SettleInfo
if err := json.Unmarshal([]byte(settle.SettleInfo), result); err != nil {
return nil, err
}
return result, err
}
func (a *API) FullUrl(bashUrl string) string {
if a.accessToken == "" || a.expiresIn < time.Now().Unix() {
a.GetToken()
}
return fmt.Sprintf(bashUrl+"?app_id=%s&access_token=%s", a.appId, a.accessToken)
}