dongfeng-pay/gateway/service/base_service.go

194 lines
4.5 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 service
import (
"context"
"gateway/conf"
"gateway/models/merchant"
"gateway/models/order"
"gateway/response"
"github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs"
"strconv"
"strings"
)
//获取商户信息
func GetMerchantInfo(params map[string]string) *response.PayBaseResp {
c := new(response.PayBaseResp)
c.Params = make(map[string]string)
c.Params = params
merchantInfo := merchant.GetMerchantByPaykey(params["payKey"])
if merchantInfo.MerchantUid == "" || len(merchantInfo.MerchantUid) == 0 {
c.Code = -1
c.Msg = "商户不存在或者paykey有误请联系管理员"
} else if merchantInfo.Status != conf.ACTIVE {
c.Code = -1
c.Msg = "商户状态已经被冻结或者被删除,请联系管理员!"
} else {
c.MerchantInfo = merchantInfo
}
return c
}
func JudgeParams(c *response.PayBaseResp) *response.PayBaseResp {
//c.ReturnUrlIsValid()
c = OrderIsValid(c)
c = NotifyUrlIsValid(c)
c = OsTypeIsValid(c)
c = PayWayCodeIsValid(c)
c = ProductIsValid(c)
c = OrderPeriodIsValid(c)
//c = IpIsWhite()
c = OrderPriceIsValid(c)
return c
}
/*
* 插入支付订单记录和订单利润记录,保证一致性
*/
func InsertOrderAndOrderProfit(orderInfo order.OrderInfo, orderProfitInfo order.OrderProfitInfo) bool {
o := orm.NewOrm()
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
if _, err := txOrm.Insert(&orderInfo); err != nil {
logs.Error("insert orderInfo fail: ", err)
return err
}
if _, err := txOrm.Insert(&orderProfitInfo); err != nil {
logs.Error("insert orderProfit fail: ", err)
return err
}
return nil
}); err != nil {
return false
}
return true
}
/**
** 判断跳转地址是否符合规则
*/
func ReturnUrlIsValid(c *response.PayBaseResp) *response.PayBaseResp {
if c.Params["returnUrl"] == "" || len(c.Params["returnUrl"]) == 0 {
c.Code = -1
c.Msg = "支付成功后跳转地址不能为空"
}
return c
}
/**
** 判断回调地址是否符合规则
*/
func NotifyUrlIsValid(c *response.PayBaseResp) *response.PayBaseResp {
if c.Params["notifyUrl"] == "" || len(c.Params["notifyUrl"]) == 0 {
c.Code = -1
c.Msg = "支付成功订单回调地址不能空位"
}
return c
}
/**
** 判断设备类型是否符合规则
*/
func OsTypeIsValid(c *response.PayBaseResp) *response.PayBaseResp {
if c.Params["osType"] == "" || len(c.Params["osType"]) == 0 {
c.Code = -1
c.Msg = "支付设备系统类型不能为空,默认填写\"1\"即可"
}
return c
}
/**
** 判断支付类型字段是否符合规则
*/
func PayWayCodeIsValid(c *response.PayBaseResp) *response.PayBaseResp {
if c.Params["payWayCode"] == "" || len(c.Params["payWayCode"]) == 0 {
c.Code = -1
c.Msg = "支付类型字段不能为空"
return c
}
if !strings.Contains(c.Params["payWayCode"], "SCAN") {
c.Code = -1
c.Msg = "扫码支付不支持这种支付类型"
} else {
scanPayWayCodes := conf.GetScanPayWayCodes()
for _, v := range scanPayWayCodes {
if c.Params["payWayCode"] == v {
c.PayWayCode = strings.Replace(c.Params["payWayCode"], "-", "_", -1)
return c
}
}
c.Code = -1
c.Msg = "不存在这种支付类型,请仔细阅读对接文档"
}
return c
}
func ProductIsValid(c *response.PayBaseResp) *response.PayBaseResp {
if c.Params["productName"] == "" || len(c.Params["productName"]) == 0 {
c.Code = -1
c.Msg = "商品描述信息字段不能为空"
}
return c
}
func OrderPeriodIsValid(c *response.PayBaseResp) *response.PayBaseResp {
if c.Params["orderPeriod"] == "" || len(c.Params["orderPeriod"]) == 0 {
c.Code = -1
c.Msg = "订单过期时间不能为空,默认填写\"1\"即可"
}
return c
}
//判断订单金额
func OrderPriceIsValid(c *response.PayBaseResp) *response.PayBaseResp {
if c.Params["orderPrice"] == "" || len(c.Params["orderPrice"]) == 0 {
c.Code = -1
c.Msg = "订单金额不能为空"
return c
}
a, err := strconv.ParseFloat(c.Params["orderPrice"], 64)
if err != nil {
logs.Error("order price is invalid ", c.Params["orderPrice"])
c.Code = -1
c.Msg = "订单金额非法"
}
c.OrderAmount = a
return c
}
//判断金额订单号是否为空或者有重复
func OrderIsValid(c *response.PayBaseResp) *response.PayBaseResp {
if c.Params["orderNo"] == "" || len(c.Params["orderNo"]) == 0 {
c.Code = -1
c.Msg = "商户订单号不能为空"
return c
}
if order.OrderNoIsEixst(c.Params["orderNo"]) {
c.Code = -1
c.Msg = "商户订单号重复"
}
return c
}
//判断ip是否在白名单中
func IpIsWhite() bool {
//TODO
return true
}