Files
full/module/finance/wallet/internal/logic/payment/by_order.go
2026-09-22 21:15:34 +08:00

171 lines
4.2 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 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)
)
if wErr != nil || myWallet == nil || myWallet.Identity == "" {
return nil, errcode.ErrNotFound(404, "wallet")
}
paymentRecrod := models.WalletPayment{
WalletIdentity: myWallet.Identity,
Type: 2, //1充值2为订单
OrderNo: in.OrderNo,
PayChannel: int8(in.PayChannel),
PayType: in.PayType,
Amount: amount,
}
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
productCode string
)
switch in.PayType {
case "WAP":
productCode = "QUICK_WAP_WAY"
case "APP":
productCode = "QUICK_MSECURITY_PAY"
default:
return nil, excode.ErrPayType
}
alipay, err := alipay.NewAlipay()
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrAlipayInit
}
alipay.SetBody(payBodyAttach.String(), in.OrderNo, amount, productCode)
if productCode == "QUICK_MSECURITY_PAY" {
result, err = alipay.TradeAppPay()
} else {
result, err = alipay.TradeWapPay()
}
if err != nil {
printer.Error(err.Error())
return nil, excode.ErrAlipayGetResp
}
replyResult["payUrl"] = result
case 3:
walletSrv, err := basic.NewWallet(auth.Identity, in.Password, amount)
if err != nil {
printer.Error(err.Error())
return nil, err
}
if err = walletSrv.TradeConsum(amount); err != nil {
printer.Error(err.Error())
return nil, err
}
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
}