This commit is contained in:
2024-07-29 08:58:07 +08:00
parent 5dd3c44917
commit 73e41552e4
20 changed files with 638 additions and 28 deletions
+194 -1
View File
@@ -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
View File
@@ -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)
+65
View File
@@ -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)
}
+53
View File
@@ -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)
}
+1 -1
View File
@@ -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
}