feat: deposit支付

master
howell 3 years ago
parent 80918f4f38
commit 168cac9edb

@ -8,6 +8,7 @@ import (
"recook/internal/dbc"
"recook/internal/model/order"
"recook/internal/model/user"
"recook/internal/v2/model/jyy"
"recook/internal/v2/model/recook/goods"
user2 "recook/internal/v2/model/recook/user"
"recook/tools"
@ -38,7 +39,7 @@ const (
ErrorWallet = "余额不足,请使用其它方式支付"
)
func createOrder(virtualID uint, ip string, userID uint, password string) error {
func createOrder(virtualID uint, ip string, userID uint, password string, is bool) error {
var od []order.Information
if err := dbc.DB.Find(&od, "virtual_id = ?", virtualID).Error; err != nil {
return err
@ -77,30 +78,52 @@ func createOrder(virtualID uint, ip string, userID uint, password string) error
return errors.New(ErrorBalance)
}
}
var wallet user.Wallet
if err := dbc.DB.First(&wallet, "user_id = ?", userID).Error; err != nil {
return err
}
if wallet.Balance.LessThan(amount) {
return errors.New(ErrorWallet)
}
if err := walletCheck(&wallet, now, password); err != nil {
return err
}
tx := dbc.DB.Begin()
{
for _, o := range od {
if err := payOrder(tx, o, &wallet, ip); err != nil {
tx.Rollback()
return err
if !is {
// 余额支付
if wallet.Balance.LessThan(amount) {
return errors.New(ErrorWallet)
}
tx := dbc.DB.Begin()
{
for _, o := range od {
if err := payOrder(tx, o, &wallet, ip); err != nil {
tx.Rollback()
return err
}
}
}
tx.Commit()
} else {
// 预存款支付
var wallet2 jyy.UserWallet
dbc.DB.First(&wallet2, "user_id = ?", userID)
if wallet2.Deposit.LessThan(amount) {
return errors.New(ErrorWallet)
}
tx := dbc.DB.Begin()
{
for _, o := range od {
if err := payDeposit(tx, o, &wallet2, ip); err != nil {
tx.Rollback()
return err
}
}
}
tx.Commit()
}
tx.Commit()
return nil
}
@ -114,7 +137,7 @@ func walletCheck(wallet *user.Wallet, now int64, passwd string) error {
ErrorCount: wallet.ErrorCount + 1,
UnlockTime: formatime.NewSecondFrom(time.Now().Add(time.Minute * 10)),
})
return errors.New(fmt.Sprintf("%d次错误密码已被锁定请10分钟后再试", passwordLockCount))
return fmt.Errorf("%d次错误,密码已被锁定,请10分钟后再试", passwordLockCount)
} else {
if wallet.UnlockTime.Time.Unix() < now && wallet.ErrorCount == passwordLockCount {
dbc.DB.Model(&wallet).Updates(map[string]interface{}{
@ -153,20 +176,6 @@ func payOrder(tx *gorm.DB, orderInfo order.Information, wallet *user.Wallet, ip
return errors.New("账户扣款失败")
}
//one := user.WalletBalanceList{
// UserID: wallet.UserID,
// Amount: orderInfo.ActualTotalAmount.Mul(decimal.NewFromInt(-1)),
// Style: orderInfo.Style,
// Comment: "订单支付抵扣",
// OrderID: orderInfo.ID,
// OrderTime: orderInfo.CreatedAt,
//}
//err = tx.Create(&one).Error
//if err != nil {
// tx.Rollback()
// http.Err(c, err.Error())
// return
//}
recookUserWalletBalanceListModel := &user2.RecookUserWalletBalanceListModel{
UserId: wallet.UserID,
IncomeType: user2.RecookUserWalletBalanceListIncomeTypePay, // 订单支付
@ -198,7 +207,7 @@ func PayOrder(c *gin.Context) {
}
if !public.Judge(p.OrderID) {
if err = createOrder(p.OrderID, c.ClientIP(), p.UserID, p.Password); err != nil {
if err = createOrder(p.OrderID, c.ClientIP(), p.UserID, p.Password, false); err != nil {
back.Err(c, err.Error())
return
}
@ -273,3 +282,102 @@ func PayOrder(c *gin.Context) {
c.Set("id", p.OrderID)
back.Suc(c, "支付成功", nil)
}
func PayDeposit(c *gin.Context) {
var p appCreateOrderParam
err := tools.ParseParams(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
if !public.Judge(p.OrderID) {
if err = createOrder(p.OrderID, c.ClientIP(), p.UserID, p.Password, true); err != nil {
back.Err(c, err.Error())
return
}
back.Suc(c, "支付成功", nil)
return
}
if err = public.UpdateNormalPay(p.OrderID); err != nil {
back.Err(c, err.Error())
return
}
now := time.Now().Unix()
var orderInfo order.Information
err = dbc.DB.First(&orderInfo, "id = ?", p.OrderID).Error
if err != nil {
back.Err(c, err.Error())
return
}
if !orderInfo.CanPay && orderInfo.OrderType == 2 {
err = errors.New("批发订单运费未确定无法支付")
back.Fail(c, err.Error())
return
}
err = public.ValidateOrderInfo(&orderInfo, now)
if err != nil {
back.Fail(c, err.Error())
return
}
var wallet user.Wallet
dbc.DB.First(&wallet, "user_id = ?", orderInfo.UserID)
var wallet2 jyy.UserWallet
dbc.DB.First(&wallet2, "user_id = ?", orderInfo.UserID)
if wallet2.Deposit.LessThan(orderInfo.ActualTotalAmount) {
back.Fail(c, "余额不足,请使用其它方式支付")
return
}
if len(wallet.Password) == 0 {
back.Fail(c, "没有设置支付密码")
return
}
if err = walletCheck(&wallet, now, p.Password); err != nil {
back.Fail(c, err.Error())
return
}
tx := dbc.DB.Begin()
{
if err = payDeposit(tx, orderInfo, &wallet2, c.ClientIP()); err != nil {
tx.Rollback()
back.Fail(c, err.Error())
return
}
}
tx.Commit()
back.Suc(c, "支付成功", nil)
}
func payDeposit(tx *gorm.DB, orderInfo order.Information, wallet *jyy.UserWallet, ip string) error {
if err := tx.Model(&orderInfo).Updates(
map[string]interface{}{
"PayIP": ip,
"PayMethod": 10,
}).Error; err != nil {
return err
}
if orderInfo.ActualTotalAmount.GreaterThan(decimal.NewFromFloat(0.0)) {
if r := tx.Model(wallet).Where("version = ?", wallet.Version).Updates(map[string]interface{}{
"deposit": gorm.Expr("deposit - ?", orderInfo.ActualTotalAmount),
"version": gorm.Expr("version + 1"),
}).RowsAffected; r == 00 {
return errors.New("账户扣款失败")
}
if err := public.PaySuccessCallback(tx, orderInfo, formatime.NewSecondNow()); err != nil {
return err
}
return nil
}
return nil
}

@ -344,7 +344,9 @@ func SetupRouter(v1 *gin.RouterGroup) {
payR := v1.Group("pay")
{
payR.POST("/recookpay/order/create", recookpay.PayOrder) // 余额钱包订单
payR.POST("/recookpay/order/create", recookpay.PayOrder) // 余额钱包订单
payR.POST("/recookpay/order/create_deposit", recookpay.PayDeposit) // 预存款支付
payR.POST("/recookpay/fund/query", recookpay.QueryFund) // 余额查询
payR.POST("/recookpay/balance/query", recookpay.QueryBalance) // 余额查询
payR.POST("/order/query", wxpay.QueryOrderPay) // 支付状态查询

Loading…
Cancel
Save