diff --git a/app/console/command.go b/app/console/command.go index fb8e8de..0573b93 100644 --- a/app/console/command.go +++ b/app/console/command.go @@ -4,6 +4,7 @@ import ( "PaymentCenter/app/constants/common" "PaymentCenter/app/data" "PaymentCenter/app/http/entities" + "PaymentCenter/app/http/entities/backend" "PaymentCenter/app/models/ordersmodel" "PaymentCenter/app/models/orderthirdpaylogmodel" "PaymentCenter/app/third/paymentService" @@ -28,20 +29,59 @@ func RegisterCommand(c *command.Command) { func closeOrder() { var now = time.Now().Format(time.DateTime) utils.Log(nil, "关闭订单", now) + var ctx = context.Background() + orderIds := make([]int64, 0) // 查询未支付的订单 repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb()) // 拼接条件 cond := builder.NewCond() - cond = cond.And(builder.Eq{"status": common.ORDER_STATUS_PAYING}, builder.Lt{"create_time": time.Now().Add(-time.Second * time.Duration(config.GetConf().CronConfig.CloseOrderTime))}) - - order := make([]ordersmodel.Orders, 0) - total, err := repo.OrderList(cond, entities.PageRequest{}, &order) + cond = cond.And(builder.Eq{"status": common.ORDER_STATUS_PAYING}, builder.Lt{"orders.create_time": time.Now().Add(-time.Second * time.Duration(config.GetConf().CronConfig.CloseOrderTime))}) + // 查询订单 + order := make([]ordersmodel.OrdersLeftPayChannelList, 0) + err := repo.OrdersLeftPayChannelList(cond, entities.PageRequest{}, &order) if err != nil { utils.Log(nil, "关闭订单,查询未支付订单失败", err) - } else if total > 0 { - orderIds := make([]int64, 0) - for _, v := range order { - orderIds = append(orderIds, v.Id) + } else if len(order) > 0 { + for i := range order { + orderInfo := order[i] + // 往上游发送关闭订单请求 + req := paymentService.OrderCloseRequest{OrderId: orderInfo.Id} + + switch utils.PayType(orderInfo.ChannelType) { + case common.PAY_CHANNLE_TYPE_WECHAT: + wx := backend.WechatPayChannel{} + _ = json.Unmarshal([]byte(orderInfo.ExtJson), &wx) + req.PayChannel = payCommon.PAY_CHANNLE_TYPE_WECHAT + req.Wx = paymentService.WxPay{ + AppId: orderInfo.AppId, + MchId: wx.MchId, + SerialNo: wx.SerialNo, + ApiV3Key: wx.ApiV3Key, + PrivateKey: wx.PrivateKey, + } + case common.PAY_CHANNLE_TYPE_ZFB: + ali := backend.AliPayChannel{} + req.PayChannel = payCommon.PAY_CHANNLE_TYPE_ZFB + _ = json.Unmarshal([]byte(orderInfo.ExtJson), &ali) + req.Ali = paymentService.AliPay{ + AppId: orderInfo.AppId, + PrivateKey: ali.PrivateKey, + AppPublicCert: []byte(ali.AppPublicCert), + AlipayRootCert: []byte(ali.AlipayRootCert), + AlipayPublicCert: []byte(ali.AlipayPublicCert), + } + default: + utils.Log(nil, "关闭订单,支付渠道不支持", orderInfo.ChannelType) + continue + } + // 发起关闭订单请求 + response := paymentService.OrderClose(ctx, req) + // 成功 + if response.Code == payCommon.PAY_SUCCESS_CODE { + orderIds = append(orderIds, orderInfo.Id) + } else { + utils.Log(nil, "关闭订单,上游支付失败", response) + } } // 修改订单状态为关闭 cond = builder.NewCond() @@ -52,7 +92,7 @@ func closeOrder() { return } } - utils.Log(nil, "关闭订单,修改订单状态成功", "count="+strconv.Itoa(len(order))) + utils.Log(nil, "关闭订单,修改订单状态成功", "总数量="+strconv.Itoa(len(order)), "成功数量="+strconv.Itoa(len(orderIds))) } // 主动查询订单支付状态 @@ -64,7 +104,6 @@ func queryOrder() { repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb()) // 拼接条件 cond := builder.NewCond() - config.GetConf() cond = cond.And(builder.Eq{"status": common.ORDER_STATUS_PAYING}, builder.Gt{"orders.create_time": time.Now().Add(-time.Second * time.Duration(config.GetConf().CronConfig.QueryOrderTime))}) order := make([]ordersmodel.OrdersLeftPayChannelList, 0) err := repo.OrdersLeftPayChannelList(cond, entities.PageRequest{}, &order) @@ -90,13 +129,32 @@ func queryOrder() { query := paymentService.PayOrderQueryRequest{ OrderId: orderInfo.Id, } - switch orderInfo.ChannelType { - case common.PAY_CHANNEL_WECHAT_H5, common.PAY_CHANNEL_WECHAT_JSAPI, common.PAY_CHANNEL_WECHAT_NATIVE, common.PAY_CHANNEL_WECHAT_APP, common.PAY_CHANNEL_WECHAT_MINI: - _ = json.Unmarshal([]byte(orderInfo.ExtJson), &query.Wx) + switch utils.PayType(orderInfo.ChannelType) { + case common.PAY_CHANNLE_TYPE_WECHAT: + wx := backend.WechatPayChannel{} + _ = json.Unmarshal([]byte(orderInfo.ExtJson), &wx) query.PayChannel = payCommon.PAY_CHANNLE_TYPE_WECHAT - case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI: + query.Wx = paymentService.WxPay{ + AppId: orderInfo.AppId, + MchId: wx.MchId, + SerialNo: wx.SerialNo, + ApiV3Key: wx.ApiV3Key, + PrivateKey: wx.PrivateKey, + } + case common.PAY_CHANNLE_TYPE_ZFB: + ali := backend.AliPayChannel{} query.PayChannel = payCommon.PAY_CHANNLE_TYPE_ZFB - _ = json.Unmarshal([]byte(orderInfo.ExtJson), &query.Ali) + _ = json.Unmarshal([]byte(orderInfo.ExtJson), &ali) + query.Ali = paymentService.AliPay{ + AppId: orderInfo.AppId, + PrivateKey: ali.PrivateKey, + AppPublicCert: []byte(ali.AppPublicCert), + AlipayRootCert: []byte(ali.AlipayRootCert), + AlipayPublicCert: []byte(ali.AlipayPublicCert), + } + default: + utils.Log(nil, "查询订单,支付渠道不支持", orderInfo.ChannelType) + return } // 发起查询 @@ -152,9 +210,10 @@ func queryOrder() { } // 写入日志 + body, _ := json.Marshal(result) log := orderthirdpaylogmodel.OrderThirdPayLog{ OrderId: orderInfo.Id, - PayCallback: "", + PayCallback: string(body), Status: 0, MerchantParam: "", MerchantCallback: "", diff --git a/app/constants/common/common.go b/app/constants/common/common.go index 6439c26..cfe21f3 100644 --- a/app/constants/common/common.go +++ b/app/constants/common/common.go @@ -28,4 +28,7 @@ const ( ORDER_STATUS_PAYED = 3 ORDER_STATUS_FAILED = 4 ORDER_STATUS_CLOSE = 5 + + PAY_CHANNLE_TYPE_WECHAT = 1 // 支付类型: 微信 + PAY_CHANNLE_TYPE_ZFB = 2 // 支付类型:支付宝 ) diff --git a/app/data/orders.go b/app/data/orders.go index 8edec45..ff7fd6c 100644 --- a/app/data/orders.go +++ b/app/data/orders.go @@ -47,7 +47,7 @@ func (m *OrderRepo) OrdersBackendList(conn builder.Cond, pageFilter entities.Pag repo = repo.Join("left", "app", "app.id = orders.app_id"). Join("left", "merchant", "merchant.id = orders.merchant_id"). Join("left", "pay_channel", "pay_channel.id = orders.pay_channel_id") - return repo.Desc("create_time").FindAndCount(orderList) + return repo.Desc("orders.create_time").FindAndCount(orderList) } func (m *OrderRepo) OrdersLeftPayChannelList(conn builder.Cond, pageFilter entities.PageRequest, orderList *[]ordersmodel.OrdersLeftPayChannelList) error { @@ -56,6 +56,6 @@ func (m *OrderRepo) OrdersLeftPayChannelList(conn builder.Cond, pageFilter entit if pageFilter.Page > 0 { repo = repo.Limit(pageFilter.PageSize, pageFilter.PageSize*(pageFilter.Page-1)) } - repo = repo.Join("left", "pay_channel", "pay_channel.id = orders.pay_id") + repo = repo.Join("left", "pay_channel", "pay_channel.id = orders.pay_channel_id") return repo.Find(orderList) } diff --git a/app/utils/util.go b/app/utils/util.go index 9427626..c5e9473 100644 --- a/app/utils/util.go +++ b/app/utils/util.go @@ -450,3 +450,15 @@ func SliceInStr(s string, slice []string) bool { } return false } + +// 判断支付方式支付宝或者微信 +func PayType(payChannel int) int { + switch payChannel { + case common.PAY_CHANNEL_WECHAT_H5, common.PAY_CHANNEL_WECHAT_JSAPI, common.PAY_CHANNEL_WECHAT_NATIVE, common.PAY_CHANNEL_WECHAT_APP, common.PAY_CHANNEL_WECHAT_MINI: + return common.PAY_CHANNLE_TYPE_WECHAT + case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI: + return common.PAY_CHANNLE_TYPE_ZFB + default: + return 0 + } +}