Merge branch 'refs/heads/feature/zxp' into dev/dev1.0
This commit is contained in:
commit
3061987dae
|
@ -6,14 +6,13 @@ import (
|
||||||
"PaymentCenter/app/http/entities"
|
"PaymentCenter/app/http/entities"
|
||||||
"PaymentCenter/app/http/entities/backend"
|
"PaymentCenter/app/http/entities/backend"
|
||||||
"PaymentCenter/app/models/ordersmodel"
|
"PaymentCenter/app/models/ordersmodel"
|
||||||
"PaymentCenter/app/models/orderthirdpaylogmodel"
|
"PaymentCenter/app/services/thirdpay/notify"
|
||||||
"PaymentCenter/app/third/paymentService"
|
"PaymentCenter/app/third/paymentService"
|
||||||
"PaymentCenter/app/third/paymentService/payCommon"
|
"PaymentCenter/app/third/paymentService/payCommon"
|
||||||
"PaymentCenter/app/utils"
|
"PaymentCenter/app/utils"
|
||||||
"PaymentCenter/config"
|
"PaymentCenter/config"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"github.com/qit-team/snow-core/command"
|
"github.com/qit-team/snow-core/command"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -83,7 +82,7 @@ func closeOrder() {
|
||||||
if response.Code == payCommon.PAY_SUCCESS_CODE {
|
if response.Code == payCommon.PAY_SUCCESS_CODE {
|
||||||
orderIds = append(orderIds, orderInfo.Id)
|
orderIds = append(orderIds, orderInfo.Id)
|
||||||
} else {
|
} else {
|
||||||
utils.Log(nil, "关闭订单,上游支付失败", response)
|
utils.Log(nil, "关闭订单,上游失败", response)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 修改订单状态为关闭
|
// 修改订单状态为关闭
|
||||||
|
@ -172,64 +171,115 @@ func queryOrder() {
|
||||||
// 成功
|
// 成功
|
||||||
status = common.ORDER_STATUS_PAYED
|
status = common.ORDER_STATUS_PAYED
|
||||||
case "REFUND":
|
case "REFUND":
|
||||||
// 退款
|
// 退款 订单支付完成才能退款,所以支付单的状态是支付完成
|
||||||
status = common.ORDER_STATUS_REFUND
|
status = common.ORDER_STATUS_PAYED
|
||||||
|
|
||||||
case "NOTPAY":
|
case "NOTPAY":
|
||||||
// 未支付
|
// 未支付
|
||||||
return
|
return
|
||||||
case "CLOSED":
|
case "CLOSED":
|
||||||
// 关闭
|
// 关闭
|
||||||
status = common.ORDER_STATUS_CLOSE
|
status = common.ORDER_STATUS_CLOSE
|
||||||
|
|
||||||
}
|
}
|
||||||
// 回调通知下游 todo
|
// 回调通知下游 todo
|
||||||
|
notifyResult := notify.NewOrderNotifyWithHandle(orderInfo.Id, status, int(result.Result.PayerTotal), "")
|
||||||
|
utils.Log(nil, "主动查询订单支付状态,回调下游", notifyResult)
|
||||||
|
}
|
||||||
|
}(orderInfo)
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 更新订单状态 todo
|
// 主动查询退款订单状态
|
||||||
orderUpdate := ordersmodel.Orders{
|
func queryRefundOrder() {
|
||||||
Id: orderInfo.Id,
|
var now = time.Now().Format(time.DateTime)
|
||||||
Status: status,
|
utils.Log(nil, "主动查询退款订单状态", now)
|
||||||
PayerTotal: int(result.Result.PayerTotal),
|
ctx := context.Background()
|
||||||
|
// 查询退款中的订单
|
||||||
|
repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
|
||||||
|
// 拼接条件
|
||||||
|
cond := builder.NewCond()
|
||||||
|
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))})
|
||||||
|
cond = cond.And(builder.Eq{"order_type": common.ORDER_TYPE_REFUND})
|
||||||
|
order := make([]ordersmodel.OrdersLeftPayChannelList, 0)
|
||||||
|
err := repo.OrdersLeftPayChannelList(cond, entities.PageRequest{}, &order)
|
||||||
|
if err != nil {
|
||||||
|
utils.Log(nil, "主动查询退款订单状态,查询退款中订单失败", err)
|
||||||
|
return
|
||||||
|
} else if len(order) > 0 {
|
||||||
|
ch := make(chan struct{}, config.GetConf().CronConfig.ConcurrentNumber)
|
||||||
|
wg := sync.WaitGroup{}
|
||||||
|
|
||||||
|
for index := range order {
|
||||||
|
ch <- struct{}{}
|
||||||
|
wg.Add(1)
|
||||||
|
orderInfo := order[index]
|
||||||
|
|
||||||
|
// 发起查询上游
|
||||||
|
go func(orderInfo ordersmodel.OrdersLeftPayChannelList) {
|
||||||
|
defer func() {
|
||||||
|
<-ch
|
||||||
|
wg.Done()
|
||||||
|
}()
|
||||||
|
|
||||||
|
query := paymentService.OrderRefundQueryRequest{
|
||||||
|
RefundOrderId: orderInfo.Id,
|
||||||
|
OrderId: orderInfo.RefundOrderId,
|
||||||
|
}
|
||||||
|
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
|
||||||
|
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), &ali)
|
||||||
|
query.Ali = paymentService.AliPay{
|
||||||
|
AppId: orderInfo.AppId,
|
||||||
|
PrivateKey: ali.PrivateKey,
|
||||||
|
AppPublicCert: ali.AppPublicCert,
|
||||||
|
AlipayRootCert: ali.AlipayRootCert,
|
||||||
|
AlipayPublicCert: ali.AlipayPublicCert,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
utils.Log(nil, "查询订单,支付渠道不支持", orderInfo.ChannelType)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
session := ordersmodel.GetInstance().GetDb().NewSession()
|
// 发起查询
|
||||||
if err = session.Begin(); err != nil {
|
result := paymentService.OrderRefundQuery(ctx, query)
|
||||||
utils.Log(nil, "主动查询订单支付状态,更新订单状态失败", err)
|
utils.Log(nil, "主动查询退款订单状态,上游返回数据", result)
|
||||||
|
// 查询成功,校验状态
|
||||||
|
var status int
|
||||||
|
if result.Code == payCommon.PAY_SUCCESS_CODE {
|
||||||
|
// 退款状态 0:未申请,1:退款中,2:退款成功,3:退款失败
|
||||||
|
switch result.Result.RefundStatus {
|
||||||
|
case 0:
|
||||||
|
// 未申请
|
||||||
|
utils.Log(nil, "主动查询退款订单状态,未申请", status)
|
||||||
return
|
return
|
||||||
}
|
case 1:
|
||||||
defer func() {
|
// 退款中
|
||||||
if err != nil {
|
status = common.ORDER_STATUS_PAYING
|
||||||
session.Rollback()
|
|
||||||
} else {
|
|
||||||
err = session.Commit()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
orderLogRepo := data.NewOrderThirdPayLogRepo(session)
|
|
||||||
orderRepo := data.NewOrderRepo(session)
|
|
||||||
|
|
||||||
conn := builder.NewCond()
|
|
||||||
conn = conn.And(builder.Eq{"id": orderInfo.Id})
|
|
||||||
_, err = orderRepo.OrderUpdate(&orderUpdate, conn)
|
|
||||||
if err != nil {
|
|
||||||
utils.Log(nil, "主动查询订单支付状态,更新订单状态失败", err)
|
|
||||||
return
|
return
|
||||||
|
case 2:
|
||||||
|
// 退款成功
|
||||||
|
status = common.ORDER_STATUS_PAYED
|
||||||
|
case 3:
|
||||||
|
// 退款失败
|
||||||
|
status = common.ORDER_STATUS_FAILED
|
||||||
}
|
}
|
||||||
|
// 回调通知下游 todo
|
||||||
// 写入日志
|
notifyResult := notify.NewOrderNotifyWithHandle(orderInfo.Id, status, int(result.Result.RefundFee), "")
|
||||||
body, _ := json.Marshal(result)
|
utils.Log(nil, "主动查询退款订单状态,回调下游", notifyResult)
|
||||||
log := orderthirdpaylogmodel.OrderThirdPayLog{
|
|
||||||
OrderId: orderInfo.Id,
|
|
||||||
PayCallback: string(body),
|
|
||||||
Status: 0,
|
|
||||||
PayParam: fmt.Sprintf(`{"pay_channel_id":%d}`, orderInfo.PayChannelId),
|
|
||||||
Type: common.THIRD_ORDER_TYPE_ORDER_QUERY,
|
|
||||||
MerchantCallback: "{}",
|
|
||||||
}
|
|
||||||
_, err = orderLogRepo.OrderThirdPayLogInsertOne(&log)
|
|
||||||
if err != nil {
|
|
||||||
utils.Log(nil, "主动查询订单支付状态,写入支付日志失败", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}(orderInfo)
|
}(orderInfo)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,4 +17,5 @@ func RegisterSchedule(c *cron.Cron) {
|
||||||
//c.AddFunc("@every 10s", test)
|
//c.AddFunc("@every 10s", test)
|
||||||
c.AddFunc("@every 60s", closeOrder)
|
c.AddFunc("@every 60s", closeOrder)
|
||||||
c.AddFunc("@every 10s", queryOrder)
|
c.AddFunc("@every 10s", queryOrder)
|
||||||
|
c.AddFunc("@every 60s", queryRefundOrder)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,13 +22,12 @@ const (
|
||||||
ADMIN_USER_NAME = "User-Name"
|
ADMIN_USER_NAME = "User-Name"
|
||||||
ADMIN_USER_INCLUDEUSERS = "Include-Users"
|
ADMIN_USER_INCLUDEUSERS = "Include-Users"
|
||||||
|
|
||||||
// '订单状态: 1待支付、2支付中、3支付成功、4支付失败、5订单关闭 6支付完成后退款,
|
// '订单状态: 1待支付、2支付中、3支付成功、4支付失败、5订单关闭
|
||||||
ORDER_STATUS_WAITPAY = 1
|
ORDER_STATUS_WAITPAY = 1
|
||||||
ORDER_STATUS_PAYING = 2
|
ORDER_STATUS_PAYING = 2
|
||||||
ORDER_STATUS_PAYED = 3
|
ORDER_STATUS_PAYED = 3
|
||||||
ORDER_STATUS_FAILED = 4
|
ORDER_STATUS_FAILED = 4
|
||||||
ORDER_STATUS_CLOSE = 5
|
ORDER_STATUS_CLOSE = 5
|
||||||
ORDER_STATUS_REFUND = 6
|
|
||||||
|
|
||||||
// 订单类型,1支付,2退款
|
// 订单类型,1支付,2退款
|
||||||
ORDER_TYPE_PAY = 1
|
ORDER_TYPE_PAY = 1
|
||||||
|
|
|
@ -13,20 +13,21 @@ var (
|
||||||
|
|
||||||
// 实体
|
// 实体
|
||||||
type Orders struct {
|
type Orders struct {
|
||||||
Id int64
|
Id int64
|
||||||
MerchantId int64 `xorm:"'merchant_id' bigint(20)"`
|
MerchantId int64 `xorm:"'merchant_id' bigint(20)"`
|
||||||
PayChannelId int64 `xorm:"'pay_channel_id' bigint(20)"`
|
PayChannelId int64 `xorm:"'pay_channel_id' bigint(20)"`
|
||||||
AppId int64 `xorm:"'app_id' bigint(20)"`
|
AppId int64 `xorm:"'app_id' bigint(20)"`
|
||||||
OutTreadNo string `xorm:"'out_tread_no' varchar(50)"`
|
OutTreadNo string `xorm:"'out_tread_no' varchar(50)"`
|
||||||
OrderType int `xorm:"'order_type' TINYINT"`
|
OrderType int `xorm:"'order_type' TINYINT"`
|
||||||
Amount int `xorm:"'amount' int(11)"`
|
RefundOrderId int64 `xorm:"'refund_order_id' bigint(20)"`
|
||||||
PayerTotal int `xorm:"'payer_total' int(11)"`
|
Amount int `xorm:"'amount' int(11)"`
|
||||||
ExtJson string `xorm:"'ext_json' varchar(1024)"`
|
PayerTotal int `xorm:"'payer_total' int(11)"`
|
||||||
Desc string `xorm:"'desc' varchar(100)"`
|
ExtJson string `xorm:"'ext_json' varchar(1024)"`
|
||||||
CreateTime time.Time `xorm:"'create_time' datetime created"`
|
Desc string `xorm:"'desc' varchar(100)"`
|
||||||
UpdateTime time.Time `xorm:"'update_time' timestamp updated"`
|
CreateTime time.Time `xorm:"'create_time' datetime created"`
|
||||||
Status int `xorm:"'status' TINYINT"`
|
UpdateTime time.Time `xorm:"'update_time' timestamp updated"`
|
||||||
DeleteTime time.Time `xorm:"'delete_time' timestamp deleted"`
|
Status int `xorm:"'status' TINYINT"`
|
||||||
|
DeleteTime time.Time `xorm:"'delete_time' timestamp deleted"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type OrdersBackendList struct {
|
type OrdersBackendList struct {
|
||||||
|
|
Loading…
Reference in New Issue