refactor: reorganize modules and add Linux build tooling

This commit is contained in:
2026-08-09 12:41:08 +08:00
parent 86024fa81d
commit 5cc5fd92ed
1461 changed files with 4054 additions and 4724 deletions

View File

@@ -0,0 +1,138 @@
package payment
import (
"context"
"strings"
"bsm/full/module/finance/wallet/internal/excode"
"bsm/full/module/finance/wallet/internal/logic/alipay"
"bsm/full/module/finance/wallet/internal/logic/wechat"
"bsm/full/module/finance/wallet/internal/models"
pb "bsm/full/module/finance/wallet/pb"
"git.apinb.com/bsm-sdk/core/env"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/utils"
)
// 支付-充值
func ByCharge(ctx context.Context, in *pb.ChargeRequest) (reply *pb.PaymentReply, err error) {
auth, ok := service.ParseMetaCtx(ctx, nil)
if ok != nil {
return nil, ok
}
if in.Amount == 0 || in.Desc == "" {
return nil, errcode.ErrInvalidArgument
}
var (
myWallet, wErr = models.GetWalletByPassportIdentity(auth.ID, auth.Identity)
orderNo = utils.RandomString(32)
paymentRecrod = models.WalletPayment{
WalletIdentity: myWallet.Identity,
Type: 1, //1充值2为订单
OrderNo: orderNo,
PayChannel: int8(in.PayChannel),
PayType: in.PayType,
Amount: in.Amount,
}
)
if wErr != nil || myWallet.Identity == "" {
return nil, errcode.ErrNotFound(404, "wallet")
}
paymentRecrod.Identity = utils.UUID()
paymentRecrod.PassportID = auth.ID
paymentRecrod.PassportIdentity = auth.Identity
var payBodyAttach strings.Builder
payBodyAttach.WriteString(env.Runtime.Workspace)
payBodyAttach.WriteString(",")
payBodyAttach.WriteString(paymentRecrod.Identity)
replyResult := map[string]string{}
switch in.PayChannel {
case 1:
if in.OpenId == "" {
return nil, errcode.ErrInvalidArgument
}
wechat, err := wechat.NewWechat()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatInit
}
res, err := wechat.GetResponse(payBodyAttach.String(), orderNo, in.Desc, in.OpenId, in.Amount)
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
switch in.PayType {
case "JSAPI":
replyResult, err = wechat.JsapiPaySign(res.PrepayId)
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
case "APP":
replyResult, err = wechat.AppPaySign(res.PrepayId)
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
case "MINI":
replyResult, err = wechat.MiniPaySign(res.PrepayId)
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
default:
return nil, excode.ErrPayType
}
case 2:
var result string
alipay, err := alipay.NewAlipay()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrAlipayInit
}
alipay.SetBody(payBodyAttach.String(), orderNo, in.Amount)
switch in.PayType {
case "WAP":
result, err = alipay.TradeWapPay()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrAlipayGetResp
}
case "APP":
result, err = alipay.TradeAppPay()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrAlipayGetResp
}
default:
return nil, excode.ErrPayType
}
replyResult["payUrl"] = result
default:
return nil, excode.ErrPayChannel
}
//写入支付记录表(不可忽略错误)
if err := models.CreatePaymentRecord(&paymentRecrod); err != nil {
printer.Error("CreatePaymentRecord failed: ", err.Error())
return nil, errcode.ErrDB
}
return &pb.PaymentReply{
Code: 200,
Result: replyResult,
}, nil
}

View File

@@ -0,0 +1,162 @@
package payment
import (
"context"
"strings"
"bsm/full/module/finance/wallet/internal/excode"
"bsm/full/module/finance/wallet/internal/logic/alipay"
"bsm/full/module/finance/wallet/internal/logic/basic"
"bsm/full/module/finance/wallet/internal/logic/wechat"
"bsm/full/module/finance/wallet/internal/models"
pb "bsm/full/module/finance/wallet/pb"
"git.apinb.com/bsm-sdk/core/env"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/utils"
)
// 支付-电商订单
func ByOrder(ctx context.Context, in *pb.OrderRequest) (reply *pb.PaymentReply, err error) {
auth, ok := service.ParseMetaCtx(ctx, nil)
if ok != nil {
return nil, ok
}
if in.OrderNo == "" || in.Desc == "" {
return nil, errcode.ErrInvalidArgument
}
amount, err := models.GetTransPriceByOrderNo(in.OrderNo)
if err != nil {
return nil, errcode.ErrNotFound(404, "order")
}
var (
myWallet, wErr = models.GetWalletByPassportIdentity(auth.ID, auth.Identity)
paymentRecrod = models.WalletPayment{
WalletIdentity: myWallet.Identity,
Type: 2, //1充值2为订单
OrderNo: in.OrderNo,
PayChannel: int8(in.PayChannel),
PayType: in.PayType,
Amount: amount,
}
)
if wErr != nil || myWallet.Identity == "" {
return nil, errcode.ErrNotFound(404, "wallet")
}
paymentRecrod.Identity = utils.UUID()
paymentRecrod.PassportID = auth.ID
paymentRecrod.PassportIdentity = auth.Identity
var payBodyAttach strings.Builder
payBodyAttach.WriteString(env.Runtime.Workspace)
payBodyAttach.WriteString(",")
payBodyAttach.WriteString(paymentRecrod.Identity)
replyResult := make(map[string]string)
switch in.PayChannel {
case 1:
wechat, err := wechat.NewWechat()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatInit
}
res, err := wechat.GetResponse(payBodyAttach.String(), in.OrderNo, in.Desc, in.OpenId, amount)
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
switch in.PayType {
case "JSAPI":
replyResult, err = wechat.JsapiPaySign(res.PrepayId)
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
case "APP":
replyResult, err = wechat.AppPaySign(res.PrepayId)
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
case "MINI":
replyResult, err = wechat.MiniPaySign(res.PrepayId)
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
case "NATIVE":
replyResult, err = wechat.NativePaySign(payBodyAttach.String(), in.OrderNo, in.Desc, "", in.OpenId, amount)
if err == nil {
if v, ok := replyResult["code_url"]; ok {
replyResult["qr_code"] = v
}
} else {
printer.Error(err.Error())
return nil, excode.ErrWechatGetResp
}
default:
return nil, excode.ErrPayType
}
replyResult["prepay_id"] = res.PrepayId
case 2:
var result string
alipay, err := alipay.NewAlipay()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrAlipayInit
}
alipay.SetBody(payBodyAttach.String(), in.OrderNo, amount)
switch in.PayType {
case "WAP":
result, err = alipay.TradeWapPay()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrAlipayGetResp
}
case "APP":
result, err = alipay.TradeAppPay()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrAlipayGetResp
}
default:
return nil, excode.ErrPayType
}
replyResult["payUrl"] = result
case 3:
walletSrv, err := basic.NewWallet(auth.Identity, in.Password, amount)
if err != nil {
return nil, errcode.ErrDB
}
err = walletSrv.TradeConsum(amount)
if err != nil {
return nil, excode.ErrBalanceNotEnough
}
default:
return nil, excode.ErrPayChannel
}
// 写入支付记录表(不可忽略错误)
if err := models.CreatePaymentRecord(&paymentRecrod); err != nil {
printer.Error("CreatePaymentRecord failed: ", err.Error())
return nil, errcode.ErrDB
}
//return
return &pb.PaymentReply{
Code: 200,
Result: replyResult,
}, nil
}

