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
|
|||
|
|
}
|