162 lines
4.7 KiB
Go
162 lines
4.7 KiB
Go
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)
|
||
}
|