mirror of
https://github.com/kongyuebin1/dongfeng-pay.git
synced 2024-12-27 04:32:26 +08:00
194 lines
4.5 KiB
Go
194 lines
4.5 KiB
Go
|
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
|
|||
|
}
|