fix version 1
This commit is contained in:
@@ -3,11 +3,19 @@ package wechat
|
||||
import (
|
||||
"context"
|
||||
|
||||
"bsm/full/module/finance/wallet/internal/excode"
|
||||
pb "bsm/full/module/finance/wallet/pb"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
"git.apinb.com/bsm-sdk/core/service"
|
||||
)
|
||||
|
||||
// 微信JSAPI下单
|
||||
func JsapiPreOrder(ctx context.Context, in *pb.WxpayJSAPIPreOrderRequest) (reply *pb.WxpayJSAPIPreOrderReply, err error) {
|
||||
// 下单前必须先通过身份认证
|
||||
if _, ok := service.ParseMetaCtx(ctx, nil); ok != nil {
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
if err := CheckParam(in.Amount, in.AuthCode, in.UserIdentification, in.OrderNo); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -19,10 +27,15 @@ func JsapiPreOrder(ctx context.Context, in *pb.WxpayJSAPIPreOrderRequest) (reply
|
||||
openid = in.UserIdentification // 用户微信唯一标识
|
||||
amount = in.Amount // 订单金额
|
||||
)
|
||||
wx, _ := NewWechat()
|
||||
wx, err := NewWechat()
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return nil, excode.ErrWechatInit
|
||||
}
|
||||
res, err := wx.GetResponse(attach, orderNo, desc, openid, amount)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
printer.Error(err.Error())
|
||||
return nil, excode.ErrWechatGetResp
|
||||
}
|
||||
return &pb.WxpayJSAPIPreOrderReply{PrepayId: res.PrepayId}, nil
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ func struct2map(in any) (map[string]string, error) {
|
||||
}
|
||||
|
||||
func CheckParam(amount int64, auth_code string, identity string, order_no string) (err error) {
|
||||
if amount == 0 {
|
||||
if amount <= 0 {
|
||||
return excode.ErrAmount
|
||||
}
|
||||
if auth_code == "" {
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"encoding/json"
|
||||
|
||||
"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/errcode"
|
||||
"git.apinb.com/bsm-sdk/core/printer"
|
||||
@@ -12,6 +13,8 @@ import (
|
||||
)
|
||||
|
||||
// 微信支付回调
|
||||
// 完成验签与解密后,按商户订单号反查本地支付单、核对金额,
|
||||
// 条件更新为支付成功并在同一事务内入账写流水。
|
||||
func WxCallback(ctx context.Context, in *pb.WxCallBackRequest) (reply *pb.CallBackReply, err error) {
|
||||
var notifyReq = &wechat.V3NotifyReq{}
|
||||
data, err := json.Marshal(in)
|
||||
@@ -23,7 +26,11 @@ func WxCallback(ctx context.Context, in *pb.WxCallBackRequest) (reply *pb.CallBa
|
||||
return nil, errcode.ErrJsonUnmarshal
|
||||
}
|
||||
|
||||
wx, _ := NewWechat()
|
||||
wx, err := NewWechat()
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return &pb.CallBackReply{Code: "FAIL", Message: "支付客户端初始化失败"}, nil
|
||||
}
|
||||
pubKey := wx.Client.WxPublicKeyMap()
|
||||
err = notifyReq.VerifySignByPKMap(pubKey)
|
||||
if err != nil {
|
||||
@@ -33,9 +40,22 @@ func WxCallback(ctx context.Context, in *pb.WxCallBackRequest) (reply *pb.CallBa
|
||||
res, err := notifyReq.DecryptPayCipherText(config.Spec.WeChat.APIV3Key)
|
||||
if err != nil {
|
||||
printer.Error(err.Error())
|
||||
return &pb.CallBackReply{Code: "FAIL", Message: "验签失败"}, err
|
||||
return &pb.CallBackReply{Code: "FAIL", Message: "解密失败"}, err
|
||||
}
|
||||
// Todo: 业务逻辑
|
||||
payResult, _ := json.Marshal(res)
|
||||
return &pb.CallBackReply{Code: "SUCCESS", Message: string(payResult)}, nil
|
||||
|
||||
// 仅处理支付成功通知,其余状态直接应答,避免渠道重复推送
|
||||
if res.TradeState != "SUCCESS" {
|
||||
return &pb.CallBackReply{Code: "SUCCESS", Message: res.TradeState}, nil
|
||||
}
|
||||
if res.Amount == nil {
|
||||
return &pb.CallBackReply{Code: "FAIL", Message: "金额缺失"}, nil
|
||||
}
|
||||
|
||||
// 结算:金额核对 + 条件更新为成功 + 事务内入账写流水(幂等)
|
||||
if err := models.SettlePaymentSuccess(res.OutTradeNo, res.TransactionId, int64(res.Amount.Total)); err != nil {
|
||||
printer.Error(err.Error())
|
||||
return &pb.CallBackReply{Code: "FAIL", Message: "结算失败"}, nil
|
||||
}
|
||||
|
||||
return &pb.CallBackReply{Code: "SUCCESS", Message: "SUCCESS"}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user