|
|
|
package controllers
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/HFO4/cloudreve/pkg/payment"
|
|
|
|
"github.com/HFO4/cloudreve/pkg/util"
|
|
|
|
"github.com/HFO4/cloudreve/service/vas"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"github.com/qingwg/payjs/notify"
|
|
|
|
"github.com/smartwalle/alipay/v3"
|
|
|
|
)
|
|
|
|
|
|
|
|
// GetQuota 获取容量配额信息
|
|
|
|
func GetQuota(c *gin.Context) {
|
|
|
|
var service vas.GeneralVASService
|
|
|
|
if err := c.ShouldBindUri(&service); err == nil {
|
|
|
|
res := service.Quota(c, CurrentUser(c))
|
|
|
|
c.JSON(200, res)
|
|
|
|
} else {
|
|
|
|
c.JSON(200, ErrorResponse(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetProduct 获取商品信息
|
|
|
|
func GetProduct(c *gin.Context) {
|
|
|
|
var service vas.GeneralVASService
|
|
|
|
if err := c.ShouldBindUri(&service); err == nil {
|
|
|
|
res := service.Products(c, CurrentUser(c))
|
|
|
|
c.JSON(200, res)
|
|
|
|
} else {
|
|
|
|
c.JSON(200, ErrorResponse(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewOrder 新建支付订单
|
|
|
|
func NewOrder(c *gin.Context) {
|
|
|
|
var service vas.CreateOrderService
|
|
|
|
if err := c.ShouldBindJSON(&service); err == nil {
|
|
|
|
res := service.Create(c, CurrentUser(c))
|
|
|
|
c.JSON(200, res)
|
|
|
|
} else {
|
|
|
|
c.JSON(200, ErrorResponse(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// OrderStatus 查询订单状态
|
|
|
|
func OrderStatus(c *gin.Context) {
|
|
|
|
var service vas.OrderService
|
|
|
|
if err := c.ShouldBindUri(&service); err == nil {
|
|
|
|
res := service.Status(c, CurrentUser(c))
|
|
|
|
c.JSON(200, res)
|
|
|
|
} else {
|
|
|
|
c.JSON(200, ErrorResponse(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetRedeemInfo 获取兑换码信息
|
|
|
|
func GetRedeemInfo(c *gin.Context) {
|
|
|
|
var service vas.RedeemService
|
|
|
|
if err := c.ShouldBindUri(&service); err == nil {
|
|
|
|
res := service.Query(c)
|
|
|
|
c.JSON(200, res)
|
|
|
|
} else {
|
|
|
|
c.JSON(200, ErrorResponse(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DoRedeem 获取兑换码信息
|
|
|
|
func DoRedeem(c *gin.Context) {
|
|
|
|
var service vas.RedeemService
|
|
|
|
if err := c.ShouldBindUri(&service); err == nil {
|
|
|
|
res := service.Redeem(c, CurrentUser(c))
|
|
|
|
c.JSON(200, res)
|
|
|
|
} else {
|
|
|
|
c.JSON(200, ErrorResponse(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AlipayCallback 支付宝回调
|
|
|
|
func AlipayCallback(c *gin.Context) {
|
|
|
|
pay, err := payment.NewPaymentInstance("alipay")
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Debug("[支付宝回调] 无法创建支付宝客户端, %s", err)
|
|
|
|
c.Status(400)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
res, err := pay.(*payment.Alipay).Client.GetTradeNotification(c.Request)
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Debug("[支付宝回调] 回调验证失败, %s", err)
|
|
|
|
c.Status(403)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if res != nil && res.TradeStatus == "TRADE_SUCCESS" {
|
|
|
|
// 支付成功
|
|
|
|
if err := payment.OrderPaid(res.OutTradeNo); err != nil {
|
|
|
|
util.Log().Debug("[支付宝回调] 支付处理失败, %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 确认收到通知消息
|
|
|
|
alipay.AckNotification(c.Writer)
|
|
|
|
}
|
|
|
|
|
|
|
|
// PayJSCallback PayJS回调
|
|
|
|
func PayJSCallback(c *gin.Context) {
|
|
|
|
pay, err := payment.NewPaymentInstance("payjs")
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Debug("[PayJS回调] 无法创建支付宝客户端, %s", err)
|
|
|
|
c.Status(400)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
payNotify := pay.(*payment.PayJSClient).Client.GetNotify(c.Request, c.Writer)
|
|
|
|
|
|
|
|
//设置接收消息的处理方法
|
|
|
|
payNotify.SetMessageHandler(func(msg notify.Message) {
|
|
|
|
if err := payment.OrderPaid(msg.OutTradeNo); err != nil {
|
|
|
|
util.Log().Debug("[PayJS回调] 支付处理失败, %s", err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
//处理消息接收以及回复
|
|
|
|
err = payNotify.Serve()
|
|
|
|
if err != nil {
|
|
|
|
util.Log().Debug("[PayJS回调] 回调处理失败, %s", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
//发送回复的消息
|
|
|
|
payNotify.SendResponseMsg()
|
|
|
|
|
|
|
|
}
|