2
This commit is contained in:
+194
-1
@@ -2,9 +2,14 @@ package controller
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"hepa-calc-api/api/dao"
|
||||
"hepa-calc-api/api/responses"
|
||||
"hepa-calc-api/api/service"
|
||||
"hepa-calc-api/extend/weChat"
|
||||
"hepa-calc-api/global"
|
||||
"hepa-calc-api/utils"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
// CallBack 回调
|
||||
@@ -12,7 +17,7 @@ type CallBack struct{}
|
||||
|
||||
// WxPaySingle 微信支付回调-单项
|
||||
func (r *CallBack) WxPaySingle(c *gin.Context) {
|
||||
notifyReq, err := weChat.ParseNotify(c)
|
||||
notifyReq, transaction, err := weChat.ParseNotify(c)
|
||||
if err != nil {
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
@@ -20,7 +25,195 @@ func (r *CallBack) WxPaySingle(c *gin.Context) {
|
||||
|
||||
// 记录日志
|
||||
utils.LogJsonErr("微信支付回调-单项", notifyReq)
|
||||
utils.LogJsonErr("微信支付回调-单项", transaction)
|
||||
|
||||
if transaction == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "缺少订单数据"})
|
||||
return
|
||||
}
|
||||
|
||||
if transaction.OutTradeNo == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "缺少外部订单号"})
|
||||
return
|
||||
}
|
||||
|
||||
// 查询订单
|
||||
orderSingleDao := dao.OrderSingleDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["order_no"] = transaction.OutTradeNo
|
||||
orderSingle, err := orderSingleDao.GetOrderSingle(maps)
|
||||
if err != nil || orderSingle == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "无订单数据"})
|
||||
return
|
||||
}
|
||||
|
||||
// 验证订单状态-订单状态(1:待支付 2:已完成 3:已取消)
|
||||
if orderSingle.OrderStatus != 1 {
|
||||
message := "订单状态:" + utils.OrderSingleStatusToString(orderSingle.OrderStatus) + " 无需处理"
|
||||
c.JSON(http.StatusOK, gin.H{"code": "SUCCESS", "message": message})
|
||||
return
|
||||
}
|
||||
|
||||
// 处理支付状态
|
||||
if transaction.TradeState == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "缺少支付状态"})
|
||||
return
|
||||
}
|
||||
|
||||
// 处理支付状态
|
||||
wxPayResult, err := weChat.HandlePayStatus(transaction)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": err})
|
||||
return
|
||||
}
|
||||
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 修改订单
|
||||
orderSingleData := make(map[string]interface{})
|
||||
if wxPayResult.OrderStatus != nil {
|
||||
orderSingleData["order_status"] = &wxPayResult.OrderStatus
|
||||
}
|
||||
orderSingleData["pay_status"] = &wxPayResult.PayStatus
|
||||
if wxPayResult.PayTime != nil {
|
||||
orderSingleData["pay_time"] = &wxPayResult.PayTime
|
||||
}
|
||||
orderSingleData["escrow_trade_no"] = transaction.TransactionId
|
||||
orderSingleData["updated_at"] = time.Now().Format("2006-01-02 15:04:05")
|
||||
err = orderSingleDao.EditOrderSingleById(tx, orderSingle.OrderId, orderSingleData)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": err})
|
||||
return
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
c.JSON(http.StatusOK, gin.H{"code": "SUCCESS", "message": "OK"})
|
||||
}
|
||||
|
||||
// WxPayMember 微信支付回调-会员
|
||||
func (r *CallBack) WxPayMember(c *gin.Context) {
|
||||
notifyReq, transaction, err := weChat.ParseNotify(c)
|
||||
if err != nil {
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 记录日志
|
||||
utils.LogJsonErr("微信支付回调-会员", notifyReq)
|
||||
utils.LogJsonErr("微信支付回调-会员", transaction)
|
||||
|
||||
if transaction == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "缺少订单数据"})
|
||||
return
|
||||
}
|
||||
|
||||
if transaction.OutTradeNo == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "缺少外部订单号"})
|
||||
return
|
||||
}
|
||||
|
||||
// 查询订单
|
||||
orderMemberDao := dao.OrderMemberDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["order_no"] = transaction.OutTradeNo
|
||||
orderMember, err := orderMemberDao.GetOrderMember(maps)
|
||||
if err != nil || orderMember == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "无订单数据"})
|
||||
return
|
||||
}
|
||||
|
||||
// 验证订单状态-订单状态(1:待支付 2:已完成 3:已取消)
|
||||
if orderMember.OrderStatus != 1 {
|
||||
message := "订单状态:" + utils.OrderSingleStatusToString(orderMember.OrderStatus) + " 无需处理"
|
||||
c.JSON(http.StatusOK, gin.H{"code": "SUCCESS", "message": message})
|
||||
return
|
||||
}
|
||||
|
||||
// 处理支付状态
|
||||
if transaction.TradeState == nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "缺少支付状态"})
|
||||
return
|
||||
}
|
||||
|
||||
// 处理支付状态
|
||||
wxPayResult, err := weChat.HandlePayStatus(transaction)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": err})
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户数据
|
||||
userDao := dao.UserDao{}
|
||||
user, err := userDao.GetUserById(orderMember.UserId)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"code": "ERROR", "message": "用户数据错误"})
|
||||
return
|
||||
}
|
||||
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 修改订单
|
||||
orderSingleData := make(map[string]interface{})
|
||||
if wxPayResult.OrderStatus != nil {
|
||||
orderSingleData["order_status"] = &wxPayResult.OrderStatus
|
||||
}
|
||||
orderSingleData["pay_status"] = &wxPayResult.PayStatus
|
||||
if wxPayResult.PayTime != nil {
|
||||
orderSingleData["pay_time"] = &wxPayResult.PayTime
|
||||
}
|
||||
orderSingleData["escrow_trade_no"] = transaction.TransactionId
|
||||
orderSingleData["updated_at"] = time.Now().Format("2006-01-02 15:04:05")
|
||||
err = orderMemberDao.EditOrderMemberById(tx, orderMember.OrderId, orderSingleData)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": "ERROR", "message": err})
|
||||
return
|
||||
}
|
||||
|
||||
// 处理未支付单项订单
|
||||
if *wxPayResult.OrderStatus == 2 {
|
||||
orderSingleService := service.OrderSingleService{}
|
||||
res, err := orderSingleService.CompleteUnPayOrderSingle(tx, orderMember.UserId)
|
||||
if err != nil || res == false {
|
||||
tx.Rollback()
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": "ERROR", "message": err})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 处理用户会员过期时间
|
||||
if *wxPayResult.OrderStatus == 2 {
|
||||
// 获取订单配置
|
||||
systemMemberDao := dao.SystemMemberDao{}
|
||||
systemMember, err := systemMemberDao.GetSystemMemberById(orderMember.SystemMemberId)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": "ERROR", "message": "会员配置错误"})
|
||||
return
|
||||
}
|
||||
|
||||
userService := service.UserService{}
|
||||
res := userService.AddUserMemberValidDate(tx, user, int(systemMember.MemberDays))
|
||||
if res == false {
|
||||
tx.Rollback()
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": "ERROR", "message": "增加用户会员到期时间失败"})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
c.JSON(http.StatusOK, gin.H{"code": "SUCCESS", "message": "OK"})
|
||||
}
|
||||
|
||||
+74
-5
@@ -12,7 +12,6 @@ import (
|
||||
"hepa-calc-api/extend/weChat"
|
||||
"hepa-calc-api/global"
|
||||
"hepa-calc-api/utils"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -20,18 +19,89 @@ type Login struct{}
|
||||
|
||||
// LoginPhone 手机号登录
|
||||
func (r *Login) LoginPhone(c *gin.Context) {
|
||||
loginRequest := requests.LoginRequest{}
|
||||
req := loginRequest.LoginPhone
|
||||
if err := c.ShouldBind(&req); err != nil {
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 参数验证
|
||||
if err := global.Validate.Struct(req); err != nil {
|
||||
responses.FailWithMessage(utils.Translate(err), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 检测用户信息
|
||||
userDao := dao.UserDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["mobile"] = req.Mobile
|
||||
user, _ := userDao.GetUser(maps)
|
||||
// 新用户处理方式
|
||||
if user == nil {
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
fmt.Println(r)
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
avatar := "www.baidu.com"
|
||||
|
||||
// 新增用户
|
||||
user = &model.User{
|
||||
UserName: "",
|
||||
Mobile: req.Mobile,
|
||||
RegisterSource: req.Source,
|
||||
OpenId: "",
|
||||
UnionId: "",
|
||||
Age: nil,
|
||||
Sex: 0,
|
||||
Avatar: avatar,
|
||||
IsMember: 0,
|
||||
MemberExpireDate: nil,
|
||||
LoginAt: model.LocalTime(time.Now()),
|
||||
LoginIp: req.LoginIp,
|
||||
}
|
||||
user, err := userDao.AddUser(tx, user)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println(user)
|
||||
|
||||
// 获取app用户信息
|
||||
//var result *string
|
||||
//if result == nil {
|
||||
// // 新增app用户信息
|
||||
//}
|
||||
|
||||
tx.Commit()
|
||||
}
|
||||
|
||||
// 下发token
|
||||
token := &utils.Token{
|
||||
UserId: strconv.FormatInt(1, 10),
|
||||
UserId: fmt.Sprintf("%d", user.UserId),
|
||||
}
|
||||
|
||||
// 生成jwt
|
||||
jwt, err := token.NewJWT()
|
||||
if err != nil {
|
||||
if err != nil || jwt == "" {
|
||||
responses.FailWithMessage("登陆失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
responses.OkWithData(jwt, c)
|
||||
// 处理返回值
|
||||
g := dto.LoginMobileDto(user)
|
||||
|
||||
// 加载token
|
||||
g.LoadToken(jwt)
|
||||
|
||||
responses.OkWithData(g, c)
|
||||
}
|
||||
|
||||
// LoginWx 微信授权登录
|
||||
@@ -55,7 +125,6 @@ func (r *Login) LoginWx(c *gin.Context) {
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
fmt.Println(webAccessToken)
|
||||
|
||||
// 网页授权拉取用户信息
|
||||
userInfo, err := weChat.GetUserInfo(webAccessToken.AccessToken, webAccessToken.OpenId)
|
||||
|
||||
@@ -214,3 +214,68 @@ func (b *OrderMember) GetOrderMemberPay(c *gin.Context) {
|
||||
|
||||
responses.OkWithData(g, c)
|
||||
}
|
||||
|
||||
// GetOrderMemberPayStatus 查询订单支付状态-会员
|
||||
func (b *OrderMember) GetOrderMemberPayStatus(c *gin.Context) {
|
||||
userId := c.GetInt64("UserId")
|
||||
|
||||
id := c.Param("order_id")
|
||||
if id == "" {
|
||||
responses.FailWithMessage("缺少参数", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 将 id 转换为 int64 类型
|
||||
orderId, err := strconv.ParseInt(id, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取订单数据
|
||||
orderMemberDao := dao.OrderMemberDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["user_id"] = userId
|
||||
maps["order_id"] = orderId
|
||||
orderMember, err := orderMemberDao.GetOrderMember(maps)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("订单异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 处理返回值
|
||||
g := dto.GetOrderMemberPayStatus(orderMember)
|
||||
|
||||
// 处理有效期
|
||||
if g.PayStatus == 2 {
|
||||
// 获取单项配置
|
||||
systemMemberDao := dao.SystemMemberDao{}
|
||||
systemMember, err := systemMemberDao.GetSystemMemberById(orderMember.SystemMemberId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户数据
|
||||
userDao := dao.UserDao{}
|
||||
user, err := userDao.GetUserById(orderMember.UserId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("用户数据错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取有效期
|
||||
var validTime time.Time
|
||||
if user.MemberExpireDate != nil {
|
||||
validTime = user.MemberExpireDate.Add(time.Duration(systemMember.MemberDays) * 24 * time.Hour)
|
||||
} else {
|
||||
now := time.Now()
|
||||
validTime = now.Add(time.Duration(systemMember.MemberDays) * 24 * time.Hour)
|
||||
}
|
||||
|
||||
// 加载到期时间
|
||||
g.LoadValidDate(&validTime)
|
||||
}
|
||||
|
||||
responses.OkWithData(g, c)
|
||||
}
|
||||
|
||||
@@ -334,3 +334,56 @@ func (b *OrderSingle) DeleteOrderSingle(c *gin.Context) {
|
||||
tx.Commit()
|
||||
responses.Ok(c)
|
||||
}
|
||||
|
||||
// GetOrderSinglePayStatus 查询订单支付状态-单项
|
||||
func (b *OrderSingle) GetOrderSinglePayStatus(c *gin.Context) {
|
||||
userId := c.GetInt64("UserId")
|
||||
|
||||
id := c.Param("order_id")
|
||||
if id == "" {
|
||||
responses.FailWithMessage("缺少参数", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 将 id 转换为 int64 类型
|
||||
orderId, err := strconv.ParseInt(id, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取订单数据
|
||||
orderSingleDao := dao.OrderSingleDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["user_id"] = userId
|
||||
maps["order_id"] = orderId
|
||||
orderSingle, err := orderSingleDao.GetOrderSingle(maps)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("订单异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 处理返回值
|
||||
g := dto.GetOrderSinglePayStatus(orderSingle)
|
||||
|
||||
// 处理有效期
|
||||
if g.PayStatus == 2 {
|
||||
// 获取单项配置
|
||||
systemSingleDao := dao.SystemSingleDao{}
|
||||
|
||||
maps = make(map[string]interface{})
|
||||
systemSingle, err := systemSingleDao.GetSystemSingle(maps)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取有效期
|
||||
validTime := orderSingle.PayTime.Add(time.Duration(systemSingle.ValidDays) * 24 * time.Hour)
|
||||
|
||||
// 加载到期时间
|
||||
g.LoadValidDate(&validTime)
|
||||
}
|
||||
|
||||
responses.OkWithData(g, c)
|
||||
}
|
||||
|
||||
@@ -229,7 +229,7 @@ func (r *Question) GetQuestionBuyStatus(c *gin.Context) {
|
||||
|
||||
// 判断是否还在有效期内
|
||||
now := time.Now()
|
||||
ValidTime := single.PayTime.Add(time.Duration(systemSingle.ValidDays))
|
||||
ValidTime := single.PayTime.Add(time.Duration(systemSingle.ValidDays) * 24 * time.Hour)
|
||||
if ValidTime.Before(now) {
|
||||
continue
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user