new
This commit is contained in:
@@ -13,11 +13,14 @@ Alipay:
|
||||
AppID: "2021004181633376"
|
||||
PrivateKey: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCC2GNEWrQUg6FVHBdlDcgL1SA1KmRI8IHgSJGvXEsgfo3g62aa5usFXHVz5bMzpIcDu0N+jGtZQIBuuq7TxGwhDvWBygEDXN17p00uwqik/3TsyFvJ4FfbkaS7pRIGfeO/cBTzjqznanPUdHJZ9L39QmTqTefIQQvGOCvgntKxPa/LdS24+ZLA2RNh3TsRzbSxOOJPmUrwvCX8U13F9jH250hvf+Tewz4hyG8CkiMM4d1UpGMndQNr8oTY0vwFbWAG0ZDGgkxjg0iRJ02fgxwShQS1TgY5NxPhpKBiN5C/WG15qCqEw0F3GlpfWZwzUhv1uMiy+xbZ2bGLo1YCtwUtAgMBAAECggEAQ8uk25T3u61cWYH9qTGT1nWug32ciqJ7WN+hBLCYiJSqJMEz380INzXp8Ywx5u83ubo8xYQyVwNxyG3YCge7UwGyOXaWQczLQbe06SaZRSzLw6gozxf7zdvP9B4akdyGtfl4EZ56fkmNDKbtXSjPjDrrmO+Wyg7R7/nI2lDQsF6dXTKD0YiHtTKz40amKgbIYX+qc3yVS0slkVjcfnRczr+PKM5RMsV3Jk2pr6IYeq3E24LnbuVtV76priTqJN3hVSy2Y6JqmAYkI0HCoCuaFGE8ud3J859jjMcUXTRFJyDsKKooa+FZCoEx2ToVMqnb4vjfr1gZifUrw4ZNd5cPoQKBgQC4v/fNTXuA21pb+l4fnqK0o3wFhiNJh920yIlF4Vd0Nsi2/TwqFK6cVhrUFAmKr88hTzY1vkOhd/HLlkWjNDR5OGx1K1BKUAZjWIfProv8lDSckADEI29lro9WzFGy0o4szlEJ2uuUfO/j9Qn2lmx5oFPsz0TI+HoSNFE0q/SlxQKBgQC1ToMLuh0OkucZm1SL6xcjudBX7U0ElZ/TIxRzfxQ/sN911/BRlxrSdCcDMXNuuFpV2ACjDNWWLJM1sRVsOWNA/oXzZf6VTvUDIAv8XrNUt/B87genBVuMTZ2RYmMWCrgW0PE1OrpKGuQCKVsn242B2Xpmee9OnHhBF2uTASDASQKBgBALvD38iMl8Q7DRYfNlF8SQnmjsaYwtXLgi4qlLFQlm6K/b9qnA+hlh8RqSUvHUqyy9cHvidoVDoaCJAKtYEWal2+WhSWvq32MpgUIsasQZKyid6TMf0MEIFDL5s+7QEsEZejhc5zESWNN3qNHd5rX5ktBygArkadXC7XqhpLHxAoGBAJ0dJEKNTZDLjKiMCoAVgT/cTcdkRFGst4tn4tkTTqDCzWJ5di++Geg173i86aMQ7ndlb2fcP1qb1hW5Fy9pq7Eu3zVFNZB9k6TZqIlSJ2VK4IPiYY9C/UpgGCNcdzEqqMxc1Cmkcrq1AtE8tVmc0Mutgnw7Pj2JKkx91yLU32TBAoGAKxssUdTLuf5Z5oFgzpoSES9qwc1h6jlMfsouDzHcZf0aYintD6Vby7SVul5540qYkDkNs0YZ3uZu74LHfoBaWJjYIIVAMSMX+3AtBpQUyYluex64V/g60t+0sFuDWqMvSPU7mZcv6+KIP6vW56GeYdhHf4JqttdIHm9SgkoJjjY="
|
||||
AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2CqoCp95w/JV3RT/gzF4/8QmVT1HQNaeW7yUp+mA7x9AbjvlTW/+eRn6oGAL/XhZLjvHD0XjKLVKX0MJVS1aUQHEHEbOJN4Eu8II45OavD4iZISa7Kp9V6AM+i4qTyaeV2wNDnGxHQBaLVUGCfMR+56EK2YpORdE1H9uy72SSQseVb3bmpsV9EW/IJNmcVL/ut3uA1JWAoRmzlQ7ekxg7p8AYXzYPEHQr1tl7W+M4zv9wO9GKZCxIqMA8U3RP5npPfRaCfIRGzXzCqFEEUvWuidOB7frsvN4jiPD07qpL2Bi9LM1X/ee2kC/oM8Uhd7ERZhG8MbZfijZKxgrsDKBcwIDAQAB"
|
||||
IsProduction: false # 是否是生产环境,true为生产环境,false为沙箱环境
|
||||
IsProduction: true # 是否是生产环境,true为生产环境,false为沙箱环境
|
||||
TopUp:
|
||||
MaxTopUpAmount: 100000
|
||||
Domain:
|
||||
Front: "https://console.tianyuanapi.com"
|
||||
Backend: "https://console.tianyuanapi.com"
|
||||
NotifyURL: "https://6m4685017o.goho.co/api/console/"
|
||||
ReturnURL: "http://127.0.0.1:5173"
|
||||
Subject: "天远数据API使用额度"
|
||||
NotifyURL: "https://6m4685017o.goho.co/api/console/topup/aliTopUpCallback"
|
||||
ReturnURL: "http://127.0.0.1:5173/charge/recharge"
|
||||
UserRpc:
|
||||
Etcd:
|
||||
Hosts:
|
||||
- 127.0.0.1:2379
|
||||
Key: user.rpc
|
||||
@@ -16,8 +16,11 @@ Alipay:
|
||||
IsProduction: true # 是否是生产环境,true为生产环境,false为沙箱环境
|
||||
TopUp:
|
||||
MaxTopUpAmount: 100000
|
||||
Domain:
|
||||
Front: "https://console.tianyuanapi.com"
|
||||
Backend: "https://console.tianyuanapi.com"
|
||||
NotifyURL: "http://console.tianyuanapi.com/api/console/"
|
||||
ReturnURL: "https://console.tianyuanapi.com/charge/recharge"
|
||||
Subject: "天远数据API使用额度"
|
||||
NotifyURL: "http://console.tianyuanapi.com/api/console/topup/aliTopUpCallback"
|
||||
ReturnURL: "https://console.tianyuanapi.com/charge/recharge"
|
||||
UserRpc:
|
||||
Etcd:
|
||||
Hosts:
|
||||
- tyapi_etcd:2379
|
||||
Key: user.rpc
|
||||
@@ -11,6 +11,7 @@ type Config struct {
|
||||
CacheRedis cache.CacheConf // 缓存配置,使用 go-zero 自带的缓存配置结构体
|
||||
Alipay AlipayConfig
|
||||
TopUp TopUpConfig
|
||||
UserRpc zrpc.RpcClientConf
|
||||
}
|
||||
type AlipayConfig struct {
|
||||
AppID string
|
||||
@@ -20,4 +21,7 @@ type AlipayConfig struct {
|
||||
}
|
||||
type TopUpConfig struct {
|
||||
MaxTopUpAmount int64
|
||||
Subject string
|
||||
NotifyURL string
|
||||
ReturnURL string
|
||||
}
|
||||
|
||||
@@ -37,12 +37,12 @@ func (l *AliTopUpLogic) AliTopUp(in *sentinel.AliTopUpRequest) (*sentinel.AliTop
|
||||
// 构造支付请求
|
||||
var p = alipay.TradePagePay{
|
||||
Trade: alipay.Trade{
|
||||
Subject: "天远数据API使用额度",
|
||||
Subject: l.svcCtx.Config.TopUp.Subject,
|
||||
OutTradeNo: outTradeNo,
|
||||
TotalAmount: totalAmount,
|
||||
ProductCode: "FAST_INSTANT_TRADE_PAY",
|
||||
NotifyURL: "https://console.tianyuanapi.com/api/console/", // 异步回调通知地址
|
||||
ReturnURL: "https://console.tianyuanapi.com/charge/recharge", // 支付成功后的跳转地址
|
||||
NotifyURL: l.svcCtx.Config.TopUp.NotifyURL, // 异步回调通知地址
|
||||
ReturnURL: l.svcCtx.Config.TopUp.ReturnURL, // 支付成功后的跳转地址
|
||||
},
|
||||
}
|
||||
_, inserErr := l.svcCtx.PayOrderModel.Insert(l.ctx, &model.PayOrder{
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"math"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"tianyuan-api/apps/user/user"
|
||||
|
||||
"tianyuan-api/apps/sentinel/internal/svc"
|
||||
"tianyuan-api/apps/sentinel/sentinel"
|
||||
@@ -63,7 +64,20 @@ func (l *AliTopUpNotifyLogic) AliTopUpNotify(in *sentinel.AliTopUpNotifyRequest)
|
||||
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
|
||||
}
|
||||
|
||||
@@ -5,8 +5,10 @@ import (
|
||||
"github.com/smartwalle/alipay/v3"
|
||||
"github.com/zeromicro/go-zero/core/stores/redis"
|
||||
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||||
"github.com/zeromicro/go-zero/zrpc"
|
||||
"tianyuan-api/apps/sentinel/internal/config"
|
||||
"tianyuan-api/apps/sentinel/internal/model"
|
||||
"tianyuan-api/apps/user/user"
|
||||
)
|
||||
|
||||
type ServiceContext struct {
|
||||
@@ -18,6 +20,7 @@ type ServiceContext struct {
|
||||
ProductsModel model.ProductsModel
|
||||
UserProductsModel model.UserProductsModel
|
||||
PayOrderModel model.PayOrderModel
|
||||
WalletRpc user.WalletServiceClient
|
||||
}
|
||||
|
||||
func NewServiceContext(c config.Config) *ServiceContext {
|
||||
@@ -41,6 +44,8 @@ func NewServiceContext(c config.Config) *ServiceContext {
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("加载支付宝公钥失败: %v", err))
|
||||
}
|
||||
|
||||
walletRpc := user.NewWalletServiceClient(zrpc.MustNewClient(c.UserRpc).Conn())
|
||||
return &ServiceContext{
|
||||
Config: c,
|
||||
Redis: rds,
|
||||
@@ -50,5 +55,6 @@ func NewServiceContext(c config.Config) *ServiceContext {
|
||||
ProductsModel: model.NewProductsModel(db, c.CacheRedis),
|
||||
UserProductsModel: model.NewUserProductsModel(rds, db, c.CacheRedis),
|
||||
PayOrderModel: model.NewPayOrderModel(db, c.CacheRedis),
|
||||
WalletRpc: walletRpc,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"os"
|
||||
|
||||
"tianyuan-api/apps/sentinel/internal/config"
|
||||
TopUpServer "tianyuan-api/apps/sentinel/internal/server/TopUp"
|
||||
productServer "tianyuan-api/apps/sentinel/internal/server/product"
|
||||
secretServer "tianyuan-api/apps/sentinel/internal/server/secret"
|
||||
userproductServer "tianyuan-api/apps/sentinel/internal/server/userproduct"
|
||||
@@ -48,6 +49,7 @@ func main() {
|
||||
sentinel.RegisterSecretServer(grpcServer, secretServer.NewSecretServer(ctx))
|
||||
sentinel.RegisterProductServer(grpcServer, productServer.NewProductServer(ctx))
|
||||
sentinel.RegisterUserProductServer(grpcServer, userproductServer.NewUserProductServer(ctx))
|
||||
sentinel.RegisterTopUpServer(grpcServer, TopUpServer.NewTopUpServer(ctx))
|
||||
|
||||
if c.Mode == service.DevMode || c.Mode == service.TestMode {
|
||||
reflection.Register(grpcServer)
|
||||
|
||||
Reference in New Issue
Block a user