Browse Source

fix:bug

token_replace
黄梓健 5 years ago
parent
commit
af5f359371
  1. 3
      models/customer_order.go
  2. 3
      models/customer_order_sub.go
  3. 27
      models/user_prize.go
  4. 206
      services/pay/handle.go
  5. 3
      services/pay/order.go

3
models/customer_order.go

@ -85,7 +85,8 @@ func (t *CustomerOrder) UpdateStatusBy(outTradeNo string, originStatus, status i
func GetExpiredAtLiveCustomerOrder() ([]*CustomerOrder, error) { func GetExpiredAtLiveCustomerOrder() ([]*CustomerOrder, error) {
orders := make([]*CustomerOrder, 0) orders := make([]*CustomerOrder, 0)
err := core.GetXormAuto().Where("type=1 and is_delete=0 and status=0 and expire_time <= ? and out_trade_no<>''", time.Now().Unix()).Find(&orders)
err := core.GetXormAuto().Where("type=1 and is_delete=0 and "+
"status=0 and expire_time <= ? and out_trade_no<>''", time.Now().Unix()).Find(&orders)
if err != nil { if err != nil {
return nil, err return nil, err
} }

3
models/customer_order_sub.go

@ -36,8 +36,7 @@ func GetCustomerOrderSubsByOrderNos(orderNos ...string) (subs []map[string]strin
err = core.GetXormAuto().Table(new(CustomerOrderSub)).Alias("s"). err = core.GetXormAuto().Table(new(CustomerOrderSub)).Alias("s").
Select("s.order_no, s.goods_id, s.goods_num, s.good_name, s.good_price, g.goods_pic_url"). Select("s.order_no, s.goods_id, s.goods_num, s.good_name, s.good_price, g.goods_pic_url").
Join("left", new(CustomerGoods).Alias("g"), "g.id=s.goods_id"). Join("left", new(CustomerGoods).Alias("g"), "g.id=s.goods_id").
Where("s.is_delete=0").In("s.order_no", orderNos).
Desc("s.created_at").Find(&subs)
Where("s.is_delete=0").In("s.order_no", orderNos).Desc("s.created_at").Find(&subs)
return return
} }

27
models/user_prize.go

@ -8,19 +8,20 @@ import (
const UserPrizeTableName = TableNamePrefix + "user_prize" const UserPrizeTableName = TableNamePrefix + "user_prize"
type UserPrize struct { type UserPrize struct {
Id int64 `json:"id" xorm:"not null pk autoincr INT(11)"`
UserId int64 `json:"user_id" xorm:"not null comment('用户表id') INT(11)"`
ActivityId int64 `json:"activity_id" xorm:"not null comment('互动表id') INT(11)"`
RehearsalId int64 `json:"rehearsal_id" xorm:"not null default(0) comment('彩排id') INT(11)"`
ArchId int `json:"arch_id" xorm:"not null default 0 comment('归档id') INT(11)"`
ActivityName string `json:"activity_name" xorm:"not null default('') comment('互动名字') VARCHAR(128)"`
PrizeName string `json:"prize_name" xorm:"not null default('') comment('奖品名字') VARCHAR(128)"`
PrizeImg string `json:"prize_img" xorm:"not null default('') comment('奖品图片') VARCHAR(255)"`
PrizeType int `json:"prize_type" xorm:"not null default(0) comment('订单来源1普通抽奖2订单抽奖3订单送礼4直播下单') INT(11)"`
Status int `json:"status" xorm:"not null default 0 comment('是否已经兑奖0否1是') TINYINT(1)"`
IsDelete bool `json:"is_delete" xorm:"not null default(0) comment('软删除') TINYINT(1)"`
CreatedAt time.Time `json:"created_at" xorm:"not null created comment('创建时间') DATETIME"`
UpdatedAt time.Time `json:"updated_at" xorm:"not null updated comment('更新时间') DATETIME"`
Id int64 `json:"id" xorm:"not null pk autoincr INT(11)"`
UserId int64 `json:"user_id" xorm:"not null comment('用户表id') INT(11)"`
ActivityId int64 `json:"activity_id" xorm:"not null comment('互动表id') INT(11)"`
RehearsalId int64 `json:"rehearsal_id" xorm:"not null default(0) comment('彩排id') INT(11)"`
CustomerOrderId int64 `json:"customer_order_id" xorm:"not null default 0 comment('客户订单id') INT(11)"`
ArchId int `json:"arch_id" xorm:"not null default 0 comment('归档id') INT(11)"`
ActivityName string `json:"activity_name" xorm:"not null default('') comment('互动名字') VARCHAR(128)"`
PrizeName string `json:"prize_name" xorm:"not null default('') comment('奖品名字') VARCHAR(128)"`
PrizeImg string `json:"prize_img" xorm:"not null default('') comment('奖品图片') VARCHAR(255)"`
PrizeType int `json:"prize_type" xorm:"not null default(0) comment('订单来源1普通抽奖2订单抽奖3订单送礼4直播下单') INT(11)"`
Status int `json:"status" xorm:"not null default 0 comment('是否已经兑奖0否1是') TINYINT(1)"`
IsDelete bool `json:"is_delete" xorm:"not null default(0) comment('软删除') TINYINT(1)"`
CreatedAt time.Time `json:"created_at" xorm:"not null created comment('创建时间') DATETIME"`
UpdatedAt time.Time `json:"updated_at" xorm:"not null updated comment('更新时间') DATETIME"`
} }
func (t *UserPrize) TableName() string { func (t *UserPrize) TableName() string {

206
services/pay/handle.go

@ -3,8 +3,8 @@ package pay_service
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/ouxuanserver/osmanthuswine/src/core"
"github.com/xormplus/xorm" "github.com/xormplus/xorm"
"hudongzhuanjia/logger"
"hudongzhuanjia/models" "hudongzhuanjia/models"
"hudongzhuanjia/services/im" "hudongzhuanjia/services/im"
"hudongzhuanjia/utils" "hudongzhuanjia/utils"
@ -21,102 +21,121 @@ func init() {
//处理支付成功之后的回调问题 //处理支付成功之后的回调问题
func HandleSuccess(order *models.UserOrder) error { func HandleSuccess(order *models.UserOrder) error {
if order.GoodType == 4 { // 直播商品 if order.GoodType == 4 { // 直播商品
customerOrder := new(models.CustomerOrder)
_, err := customerOrder.UpdateStatusBy(order.OutTradeNo, 0, 1)
if err != nil {
return errors.New("更新状态发送错误")
}
customerOrder.GetByOutTradeNO(order.OutTradeNo)
if customerOrder.Status != 1 {
return errors.New("商品订单状态信息出现异常")
// 可以使用事务进行控制
activity := new(models.Activity)
exist, err := models.Get(activity, order.ActivityId)
if err != nil || !exist {
return errors.New("互动信息异常")
} }
subs, err := models.GetCustomerOrderSubsByOrderNos(customerOrder.OrderNo)
s := core.GetXormAuto().NewSession()
defer s.Close()
err = s.Begin()
if err != nil { if err != nil {
logger.Error("商品子订单查询异常", err)
s.Rollback()
return err return err
} }
for _, sub := range subs {
go im_service.SendGroupCustomMessage(customerOrder.BuyerId, order.ActivityId, im_service.NoticeLiveGoodBuy,
map[string]interface{}{
"goods_pic_url": sub["goods_pic_url"],
"goods_num": sub["goods_num"],
"good_name": sub["good_name"],
"good_price": sub["good_price"],
"goods_id": sub["goods_id"],
"timestamp": time.Now().Unix(),
})
cOrder := models.CustomerOrder{}
exist, err = s.Where("is_delete=0 and out_trade_no=?", order.OutTradeNo).Get(cOrder)
if err != nil || !exist || cOrder.Status != 0 {
s.Rollback()
return errors.New("客户订单异常")
} }
activity := new(models.Activity)
exist, err := models.Get(activity, order.ActivityId)
if err != nil || !exist {
return errors.New("互动信息异常")
cOrder.Status = 1
_, err = s.Where("out_trade_no=?", order.OutTradeNo).Cols("").Update(&cOrder)
if err != nil {
s.Rollback()
return errors.New("订单状态异常")
} }
gift := new(models.OrderGift)
exist, err = gift.GetByActivityId(order.ActivityId)
subs := make([]map[string]string, 0)
err = core.GetXormAuto().Table(new(models.CustomerOrderSub)).Alias("s").
Select("s.order_no, s.goods_id, s.goods_num, s.good_name, s.good_price, g.goods_pic_url").
Join("left", new(models.CustomerGoods).Alias("g"), "g.id=s.goods_id").
Where("s.is_delete=0 and order_no=?", cOrder.OrderNo).Find(&subs)
if err != nil { if err != nil {
err = fmt.Errorf("获取订单送礼错误: err-> %v, activity_id-> %v", err, activity.Id)
logger.Error(err)
s.Rollback()
return err return err
} }
if !exist {
return nil
gift := models.OrderGift{}
exist, err = s.Where("is_delete=0 and order_gift_switch=? "+"and activity_id=?",
define.StatusOpen, activity.Id).Get(&gift)
if err != nil {
s.Rollback()
return err
} }
prize := new(models.UserPrize)
prize.UserId = order.UserId
prize.ActivityId = order.ActivityId
prize.RehearsalId = activity.RehearsalId
prize.ActivityName = activity.Name
prize.ArchId = activity.ArchId
prize.PrizeName = gift.GiftName
prize.PrizeImg = gift.GiftPicUrl
prize.PrizeType = 4
prize.IsDelete = false
prize.Status = 1
if gift.Num > 0 {
count, err := new(models.CustomerOrder).
Count(activity.Id, activity.RehearsalId, customerOrder.CreatedAt, activity.ArchId)
if err != nil {
err = fmt.Errorf("订单人数统计失败: err->%v, out_trade_no->%v", err, order.OutTradeNo)
logger.Error(err)
return err
}
if gift.Num <= int(count) { // 人数足够
return nil
if exist {
prize := new(models.UserPrize)
prize.UserId = order.UserId
prize.ActivityId = order.ActivityId
prize.RehearsalId = activity.RehearsalId
prize.CustomerOrderId = cOrder.Id
prize.ActivityName = activity.Name
prize.ArchId = activity.ArchId
prize.PrizeName = gift.GiftName
prize.PrizeImg = gift.GiftPicUrl
prize.PrizeType = 4
prize.IsDelete = false
prize.Status = 1
if gift.Num <= 0 { // 不限制
_, err = s.InsertOne(prize)
if err != nil {
s.Rollback()
return err
}
cOrder.UserPrizeId = prize.Id
_, err := s.ID(cOrder.Id).NoAutoCondition().Cols("user_prize_id").Update(&cOrder)
if err != nil {
s.Rollback()
return err
}
} else if gift.Num > 0 {
count, err := s.Where("activity_id=? and rehearsal_id=? and arch_id=? and is_delete=0",
activity.Id, activity.RehearsalId, activity.ArchId).NoAutoCondition().Count(&gift)
if err != nil {
s.Rollback()
return err
}
if gift.Num > int(count) { // 足够
_, err = s.InsertOne(prize)
if err != nil {
s.Rollback()
return err
}
cOrder.UserPrizeId = prize.Id
_, err := s.ID(cOrder.Id).NoAutoCondition().Cols("user_prize_id").Update(&cOrder)
if err != nil {
s.Rollback()
return err
}
}
} }
} }
_, err = prize.Add()
err = s.Commit()
if err != nil { if err != nil {
err = fmt.Errorf("奖品添加失败: err->%v, out_trade_no->%v", err, order.OutTradeNo)
logger.Error(err)
s.Rollback()
return err return err
} }
customerOrder.UserPrizeId = prize.Id
_, err = models.Update(customerOrder.Id, customerOrder, "user_prize_id")
if err != nil {
err = fmt.Errorf("奖品记录添加失败: err-> %v, out_trade_no-> %v, prize_id->%v", err, order.OutTradeNo, prize.Id)
logger.Error(err)
return err
for _, sub := range subs {
go im_service.SendGroupCustomMessage(cOrder.BuyerId, order.ActivityId, im_service.NoticeLiveGoodBuy,
map[string]interface{}{
"goods_pic_url": sub["goods_pic_url"],
"goods_num": sub["goods_num"],
"good_name": sub["good_name"],
"good_price": sub["good_price"],
"goods_id": sub["goods_id"],
"timestamp": time.Now().Unix(),
})
} }
} else if order.GoodType == 3 { // 直播红包 } else if order.GoodType == 3 { // 直播红包
info := new(models.LiveRedEnvelopeRule) info := new(models.LiveRedEnvelopeRule)
_, err := info.UpdateStatusByOutTradeNo(order.OutTradeNo, 1) _, err := info.UpdateStatusByOutTradeNo(order.OutTradeNo, 1)
if err != nil { if err != nil {
err = fmt.Errorf("状态改变出现错误: err->%v, out_trade_no->%v", err, order.OutTradeNo)
logger.Error(err.Error())
return err return err
} }
exist, err := info.GetByOutTradeNo(order.OutTradeNo) exist, err := info.GetByOutTradeNo(order.OutTradeNo)
if err != nil || !exist || info.Status != 1 { if err != nil || !exist || info.Status != 1 {
err = fmt.Errorf("直播红包信息异常: err-> %v, exist->%v, status->%v, out_trade_no->%v",
err, exist, info.Status, order.OutTradeNo)
logger.Error(err.Error())
return err
return errors.New("订单状态异常")
} }
go im_service.SendGroupCustomMessage(info.UserId, order.ActivityId, im_service.NoticeLiveRedPackStart, go im_service.SendGroupCustomMessage(info.UserId, order.ActivityId, im_service.NoticeLiveRedPackStart,
@ -129,29 +148,22 @@ func HandleSuccess(order *models.UserOrder) error {
history := new(models.RewardHistory) history := new(models.RewardHistory)
exist, err := history.GetByOutTradeNo(order.OutTradeNo) exist, err := history.GetByOutTradeNo(order.OutTradeNo)
if err != nil || !exist || history.Status != -1 { if err != nil || !exist || history.Status != -1 {
err = fmt.Errorf("打赏历史异常: err->%v, out_trade_no %v", err, order.OutTradeNo)
logger.Error(err.Error())
return err
return errors.New("订单状态异常")
} }
_, err = history.UpdateStatus(history.Id, 0) _, err = history.UpdateStatus(history.Id, 0)
if err != nil { if err != nil {
err = fmt.Errorf("打赏状态发送变化: err->%v, out_trade_no %v", err, order.OutTradeNo)
logger.Error(err.Error())
return err return err
} }
} else if order.GoodType == 1 { // 霸屏 } else if order.GoodType == 1 { // 霸屏
history := new(models.BullyScreenHistory) history := new(models.BullyScreenHistory)
exist, err := history.GetByOutTradeNo(order.OutTradeNo) exist, err := history.GetByOutTradeNo(order.OutTradeNo)
if err != nil || !exist || history.Status != -1 { if err != nil || !exist || history.Status != -1 {
err = fmt.Errorf("打赏历史异常: err->%v, out_trade_no %v", err, order.OutTradeNo)
logger.Error(err.Error())
return err
return errors.New("订单状态异常")
} }
_, err = history.UpdateStatus(history.Id, 0) _, err = history.UpdateStatus(history.Id, 0)
if err != nil { if err != nil {
err = fmt.Errorf("霸屏状态发送变化: err->%v, out_trade_no %v", err, order.OutTradeNo)
logger.Error(err.Error())
return err
} }
} }
return nil return nil
@ -162,6 +174,7 @@ func HandleGoodOrder() error {
orders, err := models.GetExpiredAtLiveCustomerOrder() orders, err := models.GetExpiredAtLiveCustomerOrder()
if err != nil { if err != nil {
err = fmt.Errorf("获取过期订单信息错误原因: %v", err) err = fmt.Errorf("获取过期订单信息错误原因: %v", err)
return err
} }
for _, v := range orders { for _, v := range orders {
if v.Type != 1 || v.Status != 0 { if v.Type != 1 || v.Status != 0 {
@ -172,20 +185,23 @@ func HandleGoodOrder() error {
err = fmt.Errorf("订单查询出现错误: %v, out_trade_no: %v", err, v.OutTradeNo) err = fmt.Errorf("订单查询出现错误: %v, out_trade_no: %v", err, v.OutTradeNo)
return err return err
} }
if res["trade_state"] != define.CODE_TRADE_NOTPAY {
err = fmt.Errorf("订单非未支付订单: %v, out_trade_no: %v", res["trade_state"], v.OutTradeNo)
return err
}
err = Close(v.OutTradeNo)
if err != nil {
return err
}
v.Status = 9
v.CancelTime = time.Now()
_, err = models.Update(v.Id, v, "status", "cancel_time")
if err != nil {
return err
if res["trade_state"] == define.CODE_TRADE_SUCCESS {
v.Status = 1
_, err = models.Update(v.Id, v, "status")
if err != nil {
return err
}
} else if res["trade_state"] == define.CODE_TRADE_NOTPAY {
err = Close(v.OutTradeNo)
if err != nil {
return err
}
v.Status = 9
v.CancelTime = time.Now()
_, err = models.Update(v.Id, v, "status", "cancel_time")
if err != nil {
return err
}
} }
subs, err := models.GetSubOrdersByOrderNo(v.OrderNo) subs, err := models.GetSubOrdersByOrderNo(v.OrderNo)

3
services/pay/order.go

@ -30,7 +30,6 @@ func UnifiedOrder(content, openId string, fee, goodType, userId, activityId, exp
body["nonce_str"] = nonceStr body["nonce_str"] = nonceStr
body["sign_type"] = pay_core.SignType_MD5 body["sign_type"] = pay_core.SignType_MD5
body["openid"] = openId body["openid"] = openId
//body["time_expire"] = pay_core.FormatTime(time.Unix(expireAt, 0))
resp, err := pay.UnifiedOrder(client, body) resp, err := pay.UnifiedOrder(client, body)
if err != nil { if err != nil {
@ -60,7 +59,6 @@ func UnifiedOrder(content, openId string, fee, goodType, userId, activityId, exp
pac := "prepay_id=" + resp["prepay_id"] pac := "prepay_id=" + resp["prepay_id"]
paySign := pay_core.JsapiSign(client.AppId(), timestamp, nonceStr, pac, pay_core.SignType_MD5, define.ApiKey) paySign := pay_core.JsapiSign(client.AppId(), timestamp, nonceStr, pac, pay_core.SignType_MD5, define.ApiKey)
//go PutOrderDelayQueue(userOrder)
return map[string]interface{}{ return map[string]interface{}{
"appid": client.AppId(), "appid": client.AppId(),
"timestamp": timestamp, "timestamp": timestamp,
@ -99,7 +97,6 @@ func ReOrder(outTradeNo string) (map[string]interface{}, error) {
"out_trade_no": outTradeNo, "out_trade_no": outTradeNo,
"user_order_id": userOrder.Id, "user_order_id": userOrder.Id,
}, nil }, nil
} }
// Notify // Notify

Loading…
Cancel
Save