Compare commits

..

No commits in common. "4642ae73fe0b4c7ddad82456b4a26c1eb0afbe7d" and "943c3401c66913c63f92a57fb38610269745347c" have entirely different histories.

20 changed files with 156 additions and 402 deletions

View File

@ -4,7 +4,6 @@ import (
"PaymentCenter/app/constants/common" "PaymentCenter/app/constants/common"
"PaymentCenter/app/data" "PaymentCenter/app/data"
"PaymentCenter/app/http/entities" "PaymentCenter/app/http/entities"
"PaymentCenter/app/http/entities/backend"
"PaymentCenter/app/models/ordersmodel" "PaymentCenter/app/models/ordersmodel"
"PaymentCenter/app/models/orderthirdpaylogmodel" "PaymentCenter/app/models/orderthirdpaylogmodel"
"PaymentCenter/app/third/paymentService" "PaymentCenter/app/third/paymentService"
@ -29,60 +28,20 @@ func RegisterCommand(c *command.Command) {
func closeOrder() { func closeOrder() {
var now = time.Now().Format(time.DateTime) var now = time.Now().Format(time.DateTime)
utils.Log(nil, "关闭订单", now) utils.Log(nil, "关闭订单", now)
var ctx = context.Background()
orderIds := make([]int64, 0)
// 查询未支付的订单 // 查询未支付的订单
repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb()) repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
// 拼接条件 // 拼接条件
cond := builder.NewCond() cond := builder.NewCond()
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))}) 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.OrdersLeftPayChannelList, 0) order := make([]ordersmodel.Orders, 0)
err := repo.OrdersLeftPayChannelList(cond, entities.PageRequest{}, &order) total, err := repo.OrderList(cond, entities.PageRequest{}, &order)
if err != nil { if err != nil {
utils.Log(nil, "关闭订单,查询未支付订单失败", err) utils.Log(nil, "关闭订单,查询未支付订单失败", err)
} else if len(order) > 0 { } else if total > 0 {
for i := range order { orderIds := make([]int64, 0)
orderInfo := order[i] for _, v := range order {
// 往上游发送关闭订单请求 orderIds = append(orderIds, v.Id)
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:
var 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: ali.AppPublicCert,
AlipayRootCert: ali.AlipayRootCert,
AlipayPublicCert: 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() cond = builder.NewCond()
@ -93,7 +52,7 @@ func closeOrder() {
return return
} }
} }
utils.Log(nil, "关闭订单,修改订单状态成功", "总数量="+strconv.Itoa(len(order)), "成功数量="+strconv.Itoa(len(orderIds))) utils.Log(nil, "关闭订单,修改订单状态成功", "count="+strconv.Itoa(len(order)))
} }
// 主动查询订单支付状态 // 主动查询订单支付状态
@ -105,6 +64,7 @@ func queryOrder() {
repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb()) repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
// 拼接条件 // 拼接条件
cond := builder.NewCond() 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))}) 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) order := make([]ordersmodel.OrdersLeftPayChannelList, 0)
err := repo.OrdersLeftPayChannelList(cond, entities.PageRequest{}, &order) err := repo.OrdersLeftPayChannelList(cond, entities.PageRequest{}, &order)
@ -130,32 +90,13 @@ func queryOrder() {
query := paymentService.PayOrderQueryRequest{ query := paymentService.PayOrderQueryRequest{
OrderId: orderInfo.Id, OrderId: orderInfo.Id,
} }
switch utils.PayType(orderInfo.ChannelType) { switch orderInfo.ChannelType {
case common.PAY_CHANNLE_TYPE_WECHAT: 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:
wx := backend.WechatPayChannel{} _ = json.Unmarshal([]byte(orderInfo.ExtJson), &query.Wx)
_ = json.Unmarshal([]byte(orderInfo.ExtJson), &wx)
query.PayChannel = payCommon.PAY_CHANNLE_TYPE_WECHAT query.PayChannel = payCommon.PAY_CHANNLE_TYPE_WECHAT
query.Wx = paymentService.WxPay{ case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI:
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 query.PayChannel = payCommon.PAY_CHANNLE_TYPE_ZFB
_ = json.Unmarshal([]byte(orderInfo.ExtJson), &ali) _ = json.Unmarshal([]byte(orderInfo.ExtJson), &query.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
} }
// 发起查询 // 发起查询
@ -184,7 +125,7 @@ func queryOrder() {
// 更新订单状态 todo // 更新订单状态 todo
orderUpdate := ordersmodel.Orders{ orderUpdate := ordersmodel.Orders{
Id: orderInfo.Id, Id: orderInfo.Id,
Status: status, Status: int32(status),
} }
session := ordersmodel.GetInstance().GetDb().NewSession() session := ordersmodel.GetInstance().GetDb().NewSession()
@ -211,12 +152,11 @@ func queryOrder() {
} }
// 写入日志 // 写入日志
body, _ := json.Marshal(result)
log := orderthirdpaylogmodel.OrderThirdPayLog{ log := orderthirdpaylogmodel.OrderThirdPayLog{
OrderId: orderInfo.Id, OrderId: orderInfo.Id,
PayCallback: string(body), PayCallback: "",
Status: 0, Status: 0,
PayParam: "", MerchantParam: "",
MerchantCallback: "", MerchantCallback: "",
} }
_, err = orderLogRepo.OrderThirdPayLogInsertOne(&log) _, err = orderLogRepo.OrderThirdPayLogInsertOne(&log)

View File

@ -4,7 +4,7 @@ const (
TOKEN_PRE = "player_token_" TOKEN_PRE = "player_token_"
TOKEN_Admin = "Admin_token_" TOKEN_Admin = "Admin_token_"
ADMIN_V1 = "/pay/admin/api/v1" ADMIN_V1 = "/pay/admin/api/v1"
FRONT_V1 = "/pay/front/api/v1" FRONT_V1 = "/api/v1"
// 支付渠道枚举,1微信JSAPI2微信H53微信app4微信Native5微信小程序6支付宝网页&移动应用7支付宝小程序8支付宝JSAPI // 支付渠道枚举,1微信JSAPI2微信H53微信app4微信Native5微信小程序6支付宝网页&移动应用7支付宝小程序8支付宝JSAPI
PAY_CHANNEL_UNKNOWN = 0 PAY_CHANNEL_UNKNOWN = 0
@ -29,21 +29,11 @@ const (
ORDER_STATUS_FAILED = 4 ORDER_STATUS_FAILED = 4
ORDER_STATUS_CLOSE = 5 ORDER_STATUS_CLOSE = 5
STATUS_ENABLE = 1 STATUS_ENABLE int32 = 1
STATUS_DISABLED = 2 STATUS_DISABLED int32 = 2
ORDER_TYPE_PAY = 1 ORDER_TYPE_PAY int32 = 1
ORDER_TYPE_REFUND = 2 ORDER_TYPE_REFUND int32 = 2
PAY_CHANNLE_TYPE_WECHAT = 1 // 支付类型: 微信
PAY_CHANNLE_TYPE_ZFB = 2 // 支付类型:支付宝
THIRD_ORDER_TYPE_PAY = 1 // 发起支付
THIRD_ORDER_TYPE_ORDER_QUERY = 2 // 查询订单
THIRD_ORDER_TYPE_REFUND = 3 // 发起退款
THIRD_ORDER_TYPE_REFUND_QUERY = 4 // 退款查询
THIRD_ORDER_TYPE_CLOSE = 5 // 关闭订单
THIRD_ORDER_TYPE_CALL_BACK = 6 // 支付回调
) )
var PayChannelList = map[int]string{ var PayChannelList = map[int]string{
@ -57,7 +47,7 @@ var PayChannelList = map[int]string{
PAY_CHANNEL_ALIPAY_JSAPI: "支付宝JSAPI", PAY_CHANNEL_ALIPAY_JSAPI: "支付宝JSAPI",
} }
var OrderTypeList = map[int]string{ var OrderTypeList = map[int32]string{
ORDER_TYPE_PAY: "付款", ORDER_TYPE_PAY: "付款",
ORDER_TYPE_REFUND: "退款", ORDER_TYPE_REFUND: "退款",
} }

View File

@ -84,7 +84,6 @@ var MsgZH = map[int]string{
AppDisabled: "app通道关闭", AppDisabled: "app通道关闭",
AppIpNotAllow: "ip不在白名单内", AppIpNotAllow: "ip不在白名单内",
AppDecryptDataDiscrepancy: "解密数据不一致", AppDecryptDataDiscrepancy: "解密数据不一致",
SystemError: "系统错误",
AppRsaDecryptKeyNotFound: "密匙缺失无法进行Rsa解密", AppRsaDecryptKeyNotFound: "密匙缺失无法进行Rsa解密",
AppRsaDecryptFail: "Rsa解密失败", AppRsaDecryptFail: "Rsa解密失败",

View File

@ -47,8 +47,8 @@ func (m *OrderRepo) OrdersBackendList(conn builder.Cond, pageFilter entities.Pag
} }
repo = repo.Join("left", "app", "app.id = orders.app_id"). repo = repo.Join("left", "app", "app.id = orders.app_id").
Join("left", "merchant", "merchant.id = orders.merchant_id"). Join("left", "merchant", "merchant.id = orders.merchant_id").
Join("left", "pay_channel", "pay_channel.id = orders.pay_channel_id") Join("left", "pay_channel", "pay_channel.id = orders.pay_id")
return repo.Desc("orders.create_time").FindAndCount(orderList) return repo.Desc("create_time").FindAndCount(orderList)
} }
func (m *OrderRepo) OrdersLeftPayChannelList(conn builder.Cond, pageFilter entities.PageRequest, orderList *[]ordersmodel.OrdersLeftPayChannelList) error { func (m *OrderRepo) OrdersLeftPayChannelList(conn builder.Cond, pageFilter entities.PageRequest, orderList *[]ordersmodel.OrdersLeftPayChannelList) error {
@ -57,7 +57,7 @@ func (m *OrderRepo) OrdersLeftPayChannelList(conn builder.Cond, pageFilter entit
if pageFilter.Page > 0 { if pageFilter.Page > 0 {
repo = repo.Limit(pageFilter.PageSize, pageFilter.PageSize*(pageFilter.Page-1)) repo = repo.Limit(pageFilter.PageSize, pageFilter.PageSize*(pageFilter.Page-1))
} }
repo = repo.Join("left", "pay_channel", "pay_channel.id = orders.pay_channel_id") repo = repo.Join("left", "pay_channel", "pay_channel.id = orders.pay_id")
return repo.Find(orderList) return repo.Find(orderList)
} }

View File

@ -12,6 +12,7 @@ import (
"github.com/go-pay/gopay" "github.com/go-pay/gopay"
"github.com/go-pay/gopay/alipay" "github.com/go-pay/gopay/alipay"
"github.com/go-pay/gopay/wechat/v3" "github.com/go-pay/gopay/wechat/v3"
"github.com/go-pay/xlog"
"github.com/qit-team/snow-core/log/logger" "github.com/qit-team/snow-core/log/logger"
"strconv" "strconv"
@ -25,23 +26,16 @@ func WxCallback(c *gin.Context) {
logger.Info(c, "WxCallback-回调数据payChannelId", payChannelId) logger.Info(c, "WxCallback-回调数据payChannelId", payChannelId)
if payChannelId == "" { if payChannelId == "" {
c.String(http.StatusBadRequest, "%s", "fail") c.String(http.StatusBadRequest, "%s", "fail")
return
} }
// 查询应用下的支付配置 // 查询应用下的支付配置
var payChannelModel paychannelmodel.PayChannel var payChannelModel paychannelmodel.PayChannel
payChannelIdInt, _ := strconv.Atoi(payChannelId) payChannelIdInt, _ := strconv.Atoi(payChannelId)
payChannelModel.Id = int64(payChannelIdInt) payChannelModel.Id = int64(payChannelIdInt)
code := services.PayChannelGet(&payChannelModel) services.PayChannelGet(&payChannelModel)
if code == errorcode.PayChannelNotFound {
logger.Error(c, "AliCallback-回调数据未获取到支付配置404")
c.String(http.StatusBadRequest, "%s", "fail")
return
}
if payChannelModel.ChannelType != common.PAY_CHANNEL_WECHAT_H5 { if payChannelModel.ChannelType != common.PAY_CHANNEL_WECHAT_H5 {
logger.Error(c, "WxCallback-回调数据解析支付配置错误,查询的数据不是当前渠道") logger.Error(c, "WxCallback-回调数据解析支付配置错误,查询的数据不是当前渠道")
c.String(http.StatusBadRequest, "%s", "fail") c.String(http.StatusBadRequest, "%s", "fail")
return
} }
var wxConfig paymentService.WxPay var wxConfig paymentService.WxPay
@ -49,26 +43,22 @@ func WxCallback(c *gin.Context) {
if err != nil { if err != nil {
logger.Error(c, "WxCallback-回调数据解析支付配置错误", fmt.Sprintf("错误原因:%s", err.Error())) logger.Error(c, "WxCallback-回调数据解析支付配置错误", fmt.Sprintf("错误原因:%s", err.Error()))
c.String(http.StatusBadRequest, "%s", "fail") c.String(http.StatusBadRequest, "%s", "fail")
return
} }
if wxConfig.ApiV3Key == "" || wxConfig.MchId == "" || wxConfig.PrivateKey == "" || wxConfig.SerialNo == "" { if wxConfig.ApiV3Key == "" || wxConfig.MchId == "" || wxConfig.PrivateKey == "" || wxConfig.SerialNo == "" {
logger.Error(c, "WxCallback-回调数据解析支付配置错误,解析出来的信息为空") logger.Error(c, "WxCallback-回调数据解析支付配置错误,解析出来的信息为空")
c.String(http.StatusBadRequest, "%s", "fail") c.String(http.StatusBadRequest, "%s", "fail")
return
} }
wxConfig.AppId = payChannelModel.AppId wxConfig.AppId = payChannelModel.AppId
notifyReq, err := wechat.V3ParseNotify(c.Request) notifyReq, err := wechat.V3ParseNotify(c.Request)
if err != nil { if err != nil {
logger.Error(c, "WxCallback-回调数据验签失败", err.Error()) logger.Error(c, "WxCallback-回调数据验签失败", err.Error())
c.String(http.StatusBadRequest, "%s", "fail")
return return
} }
err = paymentService.WxPayCallBack(notifyReq, wxConfig) err = paymentService.WxPayCallBack(notifyReq, wxConfig)
if err != nil { if err != nil {
logger.Error(c, "WxCallback-回调执行失败,失败原因:", err.Error()) logger.Error(c, "WxCallback-回调执行失败,失败原因:", err.Error())
c.String(http.StatusBadRequest, "%s", "fail")
return return
} }
@ -76,7 +66,6 @@ func WxCallback(c *gin.Context) {
// 退款通知http应答码为200且返回状态码为SUCCESS才会当做商户接收成功否则会重试。 // 退款通知http应答码为200且返回状态码为SUCCESS才会当做商户接收成功否则会重试。
// 注意:重试过多会导致微信支付端积压过多通知而堵塞,影响其他正常通知。 // 注意:重试过多会导致微信支付端积压过多通知而堵塞,影响其他正常通知。
c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.SUCCESS, Message: "成功"}) c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.SUCCESS, Message: "成功"})
return
} }
// AliCallback 支付宝支付回调 // AliCallback 支付宝支付回调
@ -86,22 +75,19 @@ func AliCallback(c *gin.Context) {
logger.Info(c, "AliCallback-回调数据APPID", payChannelId) logger.Info(c, "AliCallback-回调数据APPID", payChannelId)
if payChannelId == "" { if payChannelId == "" {
c.String(http.StatusBadRequest, "%s", "fail") c.String(http.StatusBadRequest, "%s", "fail")
return
} }
// 查询应用下的支付配置 // 查询应用下的支付配置
var payChannelModel paychannelmodel.PayChannel var payChannelModel paychannelmodel.PayChannel
payChannelIdInt, _ := strconv.Atoi(payChannelId) payChannelIdInt, _ := strconv.Atoi(payChannelId)
payChannelModel.Id = int64(payChannelIdInt) payChannelModel.Id = int64(payChannelIdInt)
code := services.PayChannelGet(&payChannelModel) code := services.PayChannelGet(&payChannelModel)
if code == errorcode.PayChannelNotFound {
logger.Error(c, "AliCallback-回调数据未获取到支付配置404")
c.String(http.StatusBadRequest, "%s", "fail")
return
}
if payChannelModel.ChannelType != common.PAY_CHANNEL_ALIPAY_WEB { if payChannelModel.ChannelType != common.PAY_CHANNEL_ALIPAY_WEB {
logger.Error(c, "AliCallback-回调数据解析支付配置错误,查询的数据不是当前渠道") logger.Error(c, "AliCallback-回调数据解析支付配置错误,查询的数据不是当前渠道")
c.String(http.StatusBadRequest, "%s", "fail") c.String(http.StatusBadRequest, "%s", "fail")
return }
if code == errorcode.PayChannelNotFound {
logger.Error(c, "AliCallback-回调数据未获取到支付配置404")
c.String(http.StatusBadRequest, "%s", "fail")
} }
var aliConfig paymentService.AliPay var aliConfig paymentService.AliPay
@ -115,31 +101,27 @@ func AliCallback(c *gin.Context) {
if err != nil { if err != nil {
logger.Error(c, "AliCallback-回调数据解析支付配置错误", fmt.Sprintf("错误原因:%s", err.Error())) logger.Error(c, "AliCallback-回调数据解析支付配置错误", fmt.Sprintf("错误原因:%s", err.Error()))
c.String(http.StatusBadRequest, "%s", "fail") c.String(http.StatusBadRequest, "%s", "fail")
return
} }
if aliConfigModel.AlipayPublicCert == "" || aliConfigModel.PrivateKey == "" || aliConfigModel.AppPublicCert == "" || aliConfigModel.AlipayRootCert == "" { if aliConfigModel.AlipayPublicCert == "" || aliConfigModel.PrivateKey == "" || aliConfigModel.AppPublicCert == "" || aliConfigModel.AlipayRootCert == "" {
logger.Error(c, "AliCallback-回调数据解析支付配置错误,解析出来的信息为空") logger.Error(c, "AliCallback-回调数据解析支付配置错误,解析出来的信息为空")
c.String(http.StatusBadRequest, "%s", "fail") c.String(http.StatusBadRequest, "%s", "fail")
return
} }
aliConfig.AppId = payChannelModel.AppId aliConfig.AppId = payChannelModel.AppId
aliConfig.PrivateKey = aliConfigModel.PrivateKey aliConfig.PrivateKey = aliConfigModel.PrivateKey
aliConfig.AppPublicCert = aliConfigModel.AppPublicCert aliConfig.AppPublicCert = []byte(aliConfigModel.AppPublicCert)
aliConfig.AlipayRootCert = aliConfigModel.AlipayRootCert aliConfig.AlipayRootCert = []byte(aliConfigModel.AlipayRootCert)
aliConfig.AlipayPublicCert = aliConfigModel.AlipayPublicCert aliConfig.AlipayPublicCert = []byte(aliConfigModel.AlipayPublicCert)
notifyReq, err := alipay.ParseNotifyToBodyMap(c.Request) // c.Request 是 gin 框架的写法 notifyReq, err := alipay.ParseNotifyToBodyMap(c.Request) // c.Request 是 gin 框架的写法
if err != nil { if err != nil {
c.String(http.StatusBadRequest, "%s", "fail") xlog.Error(err)
return return
} }
err = paymentService.ALiCallBack(notifyReq, aliConfig) err = paymentService.ALiCallBack(notifyReq, aliConfig)
if err != nil { if err != nil {
logger.Error(c, "AliCallback-回调执行失败,失败原因:", err.Error()) logger.Error(c, "AliCallback-回调执行失败,失败原因:", err.Error())
c.String(http.StatusBadRequest, "%s", "fail")
return return
} }
c.String(http.StatusOK, "%s", "success") c.String(http.StatusOK, "%s", "success")
return
} }

View File

@ -14,9 +14,9 @@ import (
type OrderListRequest struct { type OrderListRequest struct {
Id int64 `json:"id" form:"id"` Id int64 `json:"id" form:"id"`
MerchantId int64 `json:"merchant_id" form:"merchant_id"` MerchantId int64 `json:"merchant_id" form:"merchant_id"`
PayChannelId int64 `json:"pay_channel_id" form:"pay_channel_id"` PayId int64 `json:"pay_id" form:"pay_id"`
AppId int64 `json:"app_id" form:"app_id"` AppId int64 `json:"app_id" form:"app_id"`
OutTreadNo string `json:"out_tread_no" form:"out_tread_no"` MerchantOrderId string `json:"merchant_order_id" form:"merchant_order_id"`
Status int `json:"status" form:"status"` Status int `json:"status" form:"status"`
OrderType int `json:"order_type" form:"order_type"` OrderType int `json:"order_type" form:"order_type"`
StartTime string `json:"start_time" form:"start_time"` StartTime string `json:"start_time" form:"start_time"`
@ -26,9 +26,9 @@ type OrderListRequest struct {
type OrderList struct { type OrderList struct {
Id int64 `json:"id"` Id int64 `json:"id"`
MerchantId int64 `json:"merchant_id"` MerchantId int64 `json:"merchant_id"`
PayChannelId int64 `json:"pay_channel_id"` PayId int64 `json:"pay_id"`
AppId int64 `json:"app_id"` AppId int64 `json:"app_id"`
OutTreadNo string `json:"out_tread_no"` MerchantOrderId string `json:"merchant_order_id"`
Status int `json:"status"` Status int `json:"status"`
OrderType int `json:"order_type"` OrderType int `json:"order_type"`
StartTime time.Time `json:"start_time"` StartTime time.Time `json:"start_time"`
@ -54,9 +54,9 @@ func (o *OrderListRequest) ValidateRequest() (r OrderList, err error) {
r.Id = o.Id r.Id = o.Id
r.MerchantId = o.MerchantId r.MerchantId = o.MerchantId
r.PayChannelId = o.PayChannelId r.PayId = o.PayId
r.AppId = o.AppId r.AppId = o.AppId
r.OutTreadNo = o.OutTreadNo r.MerchantOrderId = o.MerchantOrderId
r.Status = o.Status r.Status = o.Status
r.OrderType = o.OrderType r.OrderType = o.OrderType
r.PageRequest = o.PageRequest r.PageRequest = o.PageRequest
@ -70,10 +70,13 @@ type OrdersResponse struct {
PayChannelId int64 `json:"pay_channel_id"` PayChannelId int64 `json:"pay_channel_id"`
AppId int64 `json:"app_id"` AppId int64 `json:"app_id"`
OutTreadNo string `json:"out_tread_no"` OutTreadNo string `json:"out_tread_no"`
Status int `json:"status"` Status int32 `json:"status"`
OrderType int `json:"order_type"` OrderType int32 `json:"order_type"`
Amount int `json:"amount"` Amount int `json:"amount"`
PayerTotal int `json:"payer_total"` IpAddress string `json:"ip_address"`
MerchantRequest string `json:"merchant_request"`
MerchantResponse string `json:"merchant_response"`
OrderResponse string `json:"order_response"`
ExtJson string `json:"ext_json"` ExtJson string `json:"ext_json"`
CreateTime string `json:"create_time"` CreateTime string `json:"create_time"`
UpdateTime string `json:"update_time"` UpdateTime string `json:"update_time"`
@ -91,7 +94,6 @@ func (o *OrdersResponse) ResponseFromDb(db ordersmodel.OrdersBackendList) {
o.Status = db.Status o.Status = db.Status
o.OrderType = db.OrderType o.OrderType = db.OrderType
o.Amount = db.Amount o.Amount = db.Amount
o.PayerTotal = db.PayerTotal
o.ExtJson = db.ExtJson o.ExtJson = db.ExtJson
o.CreateTime = db.CreateTime.Format("2006-01-02 15:04:05") o.CreateTime = db.CreateTime.Format("2006-01-02 15:04:05")
o.UpdateTime = db.UpdateTime.Format("2006-01-02 15:04:05") o.UpdateTime = db.UpdateTime.Format("2006-01-02 15:04:05")
@ -112,7 +114,7 @@ type OrderRequestLogResponse struct {
MerchantRequest string `json:"merchant_request"` MerchantRequest string `json:"merchant_request"`
MerchantResponse string `json:"merchant_response"` MerchantResponse string `json:"merchant_response"`
CreateTime string `json:"create_time"` CreateTime string `json:"create_time"`
Status int `json:"status"` Status int32 `json:"status"`
} }
func (o *OrderRequestLogResponse) ResponseFromDb(db orderrequestlogmodel.OrderRequestLog) { func (o *OrderRequestLogResponse) ResponseFromDb(db orderrequestlogmodel.OrderRequestLog) {
@ -133,7 +135,7 @@ type OrderThirdLogResponse struct {
CreateTime string `json:"create_time"` CreateTime string `json:"create_time"`
PayCallback string `json:"pay_callback"` PayCallback string `json:"pay_callback"`
Status int `json:"status"` Status int `json:"status"`
PayParam string `json:"pay_param"` MerchantParam string `json:"merchant_param"`
MerchantCallback string `json:"merchant_callback"` MerchantCallback string `json:"merchant_callback"`
} }
@ -142,7 +144,7 @@ func (o *OrderThirdLogResponse) ResponseFromDb(db orderthirdpaylogmodel.OrderThi
o.OrderId = db.OrderId o.OrderId = db.OrderId
o.PayCallback = db.PayCallback o.PayCallback = db.PayCallback
o.Status = db.Status o.Status = db.Status
o.PayParam = db.PayParam o.MerchantParam = db.MerchantParam
o.MerchantCallback = db.MerchantCallback o.MerchantCallback = db.MerchantCallback
o.CreateTime = db.CreateTime.Format("2006-01-02 15:04:05") o.CreateTime = db.CreateTime.Format("2006-01-02 15:04:05")
} }

View File

@ -17,7 +17,7 @@ type PayChannelResponse struct {
AppId string `json:"app_id"` AppId string `json:"app_id"`
ExpireTime string `json:"expire_time"` ExpireTime string `json:"expire_time"`
CreateTime string `json:"create_time"` CreateTime string `json:"create_time"`
AliPayChannel *AliPayChannel `json:"ali_pay_channel,omitempty"` AliPayPayChannel *AliPayPayChannel `json:"ali_pay_pay_channel,omitempty"`
WechatPayChannel *WechatPayChannel `json:"wechat_pay_channel,omitempty"` WechatPayChannel *WechatPayChannel `json:"wechat_pay_channel,omitempty"`
} }
@ -34,7 +34,7 @@ func (p *PayChannelResponse) ResponseFromDb(db paychannelmodel.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: 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(db.ExtJson), &p.WechatPayChannel) _ = json.Unmarshal([]byte(db.ExtJson), &p.WechatPayChannel)
case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI: case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI:
_ = json.Unmarshal([]byte(db.ExtJson), &p.AliPayChannel) _ = json.Unmarshal([]byte(db.ExtJson), &p.AliPayPayChannel)
} }
} }
@ -44,7 +44,7 @@ type PayChannelCreateRequest struct {
ChannelType int `json:"channel_type" validate:"required" label:"支付渠道"` //支付渠道枚举,1微信JSAPI2微信H53微信app4微信Native5微信小程序6支付宝网页&移动应用7支付宝小程序8支付宝JSAPI ChannelType int `json:"channel_type" validate:"required" label:"支付渠道"` //支付渠道枚举,1微信JSAPI2微信H53微信app4微信Native5微信小程序6支付宝网页&移动应用7支付宝小程序8支付宝JSAPI
AppId string `json:"app_id" validate:"required" label:"应用appId"` AppId string `json:"app_id" validate:"required" label:"应用appId"`
ExpireTime string `json:"expire_time"` ExpireTime string `json:"expire_time"`
AliPayChannel AliPayChannel `json:"ali_pay_channel,omitempty"` AliPayPayChannel AliPayPayChannel `json:"ali_pay_pay_channel,omitempty"`
WechatPayChannel WechatPayChannel `json:"wechat_pay_channel,omitempty"` WechatPayChannel WechatPayChannel `json:"wechat_pay_channel,omitempty"`
} }
@ -55,7 +55,7 @@ type WechatPayChannel struct {
PrivateKey string `json:"private_key"` // 私钥 apiclient_key.pem 读取后的内容 PrivateKey string `json:"private_key"` // 私钥 apiclient_key.pem 读取后的内容
} }
type AliPayChannel struct { type AliPayPayChannel struct {
PrivateKey string `json:"private_key"` // 应用私钥 PrivateKey string `json:"private_key"` // 应用私钥
AppPublicCert string `json:"app_public_cert"` // 应用公钥 AppPublicCert string `json:"app_public_cert"` // 应用公钥
AlipayRootCert string `json:"alipay_root_cert"` // 支付宝根证书 AlipayRootCert string `json:"alipay_root_cert"` // 支付宝根证书
@ -78,7 +78,7 @@ func (p *PayChannelCreateRequest) RequestToDb() (db paychannelmodel.PayChannel,
b, _ := json.Marshal(p.WechatPayChannel) b, _ := json.Marshal(p.WechatPayChannel)
db.ExtJson = string(b) db.ExtJson = string(b)
case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI: case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI:
b, _ := json.Marshal(p.AliPayChannel) b, _ := json.Marshal(p.AliPayPayChannel)
db.ExtJson = string(b) db.ExtJson = string(b)
default: default:
err = errors.New("支付渠道类型错误") err = errors.New("支付渠道类型错误")
@ -98,7 +98,7 @@ type PayChannelUpdateRequest struct {
ChannelType int `json:"channel_type" validate:"required" label:"支付渠道"` //支付渠道枚举,1微信JSAPI2微信H53微信app4微信Native5微信小程序6支付宝网页&移动应用7支付宝小程序8支付宝JSAPI ChannelType int `json:"channel_type" validate:"required" label:"支付渠道"` //支付渠道枚举,1微信JSAPI2微信H53微信app4微信Native5微信小程序6支付宝网页&移动应用7支付宝小程序8支付宝JSAPI
AppId string `json:"app_id" validate:"required" label:"应用appId"` AppId string `json:"app_id" validate:"required" label:"应用appId"`
ExpireTime string `json:"expire_time"` ExpireTime string `json:"expire_time"`
AliPayChannel AliPayChannel `json:"ali_pay_channel,omitempty"` AliPayPayChannel AliPayPayChannel `json:"ali_pay_pay_channel,omitempty"`
WechatPayChannel WechatPayChannel `json:"wechat_pay_channel,omitempty"` WechatPayChannel WechatPayChannel `json:"wechat_pay_channel,omitempty"`
} }
@ -118,7 +118,7 @@ func (p PayChannelUpdateRequest) RequestToDb() (db paychannelmodel.PayChannel, e
b, _ := json.Marshal(p.WechatPayChannel) b, _ := json.Marshal(p.WechatPayChannel)
db.ExtJson = string(b) db.ExtJson = string(b)
case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI: case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI:
b, _ := json.Marshal(p.AliPayChannel) b, _ := json.Marshal(p.AliPayPayChannel)
db.ExtJson = string(b) db.ExtJson = string(b)
default: default:
err = errors.New("支付渠道类型错误") err = errors.New("支付渠道类型错误")

View File

@ -15,7 +15,7 @@ type PayReqs struct {
ApiCommonBody ApiCommonBody
PayChannelId int64 `json:"pay_channel_id" validate:"required" label:"支付渠道"` PayChannelId int64 `json:"pay_channel_id" validate:"required" label:"支付渠道"`
OutTradeNo string `json:"out_trade_no" validate:"required" label:"外侧商户订单号"` OutTradeNo string `json:"out_trade_no" validate:"required" label:"外侧商户订单号"`
OrderType int `json:"order_type" validate:"required" label:"订单类型,支付,退款"` OrderType int32 `json:"order_type" validate:"required" label:"订单类型,支付,退款"`
Amount int `json:"amount" validate:"required" label:"支付金额,单位分"` Amount int `json:"amount" validate:"required" label:"支付金额,单位分"`
ExtJson string `json:"ext_json" label:"扩展参数"` ExtJson string `json:"ext_json" label:"扩展参数"`
Desc string `json:"desc" validate:"max=100" label:"商品描述"` Desc string `json:"desc" validate:"max=100" label:"商品描述"`

View File

@ -20,7 +20,7 @@ type OrderRequestLog struct {
MerchantResponse string `xorm:"'merchant_response' JSON"` MerchantResponse string `xorm:"'merchant_response' JSON"`
CreateTime time.Time `xorm:"'create_time' datetime created"` CreateTime time.Time `xorm:"'create_time' datetime created"`
UpdateTime time.Time `xorm:"'update_time' timestamp updated"` UpdateTime time.Time `xorm:"'update_time' timestamp updated"`
Status int `xorm:"'status' TINYINT"` Status int32 `xorm:"'status' TINYINT"`
} }
// 表名 // 表名

View File

@ -18,14 +18,13 @@ type Orders struct {
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 int32 `xorm:"'order_type' TINYINT"`
Amount int `xorm:"'amount' int(11)"` Amount int `xorm:"'amount' int(11)"`
PayerTotal int `xorm:"'payer_total' int(11)"`
ExtJson string `xorm:"'ext_json' varchar(1024)"` ExtJson string `xorm:"'ext_json' varchar(1024)"`
Desc string `xorm:"'desc' varchar(100)"` Desc string `xorm:"'desc' varchar(100)"`
CreateTime time.Time `xorm:"'create_time' datetime created"` CreateTime time.Time `xorm:"'create_time' datetime created"`
UpdateTime time.Time `xorm:"'update_time' timestamp updated"` UpdateTime time.Time `xorm:"'update_time' timestamp updated"`
Status int `xorm:"'status' TINYINT"` Status int32 `xorm:"'status' TINYINT"`
DeleteTime time.Time `xorm:"'delete_time' timestamp deleted"` DeleteTime time.Time `xorm:"'delete_time' timestamp deleted"`
} }

View File

@ -15,11 +15,10 @@ var (
type OrderThirdPayLog struct { type OrderThirdPayLog struct {
Id int64 Id int64
OrderId int64 `xorm:"'order_id' bigint(20)"` OrderId int64 `xorm:"'order_id' bigint(20)"`
PayCallback string `xorm:"'pay_callback' JSON"` PayCallback string `xorm:"'pay_callback' varchar(255)"`
Status int `xorm:"'status' TINYINT"` Status int `xorm:"'status' TINYINT"`
PayParam string `xorm:"'pay_param' JSON"` MerchantParam string `xorm:"'merchant_param' varchar(255)"`
MerchantCallback string `xorm:"'merchant_callback' JSON"` MerchantCallback string `xorm:"'merchant_callback' varchar(255)"`
Type int `xorm:"'type' TINYINT"`
CreateTime time.Time `xorm:"'create_time' datetime created"` CreateTime time.Time `xorm:"'create_time' datetime created"`
} }

View File

@ -23,14 +23,14 @@ func OrderList(req backend.OrderList) (result []ordersmodel.OrdersBackendList, t
if req.MerchantId > 0 { if req.MerchantId > 0 {
conn = conn.And(builder.Eq{"merchant_id": req.MerchantId}) conn = conn.And(builder.Eq{"merchant_id": req.MerchantId})
} }
if req.PayChannelId > 0 { if req.PayId > 0 {
conn = conn.And(builder.Eq{"pay_channel_id": req.PayChannelId}) conn = conn.And(builder.Eq{"pay_id": req.PayId})
} }
if req.AppId > 0 { if req.AppId > 0 {
conn = conn.And(builder.Eq{"app_id": req.AppId}) conn = conn.And(builder.Eq{"app_id": req.AppId})
} }
if req.OutTreadNo != "" { if req.MerchantOrderId != "" {
conn = conn.And(builder.Like{"out_tread_no", req.OutTreadNo}) conn = conn.And(builder.Like{"merchant_order_id", req.MerchantOrderId})
} }
if req.Status > 0 { if req.Status > 0 {
conn = conn.And(builder.Eq{"status": req.Status}) conn = conn.And(builder.Eq{"status": req.Status})

View File

@ -2,9 +2,9 @@ package types
type PayResp struct { type PayResp struct {
OrderNo int64 `json:"order_no"` OrderNo int64 `json:"order_no"`
OrderType int `json:"out_trade_no"` OrderType int32 `json:"out_trade_no"`
Amount int `json:"order_type"` Amount int `json:"order_type"`
Desc string `json:"amount"` Desc string `json:"amount"`
IsNewCreate bool `json:"is_new_create"` IsNewCreate bool `json:"is_new_create"`
Status int `json:"status"` Status int32 `json:"status"`
} }

View File

@ -2,7 +2,6 @@ package paymentService
import ( import (
"PaymentCenter/app/third/paymentService/payCommon" "PaymentCenter/app/third/paymentService/payCommon"
"PaymentCenter/config"
"context" "context"
"errors" "errors"
"fmt" "fmt"
@ -21,13 +20,12 @@ var (
// AliInitClient 使用提供的支付请求参数初始化支付宝客户端 // AliInitClient 使用提供的支付请求参数初始化支付宝客户端
func AliInitClient(aliConfig AliPay) { func AliInitClient(aliConfig AliPay) {
envConfig := config.GetConf()
aliOnce.Do(func() { aliOnce.Do(func() {
// 初始化支付宝客户端 // 初始化支付宝客户端
// appid应用ID // appid应用ID
// privateKey应用私钥支持PKCS1和PKCS8 // privateKey应用私钥支持PKCS1和PKCS8
// isProd是否是正式环境沙箱环境请选择新版沙箱应用。 // isProd是否是正式环境沙箱环境请选择新版沙箱应用。
aliClient, aliClientErr = alipay.NewClient(aliConfig.AppId, aliConfig.PrivateKey, envConfig.PayService.IsProd) aliClient, aliClientErr = alipay.NewClient(aliConfig.AppId, aliConfig.PrivateKey, true)
}) })
// 自定义配置http请求接收返回结果body大小默认 10MB // 自定义配置http请求接收返回结果body大小默认 10MB
aliClient.SetBodySize(10) // 没有特殊需求,可忽略此配置 aliClient.SetBodySize(10) // 没有特殊需求,可忽略此配置
@ -43,10 +41,10 @@ func AliInitClient(aliConfig AliPay) {
// 自动同步验签(只支持证书模式) // 自动同步验签(只支持证书模式)
// 传入 alipayPublicCert.crt 内容 // 传入 alipayPublicCert.crt 内容
aliClient.AutoVerifySign([]byte(aliConfig.AlipayPublicCert)) aliClient.AutoVerifySign(aliConfig.AlipayPublicCert)
// 证书内容 // 证书内容
aliClientErr = aliClient.SetCertSnByContent([]byte(aliConfig.AppPublicCert), []byte(aliConfig.AlipayRootCert), []byte(aliConfig.AlipayPublicCert)) aliClientErr = aliClient.SetCertSnByContent(aliConfig.AppPublicCert, aliConfig.AlipayRootCert, aliConfig.AlipayPublicCert)
} }
// GetAliClient 获取已经初始化的支付宝客户端 // GetAliClient 获取已经初始化的支付宝客户端
@ -74,12 +72,12 @@ func ALiH5PayInfo(c context.Context, payOrderRequest PayOrderRequest) (string, e
// 初始化 BodyMap // 初始化 BodyMap
amount := float64(payOrderRequest.Amount) / 100.0 amount := float64(payOrderRequest.Amount) / 100.0
envConfig := config.GetConf()
bm := make(gopay.BodyMap) bm := make(gopay.BodyMap)
bm.Set("out_trade_no", payOrderRequest.OrderId). bm.Set("out_trade_no", payOrderRequest.OrderId).
Set("total_amount", amount). Set("total_amount", amount).
Set("subject", payOrderRequest.Description). Set("subject", payOrderRequest.Description).
Set("notify_url", fmt.Sprintf(envConfig.PayService.Host+payCommon.ALI_NOTIFY_URL_TEST+"%d", payOrderRequest.PayChannelId)) //Set("notify_url", fmt.Sprintf(payCommon.ALI_NOTIFY_URL_TEST+"%d", payOrderRequest.PayChannelId)).
Set("notify_url", fmt.Sprintf(payCommon.ALI_NOTIFY_URL_PROD+"%d", payOrderRequest.PayChannelId))
aliRsp, err := aliClient.TradeWapPay(c, bm) aliRsp, err := aliClient.TradeWapPay(c, bm)
if err != nil { if err != nil {
@ -149,8 +147,8 @@ func ALiOrderQuery(ctx context.Context, aliConfig AliPay, OrderNo string) (PayOr
tradeStateDesc = "未付款交易超时关闭,或支付完成后全额退款" tradeStateDesc = "未付款交易超时关闭,或支付完成后全额退款"
} }
amountTotal, _ := strconv.ParseFloat(aliRsp.Response.TotalAmount, 64) amountTotal, _ := strconv.Atoi(aliRsp.Response.TotalAmount)
payerTotal, _ := strconv.ParseFloat(aliRsp.Response.BuyerPayAmount, 64) payerTotal, _ := strconv.Atoi(aliRsp.Response.BuyerPayAmount)
// 构建数据 // 构建数据
outTradeNo, _ := strconv.Atoi(aliRsp.Response.OutTradeNo) outTradeNo, _ := strconv.Atoi(aliRsp.Response.OutTradeNo)
return PayOrderQueryInfo{ return PayOrderQueryInfo{
@ -177,10 +175,9 @@ func AliRefundOrder(ctx context.Context, orderRefundRequest OrderRefundRequest)
return OrderRefundInfo{}, err return OrderRefundInfo{}, err
} }
// 请求参数 // 请求参数
refundAmount := float64(orderRefundRequest.RefundAmount) / 100.0
bm := make(gopay.BodyMap) bm := make(gopay.BodyMap)
bm.Set("out_trade_no", orderRefundRequest.OrderId). bm.Set("out_trade_no", orderRefundRequest.OrderId).
Set("refund_amount", refundAmount). Set("refund_amount", orderRefundRequest.RefundAmount).
Set("refund_reason", orderRefundRequest.RefundReason). Set("refund_reason", orderRefundRequest.RefundReason).
Set("out_request_no", orderRefundRequest.RefundOrderId) Set("out_request_no", orderRefundRequest.RefundOrderId)
@ -194,15 +191,14 @@ func AliRefundOrder(ctx context.Context, orderRefundRequest OrderRefundRequest)
return OrderRefundInfo{}, err return OrderRefundInfo{}, err
} }
refundFee, _ := strconv.ParseFloat(aliRsp.Response.RefundFee, 64) refundFee, _ := strconv.Atoi(aliRsp.Response.RefundFee)
outTradeNo, _ := strconv.ParseFloat(aliRsp.Response.OutTradeNo, 64) outTradeNo, _ := strconv.Atoi(aliRsp.Response.OutTradeNo)
return OrderRefundInfo{ return OrderRefundInfo{
OutTradeNo: int64(outTradeNo), OutTradeNo: int64(outTradeNo),
TransactionId: aliRsp.Response.TradeNo, TransactionId: aliRsp.Response.TradeNo,
RefundFee: int64(refundFee * 100), RefundFee: int64(refundFee * 100),
RefundOrderId: orderRefundRequest.RefundOrderId, RefundOrderId: orderRefundRequest.RefundOrderId,
RefundStatus: payCommon.PAY_REFUND_STATU_SUCCESS, RefundStatus: payCommon.PAY_REFUND_STATU_SUCCESS,
RefundSuccessTime: aliRsp.Response.GmtRefundPay,
}, nil }, nil
} }
@ -232,7 +228,7 @@ func AliRefundOrderQuery(ctx context.Context, orderRefundQueryRequest OrderRefun
} }
return OrderRefundInfo{}, err return OrderRefundInfo{}, err
} }
refundFee, _ := strconv.ParseFloat(aliRsp.Response.RefundAmount, 64) refundFee, _ := strconv.Atoi(aliRsp.Response.RefundAmount)
outTradeNo, _ := strconv.Atoi(aliRsp.Response.OutTradeNo) outTradeNo, _ := strconv.Atoi(aliRsp.Response.OutTradeNo)
refundOrderId, _ := strconv.Atoi(aliRsp.Response.OutRequestNo) refundOrderId, _ := strconv.Atoi(aliRsp.Response.OutRequestNo)
return OrderRefundInfo{ return OrderRefundInfo{

View File

@ -1,8 +1,8 @@
package payCommon package payCommon
import "PaymentCenter/app/constants/common"
const ( const (
TEST_URL = ""
PROD_URL = ""
// 支付渠道枚举,1微信JSAPI2微信H53微信app4微信Native5微信小程序6支付宝网页&移动应用7支付宝小程序8支付宝JSAPI // 支付渠道枚举,1微信JSAPI2微信H53微信app4微信Native5微信小程序6支付宝网页&移动应用7支付宝小程序8支付宝JSAPI
PAY_CHANNEL_UNKNOWN = 0 PAY_CHANNEL_UNKNOWN = 0
@ -21,10 +21,10 @@ const (
WX_SUCCESS_CODE = 200 // 微信状态码返回成功 WX_SUCCESS_CODE = 200 // 微信状态码返回成功
WX_NOTIFY_URL_TEST = common.FRONT_V1 + "/notify/wx/" // 微信支付回调地址 WX_NOTIFY_URL_TEST = TEST_URL + "/v1/notify/wx/" // 微信支付回调地址
WX_NOTIFY_URL_PROD = common.FRONT_V1 + "/notify/wx/" // 微信支付回调地址 WX_NOTIFY_URL_PROD = PROD_URL + "/v1/notify/wx/" // 微信支付回调地址
ALI_NOTIFY_URL_TEST = common.FRONT_V1 + "/notify/ali/" // 支付宝支付回调地址 ALI_NOTIFY_URL_TEST = TEST_URL + "/v1/notify/ali/" // 支付宝支付回调地址
ALI_NOTIFY_URL_PROD = common.FRONT_V1 + "/notify/ali/" // 支付宝支付回调地址 ALI_NOTIFY_URL_PROD = PROD_URL + "/v1/notify/ali/" // 支付宝支付回调地址
ORDER_NO_TYPE_ORDER_NO = 2 ORDER_NO_TYPE_ORDER_NO = 2

View File

@ -1,13 +1,8 @@
package paymentService package paymentService
import ( import (
"PaymentCenter/app/constants/common"
"PaymentCenter/app/data"
"PaymentCenter/app/models/orderthirdpaylogmodel"
"PaymentCenter/app/models/paychannelmodel"
"PaymentCenter/app/third/paymentService/payCommon" "PaymentCenter/app/third/paymentService/payCommon"
"context" "context"
"encoding/json"
"github.com/qit-team/snow-core/log/logger" "github.com/qit-team/snow-core/log/logger"
"strconv" "strconv"
) )
@ -34,9 +29,9 @@ type WxPay struct {
type AliPay struct { type AliPay struct {
AppId string `json:"app_id"` // 应用ID AppId string `json:"app_id"` // 应用ID
PrivateKey string `json:"private_key"` // 应用私钥 PrivateKey string `json:"private_key"` // 应用私钥
AppPublicCert string `json:"app_public_cert"` // 应用公钥 AppPublicCert []byte `json:"app_public_cert"` // 应用公钥
AlipayRootCert string `json:"alipay_root_cert"` // 支付宝根证书 AlipayRootCert []byte `json:"alipay_root_cert"` // 支付宝根证书
AlipayPublicCert string `json:"alipay_public_cert"` // 支付宝公钥 AlipayPublicCert []byte `json:"alipay_public_cert"` // 支付宝公钥
} }
type AliPayA struct { type AliPayA struct {
@ -54,7 +49,7 @@ type PayOrderResponse struct {
} }
// PaymentService 统一发起支付 // PaymentService 统一发起支付
func PaymentService(c context.Context, payOrderRequest PayOrderRequest) PayOrderResponse { func PaymentService(c context.Context, payOrderRequest PayOrderRequest) (payOrderResponse PayOrderResponse) {
logger.Info(c, "PaymentService 收到支付请求", payOrderRequest) logger.Info(c, "PaymentService 收到支付请求", payOrderRequest)
var err error var err error
var info string var info string
@ -77,20 +72,11 @@ func PaymentService(c context.Context, payOrderRequest PayOrderRequest) PayOrder
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
} }
payOrderResponse := PayOrderResponse{ return PayOrderResponse{
Code: payCommon.PAY_SUCCESS_CODE, Code: payCommon.PAY_SUCCESS_CODE,
ErrorMsg: "", ErrorMsg: "",
Result: info, Result: info,
} }
// 记录日志
go func() {
orderId := payOrderRequest.OrderId
payCallback := info
payParam, _ := json.Marshal(payOrderRequest)
merchantCallback, _ := json.Marshal(payOrderResponse)
saveLog(orderId, common.THIRD_ORDER_TYPE_PAY, payCallback, string(payParam), string(merchantCallback))
}()
return payOrderResponse
} }
type PayOrderQueryRequest struct { type PayOrderQueryRequest struct {
@ -139,21 +125,10 @@ func PayOrderQuery(c context.Context, payOrderQueryRequest PayOrderQueryRequest)
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
} }
return PayOrderQueryResponse{
payOrderQueryResponse := PayOrderQueryResponse{
Code: payCommon.PAY_SUCCESS_CODE, Code: payCommon.PAY_SUCCESS_CODE,
Result: info, Result: info,
} }
// 记录日志
go func() {
orderId := payOrderQueryRequest.OrderId
payCallback, _ := json.Marshal(info)
payParam, _ := json.Marshal(payOrderQueryRequest)
merchantCallback, _ := json.Marshal(payOrderQueryResponse)
saveLog(orderId, common.THIRD_ORDER_TYPE_ORDER_QUERY, string(payCallback), string(payParam), string(merchantCallback))
}()
return payOrderQueryResponse
} }
type OrderRefundRequest struct { type OrderRefundRequest struct {
@ -204,21 +179,10 @@ func OrderRefund(c context.Context, orderRefundRequest OrderRefundRequest) Order
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
} }
return OrderRefundResponse{
orderRefundResponse := OrderRefundResponse{
Code: payCommon.PAY_SUCCESS_CODE, Code: payCommon.PAY_SUCCESS_CODE,
Result: info, Result: info,
} }
// 记录日志
go func() {
orderId := orderRefundRequest.OrderId
payCallback, _ := json.Marshal(info)
payParam, _ := json.Marshal(orderRefundRequest)
merchantCallback, _ := json.Marshal(orderRefundResponse)
saveLog(orderId, common.THIRD_ORDER_TYPE_REFUND, string(payCallback), string(payParam), string(merchantCallback))
}()
return orderRefundResponse
} }
type OrderRefundQueryRequest struct { type OrderRefundQueryRequest struct {
@ -256,21 +220,10 @@ func OrderRefundQuery(c context.Context, orderRefundQueryRequest OrderRefundQuer
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
} }
orderRefundQueryResponse := OrderRefundQueryResponse{ return OrderRefundQueryResponse{
Code: payCommon.PAY_SUCCESS_CODE, Code: payCommon.PAY_SUCCESS_CODE,
Result: info, Result: info,
} }
// 记录日志
go func() {
orderId := orderRefundQueryRequest.OrderId
payCallback, _ := json.Marshal(info)
payParam, _ := json.Marshal(orderRefundQueryRequest)
merchantCallback, _ := json.Marshal(orderRefundQueryResponse)
saveLog(orderId, common.THIRD_ORDER_TYPE_REFUND_QUERY, string(payCallback), string(payParam), string(merchantCallback))
}()
return orderRefundQueryResponse
} }
type OrderCloseRequest struct { type OrderCloseRequest struct {
@ -313,35 +266,8 @@ func OrderClose(c context.Context, orderCloseRequest OrderCloseRequest) OrderClo
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
} }
orderCloseResponse := OrderCloseResponse{ return OrderCloseResponse{
Code: payCommon.PAY_SUCCESS_CODE, Code: payCommon.PAY_SUCCESS_CODE,
Result: info, Result: info,
} }
// 记录日志
go func() {
orderId := orderCloseRequest.OrderId
payCallback, _ := json.Marshal(info)
payParam, _ := json.Marshal(orderCloseRequest)
merchantCallback, _ := json.Marshal(orderCloseResponse)
saveLog(orderId, common.THIRD_ORDER_TYPE_CLOSE, string(payCallback), string(payParam), string(merchantCallback))
}()
return orderCloseResponse
}
// saveLog 记录操作日志
func saveLog(orderId int64, OType int, payCallback string, PayParam string, MerchantCallback string) {
thirdRepo := data.NewOrderThirdPayLogRepo(paychannelmodel.GetInstance().GetDb())
log := orderthirdpaylogmodel.OrderThirdPayLog{
OrderId: orderId,
PayCallback: payCallback,
Status: 0,
PayParam: PayParam,
MerchantCallback: MerchantCallback,
Type: OType,
}
_, err := thirdRepo.OrderThirdPayLogInsertOne(&log)
if err != nil {
return
}
} }

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,6 @@ package paymentService
import ( import (
"PaymentCenter/app/third/paymentService/payCommon" "PaymentCenter/app/third/paymentService/payCommon"
"PaymentCenter/config"
"context" "context"
"errors" "errors"
"fmt" "fmt"
@ -68,14 +67,14 @@ func WxH5PayInfo(c context.Context, payOrderRequest PayOrderRequest) (string, er
} }
expire := time.Now().Add(10 * time.Minute).Format(time.RFC3339) expire := time.Now().Add(10 * time.Minute).Format(time.RFC3339)
// 初始化 BodyMap // 初始化 BodyMap
envConfig := config.GetConf()
bm := make(gopay.BodyMap) bm := make(gopay.BodyMap)
bm.Set("appid", payOrderRequest.Wx.AppId). bm.Set("appid", payOrderRequest.Wx.AppId).
Set("mchid", payOrderRequest.Wx.MchId). Set("mchid", payOrderRequest.Wx.MchId).
Set("description", payOrderRequest.Description). Set("description", payOrderRequest.Description).
Set("out_trade_no", strconv.FormatInt(payOrderRequest.OrderId, 10)). Set("out_trade_no", payOrderRequest.OrderId).
Set("time_expire", expire). Set("time_expire", expire).
Set("notify_url", fmt.Sprintf(envConfig.PayService.Host+payCommon.WX_NOTIFY_URL_TEST+"%d", payOrderRequest.PayChannelId)). //Set("notify_url", fmt.Sprintf(payCommon.WX_NOTIFY_URL_TEST+"%d", payOrderRequest.PayChannelId)).
Set("notify_url", fmt.Sprintf(payCommon.WX_NOTIFY_URL_PROD+"%d", payOrderRequest.PayChannelId)).
SetBodyMap("amount", func(bm gopay.BodyMap) { SetBodyMap("amount", func(bm gopay.BodyMap) {
bm.Set("total", payOrderRequest.Amount). bm.Set("total", payOrderRequest.Amount).
Set("currency", "CNY") Set("currency", "CNY")
@ -199,10 +198,10 @@ func WxOrderRefund(ctx context.Context, orderRefundRequest OrderRefundRequest) (
} }
// 初始化 BodyMap // 初始化 BodyMap
bm := make(gopay.BodyMap) bm := make(gopay.BodyMap)
bm.Set("out_trade_no", strconv.FormatInt(orderRefundRequest.OrderId, 10)). bm.Set("out_trade_no", orderRefundRequest.OrderId).
Set("sign_type", "MD5"). Set("sign_type", "MD5").
// 必填 退款订单号(程序员定义的) // 必填 退款订单号(程序员定义的)
Set("out_refund_no", strconv.FormatInt(orderRefundRequest.RefundOrderId, 10)). Set("out_refund_no", orderRefundRequest.RefundOrderId).
// 选填 退款描述 // 选填 退款描述
Set("reason", orderRefundRequest.RefundReason). Set("reason", orderRefundRequest.RefundReason).
SetBodyMap("amount", func(bm gopay.BodyMap) { SetBodyMap("amount", func(bm gopay.BodyMap) {
@ -298,7 +297,7 @@ func WxCloseOrder(ctx context.Context, orderCloseRequest OrderCloseRequest) (Ord
if err != nil { if err != nil {
return OrderCloseInfo{}, err return OrderCloseInfo{}, err
} }
wxRsp, err := wxClient.V3TransactionCloseOrder(ctx, strconv.FormatInt(orderCloseRequest.OrderId, 10)) wxRsp, err := wxClient.V3TransactionCloseOrder(ctx, "FY160932049419637602")
if err != nil { if err != nil {
return OrderCloseInfo{}, err return OrderCloseInfo{}, err
} }

View File

@ -450,15 +450,3 @@ func SliceInStr(s string, slice []string) bool {
} }
return false 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
}
}

View File

@ -39,7 +39,6 @@ type Config struct {
AliOss AliOss `toml:"AliOss"` AliOss AliOss `toml:"AliOss"`
AdminGate []string `toml:"AdminGate"` AdminGate []string `toml:"AdminGate"`
CronConfig CronConfig `toml:"CronConfig"` CronConfig CronConfig `toml:"CronConfig"`
PayService PayService `toml:"PayService"`
} }
type AliOss struct { type AliOss struct {
@ -92,11 +91,6 @@ type CronConfig struct {
ConcurrentNumber int `toml:"ConcurrentNumber"` ConcurrentNumber int `toml:"ConcurrentNumber"`
} }
type PayService struct {
Host string `toml:"Host"`
IsProd bool `toml:"IsProd"`
}
func newConfig() *Config { func newConfig() *Config {
return new(Config) return new(Config)
} }