fix wx payment
This commit is contained in:
parent
8d3750618c
commit
6099e5bec7
@ -13,7 +13,8 @@ type (
|
|||||||
PayMethod string `json:"pay_method"`
|
PayMethod string `json:"pay_method"`
|
||||||
}
|
}
|
||||||
PaymentResp {
|
PaymentResp {
|
||||||
prepayID string `json:"prepay_id"`
|
prepayData interface{} `json:"prepay_data"`
|
||||||
|
prepayId string `json:"prepay_id"`
|
||||||
OrderID int64 `json:"order_id"`
|
OrderID int64 `json:"order_id"`
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -36,10 +36,12 @@ Alipay:
|
|||||||
NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/alipay/callback"
|
NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/alipay/callback"
|
||||||
ReturnURL: "http://localhost:5678/inquire"
|
ReturnURL: "http://localhost:5678/inquire"
|
||||||
Wxpay:
|
Wxpay:
|
||||||
AppID: "1682635136"
|
AppID: "wxa581992dc74d860e"
|
||||||
MchID: "1682635136"
|
MchID: "1704330055"
|
||||||
MchCertificateSerialNumber: "5369B8AEEBDCF7AF274510252E6A8C0659C30F61"
|
MchPublicKeyID: "PUB_KEY_ID_0117043300552025010900447500000187"
|
||||||
MchApiv3Key: "e3ea4cf0765f1e71b01bb387dfcdbc9f"
|
MchPublicKeyPath: "etc/merchant/pub_key.pem"
|
||||||
|
MchCertificateSerialNumber: "434FE8C0FC8CFEF28B76B3EF35DD2297E977A3CB"
|
||||||
|
MchApiv3Key: "h6Jk9Qm7W1pXyFzA4bL2V8CzH0K3wDqw"
|
||||||
MchPrivateKeyPath: "etc/merchant/apiclient_key.pem"
|
MchPrivateKeyPath: "etc/merchant/apiclient_key.pem"
|
||||||
NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/wechat/callback"
|
NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/wechat/callback"
|
||||||
RefundNotifyUrl: "https://6m4685017o.goho.co/api/v1/wechat/refund_callback"
|
RefundNotifyUrl: "https://6m4685017o.goho.co/api/v1/wechat/refund_callback"
|
||||||
|
@ -38,13 +38,15 @@ Alipay:
|
|||||||
NotifyUrl: "https://www.tianyuandb.com/api/v1/pay/alipay/callback"
|
NotifyUrl: "https://www.tianyuandb.com/api/v1/pay/alipay/callback"
|
||||||
ReturnURL: "https://www.tianyuandb.com/report"
|
ReturnURL: "https://www.tianyuandb.com/report"
|
||||||
Wxpay:
|
Wxpay:
|
||||||
AppID: "1682635136"
|
AppID: "wxa581992dc74d860e"
|
||||||
MchID: "1682635136"
|
MchID: "1704330055"
|
||||||
MchCertificateSerialNumber: "5369B8AEEBDCF7AF274510252E6A8C0659C30F61"
|
MchPublicKeyID: "PUB_KEY_ID_0117043300552025010900447500000187"
|
||||||
MchApiv3Key: "e3ea4cf0765f1e71b01bb387dfcdbc9f"
|
MchPublicKeyPath: "etc/merchant/pub_key.pem"
|
||||||
|
MchCertificateSerialNumber: "434FE8C0FC8CFEF28B76B3EF35DD2297E977A3CB"
|
||||||
|
MchApiv3Key: "h6Jk9Qm7W1pXyFzA4bL2V8CzH0K3wDqw"
|
||||||
MchPrivateKeyPath: "etc/merchant/apiclient_key.pem"
|
MchPrivateKeyPath: "etc/merchant/apiclient_key.pem"
|
||||||
NotifyUrl: "https://app.tianyuandb.com/api/v1/pay/wechat/callback"
|
NotifyUrl: "https://www.tianyuandb.com/api/v1/pay/wechat/callback"
|
||||||
RefundNotifyUrl: "https://app.tianyuandb.com/api/v1/wechat/refund_callback"
|
RefundNotifyUrl: "https://www.tianyuandb.com/api/v1/wechat/refund_callback"
|
||||||
Applepay:
|
Applepay:
|
||||||
ProductionVerifyURL: "https://api.storekit.itunes.apple.com/inApps/v1/transactions/receipt"
|
ProductionVerifyURL: "https://api.storekit.itunes.apple.com/inApps/v1/transactions/receipt"
|
||||||
SandboxVerifyURL: "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/receipt"
|
SandboxVerifyURL: "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/receipt"
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
-----BEGIN PRIVATE KEY-----
|
||||||
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
|
||||||
5DljdOYX9IYIHHn3Ig4GeTGe
|
hZ3T2j+d4u74saGGaxOlqw==
|
||||||
-----END PRIVATE KEY-----
|
-----END PRIVATE KEY-----
|
||||||
|
9
app/user/cmd/api/etc/merchant/pub_key.pem
Normal file
9
app/user/cmd/api/etc/merchant/pub_key.pem
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsNH2kztg9gybkuulreL+
|
||||||
|
BMyakxmKTFqrujYLm+S40v64KbNH3+sWdf1XR59vWjSvGWo+BAbuSIHNmIIFMFKE
|
||||||
|
sUxqHAYbta4oD9Ogr0+88drnXv+AA6vxQML0KaaTuHessvUhGC5GEUxa+TFefO9/
|
||||||
|
EjbwL1E/XQ8oBkxHJO6RjKevuts39RjEyocnNhV7m8RP6WIBQeJDXhbfO1etcwdJ
|
||||||
|
B2yQ1eoPK9kGAqQ7wL4pDXrLXMfS1DXlNHsLf4if7rwu3fibk/qfkKdtmqvUw39f
|
||||||
|
tCKZRiexIq6ad9kTTjouXUU5EMRAn3ocRvNzCD4RaW1qVYMxFQ8AraQ8W3MXlPeL
|
||||||
|
EQIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
@ -50,6 +50,8 @@ type AlipayConfig struct {
|
|||||||
type WxpayConfig struct {
|
type WxpayConfig struct {
|
||||||
AppID string
|
AppID string
|
||||||
MchID string
|
MchID string
|
||||||
|
MchPublicKeyID string
|
||||||
|
MchPublicKeyPath string
|
||||||
MchCertificateSerialNumber string
|
MchCertificateSerialNumber string
|
||||||
MchApiv3Key string
|
MchApiv3Key string
|
||||||
MchPrivateKeyPath string
|
MchPrivateKeyPath string
|
||||||
|
@ -68,7 +68,7 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp,
|
|||||||
if aesEncryptErr != nil {
|
if aesEncryptErr != nil {
|
||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 加密参数失败: %+v", aesEncryptErr)
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 加密参数失败: %+v", aesEncryptErr)
|
||||||
}
|
}
|
||||||
var prepayID string
|
var prepayData interface{}
|
||||||
var outTradeNo string
|
var outTradeNo string
|
||||||
var amount float64
|
var amount float64
|
||||||
user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID)
|
user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID)
|
||||||
@ -84,13 +84,13 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp,
|
|||||||
var createOrderErr error
|
var createOrderErr error
|
||||||
if req.PayMethod == "wechatpay" {
|
if req.PayMethod == "wechatpay" {
|
||||||
outTradeNo = l.svcCtx.WechatPayService.GenerateOutTradeNo()
|
outTradeNo = l.svcCtx.WechatPayService.GenerateOutTradeNo()
|
||||||
prepayID, createOrderErr = l.svcCtx.WechatPayService.CreateWechatOrder(l.ctx, amount, product.ProductName, outTradeNo)
|
prepayData, createOrderErr = l.svcCtx.WechatPayService.CreateWechatOrder(l.ctx, amount, product.ProductName, outTradeNo)
|
||||||
} else if req.PayMethod == "alipay" {
|
} else if req.PayMethod == "alipay" {
|
||||||
outTradeNo = l.svcCtx.AlipayService.GenerateOutTradeNo()
|
outTradeNo = l.svcCtx.AlipayService.GenerateOutTradeNo()
|
||||||
prepayID, createOrderErr = l.svcCtx.AlipayService.CreateAlipayOrder(l.ctx, amount, product.ProductName, outTradeNo, brand)
|
prepayData, createOrderErr = l.svcCtx.AlipayService.CreateAlipayOrder(l.ctx, amount, product.ProductName, outTradeNo, brand)
|
||||||
} else if req.PayMethod == "appleiap" {
|
} else if req.PayMethod == "appleiap" {
|
||||||
outTradeNo = l.svcCtx.ApplePayService.GenerateOutTradeNo()
|
outTradeNo = l.svcCtx.ApplePayService.GenerateOutTradeNo()
|
||||||
prepayID = l.svcCtx.ApplePayService.GetIappayAppID(product.ProductEn)
|
prepayData = l.svcCtx.ApplePayService.GetIappayAppID(product.ProductEn)
|
||||||
}
|
}
|
||||||
if createOrderErr != nil {
|
if createOrderErr != nil {
|
||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 创建支付订单失败: %+v", createOrderErr)
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 创建支付订单失败: %+v", createOrderErr)
|
||||||
@ -132,5 +132,11 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp,
|
|||||||
return nil, transErr
|
return nil, transErr
|
||||||
}
|
}
|
||||||
|
|
||||||
return &types.PaymentResp{PrepayID: prepayID, OrderID: orderID}, nil
|
switch v := prepayData.(type) {
|
||||||
|
case string:
|
||||||
|
// 如果 prepayData 是字符串类型,直接返回
|
||||||
|
return &types.PaymentResp{PrepayId: v, OrderID: orderID}, nil
|
||||||
|
default:
|
||||||
|
return &types.PaymentResp{PrepayData: prepayData, OrderID: orderID}, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,23 +114,23 @@ func GetAccessToken(code string) (*AccessTokenResp, error) {
|
|||||||
|
|
||||||
resp, err := http.Get(url)
|
resp, err := http.Get(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "获取access_token失败")
|
return nil, err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "读取access_token响应失败")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var accessTokenResp AccessTokenResp
|
var accessTokenResp AccessTokenResp
|
||||||
if err := json.Unmarshal(body, &accessTokenResp); err != nil {
|
if err = json.Unmarshal(body, &accessTokenResp); err != nil {
|
||||||
return nil, errors.Wrap(err, "解析access_token响应失败")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if accessTokenResp.AccessToken == "" {
|
//if accessTokenResp.AccessToken == "" {
|
||||||
return nil, errors.New("获取access_token失败")
|
// return nil, errors.New("accessTokenResp.AccessToken为空")
|
||||||
}
|
//}
|
||||||
|
|
||||||
return &accessTokenResp, nil
|
return &accessTokenResp, nil
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"tydata-server/app/user/cmd/api/internal/config"
|
"tydata-server/app/user/cmd/api/internal/config"
|
||||||
|
"tydata-server/app/user/model"
|
||||||
|
"tydata-server/common/ctxdata"
|
||||||
"tydata-server/pkg/lzkit/lzUtils"
|
"tydata-server/pkg/lzkit/lzUtils"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,25 +37,31 @@ type WechatPayService struct {
|
|||||||
config config.WxpayConfig
|
config config.WxpayConfig
|
||||||
wechatClient *core.Client
|
wechatClient *core.Client
|
||||||
notifyHandler *notify.Handler
|
notifyHandler *notify.Handler
|
||||||
|
userAuthModel model.UserAuthModel
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWechatPayService 初始化微信支付服务
|
// NewWechatPayService 初始化微信支付服务
|
||||||
func NewWechatPayService(c config.Config) *WechatPayService {
|
func NewWechatPayService(c config.Config, userAuthModel model.UserAuthModel) *WechatPayService {
|
||||||
// 从配置中加载商户信息
|
// 从配置中加载商户信息
|
||||||
mchID := c.Wxpay.MchID
|
mchID := c.Wxpay.MchID
|
||||||
mchCertificateSerialNumber := c.Wxpay.MchCertificateSerialNumber
|
mchCertificateSerialNumber := c.Wxpay.MchCertificateSerialNumber
|
||||||
mchAPIv3Key := c.Wxpay.MchApiv3Key
|
mchAPIv3Key := c.Wxpay.MchApiv3Key
|
||||||
|
mchPublicKeyID := c.Wxpay.MchPublicKeyID
|
||||||
// 从文件中加载商户私钥
|
// 从文件中加载商户私钥
|
||||||
mchPrivateKey, err := utils.LoadPrivateKeyWithPath(c.Wxpay.MchPrivateKeyPath)
|
mchPrivateKey, err := utils.LoadPrivateKeyWithPath(c.Wxpay.MchPrivateKeyPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logx.Errorf("加载商户私钥失败: %v", err)
|
logx.Errorf("加载商户私钥失败: %v", err)
|
||||||
panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) // 记录错误并停止程序
|
panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) // 记录错误并停止程序
|
||||||
}
|
}
|
||||||
|
// 从文件中加载公钥
|
||||||
|
mchPublicKey, err := utils.LoadPublicKeyWithPath(c.Wxpay.MchPublicKeyPath)
|
||||||
|
if err != nil {
|
||||||
|
logx.Errorf("加载商户私钥失败: %v", err)
|
||||||
|
panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) // 记录错误并停止程序
|
||||||
|
}
|
||||||
// 使用商户私钥和其他参数初始化微信支付客户端
|
// 使用商户私钥和其他参数初始化微信支付客户端
|
||||||
opts := []core.ClientOption{
|
opts := []core.ClientOption{
|
||||||
option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
|
option.WithWechatPayPublicKeyAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchPublicKeyID, mchPublicKey),
|
||||||
}
|
}
|
||||||
client, err := core.NewClient(context.Background(), opts...)
|
client, err := core.NewClient(context.Background(), opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -71,6 +79,7 @@ func NewWechatPayService(c config.Config) *WechatPayService {
|
|||||||
config: c.Wxpay,
|
config: c.Wxpay,
|
||||||
wechatClient: client,
|
wechatClient: client,
|
||||||
notifyHandler: notifyHandler,
|
notifyHandler: notifyHandler,
|
||||||
|
userAuthModel: userAuthModel,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,7 +113,7 @@ func (w *WechatPayService) CreateWechatAppOrder(ctx context.Context, amount floa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CreateWechatMiniProgramOrder 创建微信小程序支付订单
|
// CreateWechatMiniProgramOrder 创建微信小程序支付订单
|
||||||
func (w *WechatPayService) CreateWechatMiniProgramOrder(ctx context.Context, amount float64, description string, outTradeNo string, openid string) (string, error) {
|
func (w *WechatPayService) CreateWechatMiniProgramOrder(ctx context.Context, amount float64, description string, outTradeNo string, openid string) (interface{}, error) {
|
||||||
totalAmount := lzUtils.ToWechatAmount(amount)
|
totalAmount := lzUtils.ToWechatAmount(amount)
|
||||||
|
|
||||||
// 构建支付请求参数
|
// 构建支付请求参数
|
||||||
@ -131,24 +140,41 @@ func (w *WechatPayService) CreateWechatMiniProgramOrder(ctx context.Context, amo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 返回预支付交易会话标识
|
// 返回预支付交易会话标识
|
||||||
return *resp.PrepayId, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateWechatOrder 创建微信支付订单(集成 APP、H5、小程序)
|
// CreateWechatOrder 创建微信支付订单(集成 APP、H5、小程序)
|
||||||
func (w *WechatPayService) CreateWechatOrder(ctx context.Context, amount float64, description string, outTradeNo string) (string, error) {
|
func (w *WechatPayService) CreateWechatOrder(ctx context.Context, amount float64, description string, outTradeNo string) (interface{}, error) {
|
||||||
// 根据 ctx 中的 platform 判断平台
|
// 根据 ctx 中的 platform 判断平台
|
||||||
platform := ctx.Value("platform").(string)
|
platform := ctx.Value("platform").(string)
|
||||||
|
|
||||||
var prepayId string
|
var prepayData interface{}
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
switch platform {
|
switch platform {
|
||||||
case "mp-weixin":
|
case "mp-weixin":
|
||||||
// 如果是小程序平台,调用小程序支付订单创建
|
userID, getUidErr := ctxdata.GetUidFromCtx(ctx)
|
||||||
prepayId, err = w.CreateWechatMiniProgramOrder(ctx, amount, description, outTradeNo, "asdasd")
|
if getUidErr != nil {
|
||||||
|
return "", getUidErr
|
||||||
|
}
|
||||||
|
userAuthModel, findAuthModelErr := w.userAuthModel.FindOneByUserIdAuthType(ctx, userID, model.UserAuthTypeWxMini)
|
||||||
|
if findAuthModelErr != nil {
|
||||||
|
return "", findAuthModelErr
|
||||||
|
}
|
||||||
|
prepayData, err = w.CreateWechatMiniProgramOrder(ctx, amount, description, outTradeNo, userAuthModel.AuthKey)
|
||||||
|
case "h5-weixin":
|
||||||
|
userID, getUidErr := ctxdata.GetUidFromCtx(ctx)
|
||||||
|
if getUidErr != nil {
|
||||||
|
return "", getUidErr
|
||||||
|
}
|
||||||
|
userAuthModel, findAuthModelErr := w.userAuthModel.FindOneByUserIdAuthType(ctx, userID, model.UserAuthTypeWxh5)
|
||||||
|
if findAuthModelErr != nil {
|
||||||
|
return "", findAuthModelErr
|
||||||
|
}
|
||||||
|
prepayData, err = w.CreateWechatMiniProgramOrder(ctx, amount, description, outTradeNo, userAuthModel.AuthKey)
|
||||||
case "app":
|
case "app":
|
||||||
// 如果是 APP 平台,调用 APP 支付订单创建
|
// 如果是 APP 平台,调用 APP 支付订单创建
|
||||||
prepayId, err = w.CreateWechatAppOrder(ctx, amount, description, outTradeNo)
|
prepayData, err = w.CreateWechatAppOrder(ctx, amount, description, outTradeNo)
|
||||||
default:
|
default:
|
||||||
return "", fmt.Errorf("不支持的支付平台: %s", platform)
|
return "", fmt.Errorf("不支持的支付平台: %s", platform)
|
||||||
}
|
}
|
||||||
@ -159,7 +185,7 @@ func (w *WechatPayService) CreateWechatOrder(ctx context.Context, amount float64
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 返回预支付ID
|
// 返回预支付ID
|
||||||
return prepayId, nil
|
return prepayData, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// HandleWechatPayNotification 处理微信支付回调
|
// HandleWechatPayNotification 处理微信支付回调
|
||||||
|
@ -56,12 +56,13 @@ func NewServiceContext(c config.Config) *ServiceContext {
|
|||||||
yushanService := service.NewYushanService(c)
|
yushanService := service.NewYushanService(c)
|
||||||
productFeatureModel := model.NewProductFeatureModel(db, c.CacheRedis)
|
productFeatureModel := model.NewProductFeatureModel(db, c.CacheRedis)
|
||||||
featureModel := model.NewFeatureModel(db, c.CacheRedis)
|
featureModel := model.NewFeatureModel(db, c.CacheRedis)
|
||||||
|
userAuthModel := model.NewUserAuthModel(db, c.CacheRedis)
|
||||||
return &ServiceContext{
|
return &ServiceContext{
|
||||||
Config: c,
|
Config: c,
|
||||||
Redis: redis.MustNewRedis(redisConf),
|
Redis: redis.MustNewRedis(redisConf),
|
||||||
SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle,
|
SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle,
|
||||||
AlipayService: service.NewAliPayService(c),
|
AlipayService: service.NewAliPayService(c),
|
||||||
WechatPayService: service.NewWechatPayService(c),
|
WechatPayService: service.NewWechatPayService(c, userAuthModel),
|
||||||
ApplePayService: service.NewApplePayService(c),
|
ApplePayService: service.NewApplePayService(c),
|
||||||
WestDexService: westDexService,
|
WestDexService: westDexService,
|
||||||
YushanService: yushanService,
|
YushanService: yushanService,
|
||||||
@ -70,7 +71,7 @@ func NewServiceContext(c config.Config) *ServiceContext {
|
|||||||
ApiRequestService: service.NewApiRequestService(c, westDexService, yushanService, featureModel, productFeatureModel),
|
ApiRequestService: service.NewApiRequestService(c, westDexService, yushanService, featureModel, productFeatureModel),
|
||||||
AsynqService: service.NewAsynqService(c),
|
AsynqService: service.NewAsynqService(c),
|
||||||
UserModel: model.NewUserModel(db, c.CacheRedis),
|
UserModel: model.NewUserModel(db, c.CacheRedis),
|
||||||
UserAuthModel: model.NewUserAuthModel(db, c.CacheRedis),
|
UserAuthModel: userAuthModel,
|
||||||
ProductModel: model.NewProductModel(db, c.CacheRedis),
|
ProductModel: model.NewProductModel(db, c.CacheRedis),
|
||||||
OrderModel: model.NewOrderModel(db, c.CacheRedis),
|
OrderModel: model.NewOrderModel(db, c.CacheRedis),
|
||||||
QueryModel: model.NewQueryModel(db, c.CacheRedis),
|
QueryModel: model.NewQueryModel(db, c.CacheRedis),
|
||||||
|
@ -63,7 +63,8 @@ type PaymentReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PaymentResp struct {
|
type PaymentResp struct {
|
||||||
PrepayID string `json:"prepay_id"`
|
PrepayData interface{} `json:"prepay_data"`
|
||||||
|
PrepayId string `json:"prepay_id"`
|
||||||
OrderID int64 `json:"order_id"`
|
OrderID int64 `json:"order_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user