66 lines
2.2 KiB
Go
66 lines
2.2 KiB
Go
package pay
|
||
|
||
import (
|
||
"context"
|
||
|
||
"qnc-server/app/main/api/internal/svc"
|
||
"qnc-server/app/main/api/internal/types"
|
||
"qnc-server/common/ctxdata"
|
||
|
||
"github.com/zeromicro/go-zero/core/logx"
|
||
)
|
||
|
||
type XpayClientEventLogic struct {
|
||
logx.Logger
|
||
ctx context.Context
|
||
svcCtx *svc.ServiceContext
|
||
}
|
||
|
||
func NewXpayClientEventLogic(ctx context.Context, svcCtx *svc.ServiceContext) *XpayClientEventLogic {
|
||
return &XpayClientEventLogic{
|
||
Logger: logx.WithContext(ctx),
|
||
ctx: ctx,
|
||
svcCtx: svcCtx,
|
||
}
|
||
}
|
||
|
||
// XpayClientEvent 记录小程序虚拟支付各步骤及微信/Apple 客户端提示(非 HTTP 异常)
|
||
func (l *XpayClientEventLogic) XpayClientEvent(req *types.XpayClientEventReq) (*types.XpayClientEventResp, error) {
|
||
userID, _ := ctxdata.GetUidFromCtx(l.ctx)
|
||
|
||
l.Infof("[xpay:client-event] user=%s order_no=%s stage=%s event=%s message=%q err_msg=%q err_code=%d errno=%d sign_data=%s device=%s extra=%s",
|
||
userID, req.OrderNo, req.Stage, req.EventType, req.Message, req.ErrMsg, req.ErrCode, req.Errno,
|
||
req.SignData, req.Device, req.Extra)
|
||
|
||
resp := &types.XpayClientEventResp{}
|
||
|
||
if req.OrderNo == "" || l.svcCtx.XpayService == nil || !l.svcCtx.XpayService.Enabled() {
|
||
return resp, nil
|
||
}
|
||
|
||
// 客户端 fail/tip 时主动 query_order,把微信服务端侧状态一并记入日志
|
||
if req.EventType == "fail" || req.EventType == "tip" {
|
||
openid, err := l.svcCtx.XpayService.GetWxMiniOpenID(l.ctx, l.svcCtx.UserAuthModel, userID)
|
||
if err != nil {
|
||
resp.WxSyncError = "获取 openid 失败: " + err.Error()
|
||
l.Errorf("[xpay:client-event] query_order skip order_no=%s reason=%v", req.OrderNo, err)
|
||
return resp, nil
|
||
}
|
||
|
||
status, qErr := l.svcCtx.XpayService.QueryOrder(l.ctx, openid, req.OrderNo, "")
|
||
if qErr != nil {
|
||
resp.WxSyncError = qErr.Error()
|
||
l.Errorf("[xpay:client-event] query_order FAIL order_no=%s client_msg=%q wx_err=%v",
|
||
req.OrderNo, req.Message, qErr)
|
||
return resp, nil
|
||
}
|
||
|
||
resp.WxOrderStatus = status.Status
|
||
resp.WxOrderDetail = status.RawOrder
|
||
l.Infof("[xpay:client-event] query_order SNAPSHOT order_no=%s client_msg=%q wx_status=%d wx_order_id=%s paid_fee=%d err_msg=%s raw=%s",
|
||
req.OrderNo, req.Message, status.Status, status.WxOrderID, status.PaidFee, status.ErrMsg, status.RawOrder)
|
||
}
|
||
|
||
return resp, nil
|
||
}
|