tianyuan-api-server/apps/sentinel/internal/logic/topup/alitopupnotifylogic.go
2024-10-15 17:19:23 +08:00

92 lines
2.5 KiB
Go
Raw 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 topuplogic
import (
"context"
"errors"
"github.com/smartwalle/alipay/v3"
"math"
"net/url"
"strconv"
"tianyuan-api/apps/user/user"
"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 {
payOrder.Status = 1
updateErr := l.svcCtx.PayOrderModel.Update(l.ctx, payOrder)
if updateErr != nil {
return nil, globalErr
}
_, rechargeWallet := l.svcCtx.WalletRpc.RechargeWallet(l.ctx, &user.RechargeWalletRequest{
UserId: payOrder.UserId,
OutTradeNo: payOrder.OutTradeNo,
Amount: int64(payOrder.Amount),
PaymentMethod: 0,
})
if rechargeWallet != nil {
return nil, globalErr
}
} else {
return nil, globalErr
}
}
} else {
l.Logger.Infof("订单 %s 支付状态: %s", notify.OutTradeNo, notify.TradeStatus)
}
// 返回成功响应
return &sentinel.AliTopUpNotifyResponse{Success: true}, nil
}