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/data"
"PaymentCenter/app/http/entities"
"PaymentCenter/app/http/entities/backend"
"PaymentCenter/app/models/ordersmodel"
"PaymentCenter/app/models/orderthirdpaylogmodel"
"PaymentCenter/app/third/paymentService"
@ -29,60 +28,20 @@ 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{"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)
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)
if err != nil {
utils.Log(nil, "关闭订单,查询未支付订单失败", err)
} 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:
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)
}
} else if total > 0 {
orderIds := make([]int64, 0)
for _, v := range order {
orderIds = append(orderIds, v.Id)
}
// 修改订单状态为关闭
cond = builder.NewCond()
@ -93,7 +52,7 @@ func closeOrder() {
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())
// 拼接条件
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)
@ -130,32 +90,13 @@ func queryOrder() {
query := paymentService.PayOrderQueryRequest{
OrderId: orderInfo.Id,
}
switch utils.PayType(orderInfo.ChannelType) {
case common.PAY_CHANNLE_TYPE_WECHAT:
wx := backend.WechatPayChannel{}
_ = json.Unmarshal([]byte(orderInfo.ExtJson), &wx)
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)
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{}
case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI:
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
_ = json.Unmarshal([]byte(orderInfo.ExtJson), &query.Ali)
}
// 发起查询
@ -184,7 +125,7 @@ func queryOrder() {
// 更新订单状态 todo
orderUpdate := ordersmodel.Orders{
Id: orderInfo.Id,
Status: status,
Status: int32(status),
}
session := ordersmodel.GetInstance().GetDb().NewSession()
@ -211,12 +152,11 @@ func queryOrder() {
}
// 写入日志
body, _ := json.Marshal(result)
log := orderthirdpaylogmodel.OrderThirdPayLog{
OrderId: orderInfo.Id,
PayCallback: string(body),
PayCallback: "",
Status: 0,
PayParam: "",
MerchantParam: "",
MerchantCallback: "",
}
_, err = orderLogRepo.OrderThirdPayLogInsertOne(&log)

View File

@ -4,7 +4,7 @@ const (
TOKEN_PRE = "player_token_"
TOKEN_Admin = "Admin_token_"
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
PAY_CHANNEL_UNKNOWN = 0
@ -29,21 +29,11 @@ const (
ORDER_STATUS_FAILED = 4
ORDER_STATUS_CLOSE = 5
STATUS_ENABLE = 1
STATUS_DISABLED = 2
STATUS_ENABLE int32 = 1
STATUS_DISABLED int32 = 2
ORDER_TYPE_PAY = 1
ORDER_TYPE_REFUND = 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 // 支付回调
ORDER_TYPE_PAY int32 = 1
ORDER_TYPE_REFUND int32 = 2
)
var PayChannelList = map[int]string{
@ -57,7 +47,7 @@ var PayChannelList = map[int]string{
PAY_CHANNEL_ALIPAY_JSAPI: "支付宝JSAPI",
}
var OrderTypeList = map[int]string{
var OrderTypeList = map[int32]string{
ORDER_TYPE_PAY: "付款",
ORDER_TYPE_REFUND: "退款",
}

View File

@ -84,7 +84,6 @@ var MsgZH = map[int]string{
AppDisabled: "app通道关闭",
AppIpNotAllow: "ip不在白名单内",
AppDecryptDataDiscrepancy: "解密数据不一致",
SystemError: "系统错误",
AppRsaDecryptKeyNotFound: "密匙缺失无法进行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").
Join("left", "merchant", "merchant.id = orders.merchant_id").
Join("left", "pay_channel", "pay_channel.id = orders.pay_channel_id")
return repo.Desc("orders.create_time").FindAndCount(orderList)
Join("left", "pay_channel", "pay_channel.id = orders.pay_id")
return repo.Desc("create_time").FindAndCount(orderList)
}
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 {
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)
}

View File

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

View File

@ -12,27 +12,27 @@ import (
)
type OrderListRequest struct {
Id int64 `json:"id" form:"id"`
MerchantId int64 `json:"merchant_id" form:"merchant_id"`
PayChannelId int64 `json:"pay_channel_id" form:"pay_channel_id"`
AppId int64 `json:"app_id" form:"app_id"`
OutTreadNo string `json:"out_tread_no" form:"out_tread_no"`
Status int `json:"status" form:"status"`
OrderType int `json:"order_type" form:"order_type"`
StartTime string `json:"start_time" form:"start_time"`
EndTime string `json:"end_time" form:"end_time"`
Id int64 `json:"id" form:"id"`
MerchantId int64 `json:"merchant_id" form:"merchant_id"`
PayId int64 `json:"pay_id" form:"pay_id"`
AppId int64 `json:"app_id" form:"app_id"`
MerchantOrderId string `json:"merchant_order_id" form:"merchant_order_id"`
Status int `json:"status" form:"status"`
OrderType int `json:"order_type" form:"order_type"`
StartTime string `json:"start_time" form:"start_time"`
EndTime string `json:"end_time" form:"end_time"`
entities.PageRequest
}
type OrderList struct {
Id int64 `json:"id"`
MerchantId int64 `json:"merchant_id"`
PayChannelId int64 `json:"pay_channel_id"`
AppId int64 `json:"app_id"`
OutTreadNo string `json:"out_tread_no"`
Status int `json:"status"`
OrderType int `json:"order_type"`
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Id int64 `json:"id"`
MerchantId int64 `json:"merchant_id"`
PayId int64 `json:"pay_id"`
AppId int64 `json:"app_id"`
MerchantOrderId string `json:"merchant_order_id"`
Status int `json:"status"`
OrderType int `json:"order_type"`
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
entities.PageRequest
}
@ -54,9 +54,9 @@ func (o *OrderListRequest) ValidateRequest() (r OrderList, err error) {
r.Id = o.Id
r.MerchantId = o.MerchantId
r.PayChannelId = o.PayChannelId
r.PayId = o.PayId
r.AppId = o.AppId
r.OutTreadNo = o.OutTreadNo
r.MerchantOrderId = o.MerchantOrderId
r.Status = o.Status
r.OrderType = o.OrderType
r.PageRequest = o.PageRequest
@ -65,21 +65,24 @@ func (o *OrderListRequest) ValidateRequest() (r OrderList, err error) {
}
type OrdersResponse struct {
Id int64 `json:"id"`
MerchantId int64 `json:"merchant_id"`
PayChannelId int64 `json:"pay_channel_id"`
AppId int64 `json:"app_id"`
OutTreadNo string `json:"out_tread_no"`
Status int `json:"status"`
OrderType int `json:"order_type"`
Amount int `json:"amount"`
PayerTotal int `json:"payer_total"`
ExtJson string `json:"ext_json"`
CreateTime string `json:"create_time"`
UpdateTime string `json:"update_time"`
MerchantName string `json:"merchant_name"`
PayName string `json:"pay_name"`
AppName string `json:"app_name"`
Id int64 `json:"id"`
MerchantId int64 `json:"merchant_id"`
PayChannelId int64 `json:"pay_channel_id"`
AppId int64 `json:"app_id"`
OutTreadNo string `json:"out_tread_no"`
Status int32 `json:"status"`
OrderType int32 `json:"order_type"`
Amount int `json:"amount"`
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"`
CreateTime string `json:"create_time"`
UpdateTime string `json:"update_time"`
MerchantName string `json:"merchant_name"`
PayName string `json:"pay_name"`
AppName string `json:"app_name"`
}
func (o *OrdersResponse) ResponseFromDb(db ordersmodel.OrdersBackendList) {
@ -91,7 +94,6 @@ func (o *OrdersResponse) ResponseFromDb(db ordersmodel.OrdersBackendList) {
o.Status = db.Status
o.OrderType = db.OrderType
o.Amount = db.Amount
o.PayerTotal = db.PayerTotal
o.ExtJson = db.ExtJson
o.CreateTime = db.CreateTime.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"`
MerchantResponse string `json:"merchant_response"`
CreateTime string `json:"create_time"`
Status int `json:"status"`
Status int32 `json:"status"`
}
func (o *OrderRequestLogResponse) ResponseFromDb(db orderrequestlogmodel.OrderRequestLog) {
@ -133,7 +135,7 @@ type OrderThirdLogResponse struct {
CreateTime string `json:"create_time"`
PayCallback string `json:"pay_callback"`
Status int `json:"status"`
PayParam string `json:"pay_param"`
MerchantParam string `json:"merchant_param"`
MerchantCallback string `json:"merchant_callback"`
}
@ -142,7 +144,7 @@ func (o *OrderThirdLogResponse) ResponseFromDb(db orderthirdpaylogmodel.OrderThi
o.OrderId = db.OrderId
o.PayCallback = db.PayCallback
o.Status = db.Status
o.PayParam = db.PayParam
o.MerchantParam = db.MerchantParam
o.MerchantCallback = db.MerchantCallback
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"`
ExpireTime string `json:"expire_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"`
}
@ -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:
_ = json.Unmarshal([]byte(db.ExtJson), &p.WechatPayChannel)
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
AppId string `json:"app_id" validate:"required" label:"应用appId"`
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"`
}
@ -55,7 +55,7 @@ type WechatPayChannel struct {
PrivateKey string `json:"private_key"` // 私钥 apiclient_key.pem 读取后的内容
}
type AliPayChannel struct {
type AliPayPayChannel struct {
PrivateKey string `json:"private_key"` // 应用私钥
AppPublicCert string `json:"app_public_cert"` // 应用公钥
AlipayRootCert string `json:"alipay_root_cert"` // 支付宝根证书
@ -78,7 +78,7 @@ func (p *PayChannelCreateRequest) RequestToDb() (db paychannelmodel.PayChannel,
b, _ := json.Marshal(p.WechatPayChannel)
db.ExtJson = string(b)
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)
default:
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
AppId string `json:"app_id" validate:"required" label:"应用appId"`
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"`
}
@ -118,7 +118,7 @@ func (p PayChannelUpdateRequest) RequestToDb() (db paychannelmodel.PayChannel, e
b, _ := json.Marshal(p.WechatPayChannel)
db.ExtJson = string(b)
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)
default:
err = errors.New("支付渠道类型错误")

View File

@ -15,7 +15,7 @@ type PayReqs struct {
ApiCommonBody
PayChannelId int64 `json:"pay_channel_id" 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:"支付金额,单位分"`
ExtJson string `json:"ext_json" label:"扩展参数"`
Desc string `json:"desc" validate:"max=100" label:"商品描述"`

View File

@ -20,7 +20,7 @@ type OrderRequestLog struct {
MerchantResponse string `xorm:"'merchant_response' JSON"`
CreateTime time.Time `xorm:"'create_time' datetime created"`
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)"`
AppId int64 `xorm:"'app_id' bigint(20)"`
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)"`
PayerTotal int `xorm:"'payer_total' int(11)"`
ExtJson string `xorm:"'ext_json' varchar(1024)"`
Desc string `xorm:"'desc' varchar(100)"`
CreateTime time.Time `xorm:"'create_time' datetime created"`
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"`
}

View File

@ -15,11 +15,10 @@ var (
type OrderThirdPayLog struct {
Id int64
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"`
PayParam string `xorm:"'pay_param' JSON"`
MerchantCallback string `xorm:"'merchant_callback' JSON"`
Type int `xorm:"'type' TINYINT"`
MerchantParam string `xorm:"'merchant_param' varchar(255)"`
MerchantCallback string `xorm:"'merchant_callback' varchar(255)"`
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 {
conn = conn.And(builder.Eq{"merchant_id": req.MerchantId})
}
if req.PayChannelId > 0 {
conn = conn.And(builder.Eq{"pay_channel_id": req.PayChannelId})
if req.PayId > 0 {
conn = conn.And(builder.Eq{"pay_id": req.PayId})
}
if req.AppId > 0 {
conn = conn.And(builder.Eq{"app_id": req.AppId})
}
if req.OutTreadNo != "" {
conn = conn.And(builder.Like{"out_tread_no", req.OutTreadNo})
if req.MerchantOrderId != "" {
conn = conn.And(builder.Like{"merchant_order_id", req.MerchantOrderId})
}
if req.Status > 0 {
conn = conn.And(builder.Eq{"status": req.Status})

View File

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

View File

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

View File

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

View File

@ -1,13 +1,8 @@
package paymentService
import (
"PaymentCenter/app/constants/common"
"PaymentCenter/app/data"
"PaymentCenter/app/models/orderthirdpaylogmodel"
"PaymentCenter/app/models/paychannelmodel"
"PaymentCenter/app/third/paymentService/payCommon"
"context"
"encoding/json"
"github.com/qit-team/snow-core/log/logger"
"strconv"
)
@ -34,9 +29,9 @@ type WxPay struct {
type AliPay struct {
AppId string `json:"app_id"` // 应用ID
PrivateKey string `json:"private_key"` // 应用私钥
AppPublicCert string `json:"app_public_cert"` // 应用公钥
AlipayRootCert string `json:"alipay_root_cert"` // 支付宝根证书
AlipayPublicCert string `json:"alipay_public_cert"` // 支付宝公钥
AppPublicCert []byte `json:"app_public_cert"` // 应用公钥
AlipayRootCert []byte `json:"alipay_root_cert"` // 支付宝根证书
AlipayPublicCert []byte `json:"alipay_public_cert"` // 支付宝公钥
}
type AliPayA struct {
@ -54,7 +49,7 @@ type PayOrderResponse struct {
}
// PaymentService 统一发起支付
func PaymentService(c context.Context, payOrderRequest PayOrderRequest) PayOrderResponse {
func PaymentService(c context.Context, payOrderRequest PayOrderRequest) (payOrderResponse PayOrderResponse) {
logger.Info(c, "PaymentService 收到支付请求", payOrderRequest)
var err error
var info string
@ -77,20 +72,11 @@ func PaymentService(c context.Context, payOrderRequest PayOrderRequest) PayOrder
ErrorMsg: err.Error(),
}
}
payOrderResponse := PayOrderResponse{
return PayOrderResponse{
Code: payCommon.PAY_SUCCESS_CODE,
ErrorMsg: "",
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 {
@ -139,21 +125,10 @@ func PayOrderQuery(c context.Context, payOrderQueryRequest PayOrderQueryRequest)
ErrorMsg: err.Error(),
}
}
payOrderQueryResponse := PayOrderQueryResponse{
return PayOrderQueryResponse{
Code: payCommon.PAY_SUCCESS_CODE,
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 {
@ -204,21 +179,10 @@ func OrderRefund(c context.Context, orderRefundRequest OrderRefundRequest) Order
ErrorMsg: err.Error(),
}
}
orderRefundResponse := OrderRefundResponse{
return OrderRefundResponse{
Code: payCommon.PAY_SUCCESS_CODE,
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 {
@ -256,21 +220,10 @@ func OrderRefundQuery(c context.Context, orderRefundQueryRequest OrderRefundQuer
ErrorMsg: err.Error(),
}
}
orderRefundQueryResponse := OrderRefundQueryResponse{
return OrderRefundQueryResponse{
Code: payCommon.PAY_SUCCESS_CODE,
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 {
@ -313,35 +266,8 @@ func OrderClose(c context.Context, orderCloseRequest OrderCloseRequest) OrderClo
ErrorMsg: err.Error(),
}
}
orderCloseResponse := OrderCloseResponse{
return OrderCloseResponse{
Code: payCommon.PAY_SUCCESS_CODE,
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 (
"PaymentCenter/app/third/paymentService/payCommon"
"PaymentCenter/config"
"context"
"errors"
"fmt"
@ -68,14 +67,14 @@ func WxH5PayInfo(c context.Context, payOrderRequest PayOrderRequest) (string, er
}
expire := time.Now().Add(10 * time.Minute).Format(time.RFC3339)
// 初始化 BodyMap
envConfig := config.GetConf()
bm := make(gopay.BodyMap)
bm.Set("appid", payOrderRequest.Wx.AppId).
Set("mchid", payOrderRequest.Wx.MchId).
Set("description", payOrderRequest.Description).
Set("out_trade_no", strconv.FormatInt(payOrderRequest.OrderId, 10)).
Set("out_trade_no", payOrderRequest.OrderId).
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) {
bm.Set("total", payOrderRequest.Amount).
Set("currency", "CNY")
@ -199,10 +198,10 @@ func WxOrderRefund(ctx context.Context, orderRefundRequest OrderRefundRequest) (
}
// 初始化 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("out_refund_no", strconv.FormatInt(orderRefundRequest.RefundOrderId, 10)).
Set("out_refund_no", orderRefundRequest.RefundOrderId).
// 选填 退款描述
Set("reason", orderRefundRequest.RefundReason).
SetBodyMap("amount", func(bm gopay.BodyMap) {
@ -298,7 +297,7 @@ func WxCloseOrder(ctx context.Context, orderCloseRequest OrderCloseRequest) (Ord
if err != nil {
return OrderCloseInfo{}, err
}
wxRsp, err := wxClient.V3TransactionCloseOrder(ctx, strconv.FormatInt(orderCloseRequest.OrderId, 10))
wxRsp, err := wxClient.V3TransactionCloseOrder(ctx, "FY160932049419637602")
if err != nil {
return OrderCloseInfo{}, err
}

View File

@ -450,15 +450,3 @@ 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
}
}

View File

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