175 lines
4.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"hepa-calc-api/api/dao"
"hepa-calc-api/api/model"
"hepa-calc-api/api/responses"
"hepa-calc-api/config"
"hepa-calc-api/extend/app"
"hepa-calc-api/global"
"hepa-calc-api/utils"
"net/http"
"time"
)
type Pay struct{}
// GetPayOrder 获取订单支付数据
func (r *Pay) GetPayOrder(c *gin.Context) {
req := app.PayOrderRequest{}
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 获取header签名
requestSign := c.Request.Header.Get("sign")
if requestSign == "" {
responses.FailWithMessage("缺少签名", c)
return
}
// 验证签名
err := app.VerifySignature(req, requestSign)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
var payStatus int // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
var orderStatus int // 订单状态1:待支付 2:已完成 3:已取消)
var paymentAmountTotal int // 实际付款金额
var userId int64 // 用户id
var orderNo string // 订单编号
var goodName string // 商品名称
var createdAt model.LocalTime // 订单创建时间
var notifyUrl string // 回调通知地址
// 获取订单数据-单项
orderSingleDao := dao.OrderSingleDao{}
maps := make(map[string]interface{})
maps["order_no"] = req.OrderId
orderSingle, _ := orderSingleDao.GetOrderSingle(maps)
if orderSingle != nil {
payStatus = orderSingle.PayStatus
orderStatus = orderSingle.OrderStatus
paymentAmountTotal = int(orderSingle.PaymentAmountTotal * 100)
userId = orderSingle.UserId
orderNo = orderSingle.OrderNo
createdAt = orderSingle.CreatedAt
notifyUrl = config.C.Wechat.NotifyDomain + config.C.Wechat.SinglePayNotifyUrl
// 获取单项数据
questionDao := dao.QuestionDao{}
question, err := questionDao.GetQuestionById(orderSingle.QuestionId)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
goodName = question.QuestionTitle
}
// 获取订单数据-会员
orderMemberDao := dao.OrderMemberDao{}
maps = make(map[string]interface{})
maps["order_no"] = req.OrderId
orderMember, _ := orderMemberDao.GetOrderMember(maps)
if orderMember != nil {
payStatus = orderMember.PayStatus
orderStatus = orderMember.OrderStatus
paymentAmountTotal = int(orderMember.PaymentAmountTotal * 100)
userId = orderMember.UserId
orderNo = orderMember.OrderNo
createdAt = orderMember.CreatedAt
notifyUrl = config.C.Wechat.NotifyDomain + config.C.Wechat.MemberPayNotifyUrl
// 获取对应数据
systemMemberDao := dao.SystemMemberDao{}
systemMember, err := systemMemberDao.GetSystemMemberById(orderMember.SystemMemberId)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
memberDays := fmt.Sprintf("%d", systemMember.MemberDays)
goodName = "肝病算一算" + memberDays + "会员"
}
if orderSingle == nil && orderMember == nil {
c.JSON(http.StatusOK, gin.H{"code": 90002, "message": "订单不存在", "data": nil})
return
}
// 检测订单支付状态
if payStatus == 2 {
c.JSON(http.StatusOK, gin.H{"code": 90000, "message": "订单已支付,请勿重新支付", "data": nil})
return
}
if payStatus == 3 {
c.JSON(http.StatusOK, gin.H{"code": 90003, "message": "订单支付中", "data": nil})
return
}
if payStatus != 1 {
c.JSON(http.StatusOK, gin.H{"code": 90004, "message": "订单支付失败", "data": nil})
return
}
// 检测订单取消状态
if orderStatus == 3 {
c.JSON(http.StatusOK, gin.H{"code": 90001, "message": "订单已关闭", "data": nil})
return
}
if orderStatus == 2 {
c.JSON(http.StatusOK, gin.H{"code": 90004, "message": "订单支付失败", "data": nil})
return
}
// 验证订单过期支付时间
now := time.Now()
validTime := time.Time(createdAt).Add(30 * time.Minute)
if validTime.Before(now) {
c.JSON(http.StatusOK, gin.H{"code": 90001, "message": "订单已关闭", "data": nil})
return
}
// 获取用户数据
userDao := dao.UserDao{}
user, err := userDao.GetUserById(userId)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
appId := config.C.Wechat.AppId
if config.C.Env == "dev" {
appId = config.C.Wechat.TestPayAppId
}
// 处理返回数据
g := app.PayOrderDataResponse{
AppId: appId,
Total: paymentAmountTotal,
Description: "肝病算一算",
OpenId: user.OpenId,
OutTradeNo: orderNo,
Attach: "",
NotifyUrl: notifyUrl,
GoodName: goodName,
}
responses.OkWithData(g, c)
return
}