View File

@@ -0,0 +1,40 @@
package payment
import (
"context"
"time"
"bsm/full/module/finance/wallet/internal/models"
pb "bsm/full/module/finance/wallet/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/vars"
)
// 回调更新支付的结果和状态
func Callback(ctx context.Context, in *pb.CallbackRequest) (reply *pb.StatusReply, err error) {
auth, ok := service.ParseMetaCtx(ctx, nil)
if ok != nil {
return nil, ok
}
if in.Identity == "" {
return nil, errcode.ErrInvalidArgument
}
var status int8 = 0
if in.CallbackStatus {
status = 2
} else {
status = -1
}
err = models.UpsetWalletPaymentByIdentity(auth.Identity, in.Identity, status, in.CallbackMsg)
if err != nil {
return nil, err
}
return &pb.StatusReply{
Message: vars.OK,
Timeseq: time.Now().UnixMilli(),
}, nil
}

View File

@@ -0,0 +1,37 @@
package payment
import (
"context"
"bsm/full/module/finance/wallet/internal/models"
pb "bsm/full/module/finance/wallet/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/service"
)
// 获取支付的详情
func Get(ctx context.Context, in *pb.IdentRequest) (reply *pb.PaymentItem, err error) {
auth, ok := service.ParseMetaCtx(ctx, nil)
if ok != nil {
return nil, ok
}
if in.Identity == "" {
return nil, errcode.ErrInvalidArgument
}
paymentRecord, err := models.GetWalletPaymentByIdentity(auth.Identity, in.Identity)
if err != nil {
return nil, errcode.ErrNotFound(404, "payment")
}
return &pb.PaymentItem{
OrderNo: paymentRecord.OrderNo,
TradeNo: paymentRecord.TradeNo,
Type: int32(paymentRecord.Type),
PayChannel: int32(paymentRecord.PayChannel),
PayType: paymentRecord.PayType,
Amount: paymentRecord.Amount,
Args: paymentRecord.Args,
Status: int32(paymentRecord.Status),
}, nil
}

View File

@@ -0,0 +1,27 @@
// Package payment 支付相关业务逻辑
package payment
import (
"context"
pb "bsm/full/module/finance/wallet/pb"
"git.apinb.com/bsm-sdk/core/service"
)
// Hello 支付服务健康检查接口
// 用于验证支付服务是否正常运行
func Hello(ctx context.Context, in *pb.Empty) (reply *pb.PaymentReply, err error) {
// 解析授权元数据
_, err = service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
// 返回服务状态信息
return &pb.PaymentReply{
Result: map[string]string{
"message": "Payment service is running",
"status": "healthy",
},
}, nil
}

View File

@@ -0,0 +1,48 @@
package payment
import (
"context"
"fmt"
"bsm/full/module/finance/wallet/internal/config"
"bsm/full/module/finance/wallet/internal/models"
pb "bsm/full/module/finance/wallet/pb"
"git.apinb.com/bsm-sdk/core/service"
)
// 获取平台支持的支付网关
func Way(ctx context.Context, in *pb.WayRequest) (reply *pb.WayReply, err error) {
auth, ok := service.ParseMetaCtx(ctx, nil)
if ok != nil {
return nil, ok
}
items := make([]*pb.WayItem, 0)
if config.Spec.Wallet.AlipyIsOpen {
items = append(items, &pb.WayItem{
Ident: "ALIPAY",
Title: "支付宝",
})
}
if config.Spec.Wallet.WechatpayIsOpen {
items = append(items, &pb.WayItem{
Ident: "WECHATPAY",
Title: "微信支付",
})
}
if config.Spec.Wallet.WalletIsOpen {
balance := fmt.Sprintf("%.2f", models.GetWalletBalanceByPassportIdentity(auth.Identity))
items = append(items, &pb.WayItem{
Ident: "WALLET",
Title: "钱包余额",
Intro: "余额:" + balance + " 元",
})
}
return &pb.WayReply{
Way: items,
}, nil
}