78 lines
2.1 KiB
Go
78 lines
2.1 KiB
Go
|
package topuplogic
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"errors"
|
|||
|
"github.com/smartwalle/alipay/v3"
|
|||
|
"math"
|
|||
|
"net/url"
|
|||
|
"strconv"
|
|||
|
|
|||
|
"tianyuan-api/apps/sentinel/internal/svc"
|
|||
|
"tianyuan-api/apps/sentinel/sentinel"
|
|||
|
|
|||
|
"github.com/zeromicro/go-zero/core/logx"
|
|||
|
)
|
|||
|
|
|||
|
type AliTopUpNotifyLogic struct {
|
|||
|
ctx context.Context
|
|||
|
svcCtx *svc.ServiceContext
|
|||
|
logx.Logger
|
|||
|
}
|
|||
|
|
|||
|
func NewAliTopUpNotifyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AliTopUpNotifyLogic {
|
|||
|
return &AliTopUpNotifyLogic{
|
|||
|
ctx: ctx,
|
|||
|
svcCtx: svcCtx,
|
|||
|
Logger: logx.WithContext(ctx),
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func (l *AliTopUpNotifyLogic) AliTopUpNotify(in *sentinel.AliTopUpNotifyRequest) (*sentinel.AliTopUpNotifyResponse, error) {
|
|||
|
globalErr := errors.New("error")
|
|||
|
// 初始化支付宝客户端
|
|||
|
client := l.svcCtx.AlipayClient
|
|||
|
|
|||
|
// 解析表单数据
|
|||
|
formData, err := url.ParseQuery(in.RawForm)
|
|||
|
if err != nil {
|
|||
|
l.Logger.Errorf("解析表单数据失败: %v", err)
|
|||
|
return nil, globalErr
|
|||
|
}
|
|||
|
|
|||
|
// 验证签名并解析通知
|
|||
|
notify, err := client.DecodeNotification(formData)
|
|||
|
if err != nil {
|
|||
|
l.Logger.Errorf("通知解析失败: %v", err)
|
|||
|
return nil, globalErr
|
|||
|
}
|
|||
|
|
|||
|
// 验证交易状态
|
|||
|
if notify.TradeStatus == alipay.TradeStatusSuccess {
|
|||
|
l.Logger.Infof("订单 %s 支付成功", notify.OutTradeNo)
|
|||
|
payOrder, findErr := l.svcCtx.PayOrderModel.FindOneByOutTradeNo(l.ctx, notify.OutTradeNo)
|
|||
|
if findErr != nil {
|
|||
|
return nil, globalErr
|
|||
|
}
|
|||
|
if payOrder.OutTradeNo == notify.OutTradeNo && payOrder.Status == 0 {
|
|||
|
notifyAmount, parseFloatErr := strconv.ParseFloat(notify.TotalAmount, 64)
|
|||
|
if parseFloatErr != nil {
|
|||
|
logx.Errorf("金额转换错误: %v", parseFloatErr)
|
|||
|
return nil, globalErr
|
|||
|
}
|
|||
|
logx.Infof("回调金额:%v,订单金额%v", notify.TotalAmount, payOrder.Amount)
|
|||
|
// 比较支付宝返回的金额与数据库存储的金额
|
|||
|
if math.Abs(notifyAmount-payOrder.Amount) < 1e-6 {
|
|||
|
// 金额匹配,继续处理
|
|||
|
} else {
|
|||
|
return nil, globalErr
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
l.Logger.Infof("订单 %s 支付状态: %s", notify.OutTradeNo, notify.TradeStatus)
|
|||
|
}
|
|||
|
|
|||
|
// 返回成功响应
|
|||
|
return &sentinel.AliTopUpNotifyResponse{Success: true}, nil
|
|||
|
}
|