92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
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: 1,
|
||
})
|
||
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
|
||
}
|