modify files.
This commit is contained in:
48
user.go
48
user.go
@ -152,6 +152,9 @@ func queryUserBenefits(c echo.Context) (bool, error) {
|
||||
return false, err
|
||||
} else {
|
||||
logger.Debug("CheckAndDecrement", zap.Int("ID", ID), zap.String("timeZone", timeZone), zap.Int("secondsFromGMT", secondsFromGMT), zap.Int("status", status))
|
||||
if status != 0 {
|
||||
logger.Warn("user beyond limit.", zap.Int("ID", ID), zap.String("timeZone", timeZone), zap.Int("secondsFromGMT", secondsFromGMT), zap.Int("status", status))
|
||||
}
|
||||
return status == 0, nil
|
||||
}
|
||||
} else if err != nil {
|
||||
@ -192,16 +195,24 @@ func UpdateOrderByVerify(ID int, AppAcountToken string, OriginTransID string, tr
|
||||
// 如果是Sandbox交易,那么直接使用Transaction中的过期时间,注意匹配时区
|
||||
if strings.EqualFold(string(transantion.Environment), "Sandbox") {
|
||||
nextDay = time.Unix(transantion.ExpiresDate/1000, 0).In(time.Local)
|
||||
logger.Debug("Sandbox ExpireDate", zap.Any("ExpireDate", nextDay), zap.Any("NowDate", currentTime))
|
||||
logger.Debug("Sandbox ExpireDate", zap.Int("ID", ID), zap.Any("ExpireDate", nextDay), zap.Any("NowDate", currentTime))
|
||||
} else {
|
||||
logger.Debug("Production ExpireDate", zap.Int("ID", ID), zap.Any("ExpireDate", nextDay), zap.Any("NowDate", currentTime))
|
||||
}
|
||||
|
||||
// TODO: transaction.TransactionReason 有新购和续费,需要区分;同一个购买或者续费事件,可能有通知多次,需要排重
|
||||
var tmpID int
|
||||
errDup := db.MySQL.QueryRow("SELECT ID from vip where TransactionID = ? and OriginalTransactionID = ? and IsVip = 1 and ExpDate > ?", transantion.TransactionID, transantion.OriginalTransactionId, currentTime).Scan(&tmpID)
|
||||
if errDup != sql.ErrNoRows {
|
||||
// 表示重复了,可以直接返回
|
||||
logger.Info("duplicate request", zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID), zap.String("TransactionID", transantion.TransactionID))
|
||||
return nil
|
||||
// 不为空,有两种可能,一是请求重复了,比如用户发起了Restore;另一种可能,是用户换了设备,甚至是UserID,这时候就得处理,把原来的ID会员拿掉,换到新的上面来。
|
||||
if tmpID != ID {
|
||||
logger.Warn("duplicate request, but different ID", zap.Int("tblID", tmpID), zap.Int("ReqID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID), zap.String("TransactionID", transantion.TransactionID))
|
||||
return nil
|
||||
} else {
|
||||
// 表示重复了,可以直接返回
|
||||
logger.Info("duplicate request", zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID), zap.String("TransactionID", transantion.TransactionID))
|
||||
return nil
|
||||
}
|
||||
} else if errDup != nil {
|
||||
logger.Info("prepare to insert record", zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID))
|
||||
// 这里不返回,继续尝试更新。
|
||||
@ -213,15 +224,40 @@ func UpdateOrderByVerify(ID int, AppAcountToken string, OriginTransID string, tr
|
||||
ON DUPLICATE KEY UPDATE
|
||||
IsVip = 1, AppStore = ?, ProductID = ?, ProductType = ?, Environment = ?, Price = ?, Currency = ?, Storefront = ?, PurchaseDate = ?, ExpDate = ?, AutoRenew = ?, OriginalTransactionID = ? , TransactionID = ?, AppAccountToken = ?, TransactionReason = ? `
|
||||
|
||||
_, err2 := db.MySQL.Exec(sql,
|
||||
// 开始事务
|
||||
tx, err := db.MySQL.Begin()
|
||||
if err != nil {
|
||||
logger.Error("Mysql Transaction error.")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 写入订阅信息
|
||||
_, err2 := tx.Exec(sql,
|
||||
ID, APPSTORE, transantion.ProductID, ProductType, transantion.Environment, Price, Currency, transantion.Storefront, currentTime, nextDay, 1, OriginTransID, transantion.TransactionID, transantion.AppAccountToken, transantion.TransactionReason,
|
||||
APPSTORE, transantion.ProductID, ProductType, transantion.Environment, Price, Currency, transantion.Storefront, currentTime, nextDay, 1, OriginTransID, transantion.TransactionID, transantion.AppAccountToken, transantion.TransactionReason)
|
||||
|
||||
if err2 != nil {
|
||||
logger.Error("UpdateOrderByVerify", zap.Error(err), zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID))
|
||||
logger.Error("UpdateOrderByVerify", zap.Error(err2), zap.Int("ID", ID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID))
|
||||
tx.Rollback()
|
||||
return err2
|
||||
}
|
||||
|
||||
// 如果是订阅信息转移到了另外一个ID上,需要把旧的ID 的vip去掉。
|
||||
if tmpID != ID {
|
||||
// 更新vip表,tmpID 行的 ExpDate 设置为 currentTime
|
||||
_, err3 := tx.Exec("update vip set ExpDate = ? where ID = ? ", currentTime, tmpID)
|
||||
if err3 != nil {
|
||||
logger.Error("UpdateOrderByVerify, update error", zap.Error(err3), zap.Int("ID", tmpID), zap.String("AppAcountToken", AppAcountToken), zap.String("OriginTransID", OriginTransID))
|
||||
tx.Rollback()
|
||||
return err3
|
||||
}
|
||||
}
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
logger.Error("tx.Commit", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user