<feat>支付接口
This commit is contained in:
parent
548491c1f1
commit
943c3401c6
|
@ -125,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()
|
||||||
|
|
|
@ -56,8 +56,11 @@ const (
|
||||||
OrdersNotFound = 1401
|
OrdersNotFound = 1401
|
||||||
OrdersExist = 1402
|
OrdersExist = 1402
|
||||||
OrderTypeNotFount = 1403
|
OrderTypeNotFount = 1403
|
||||||
//网页支付
|
|
||||||
RequestLogErrors = 1500
|
//请求日志
|
||||||
|
RequestLogErrors = 1500
|
||||||
|
RequestLogNotFound = 1501
|
||||||
|
RequestResponseValid = 1502
|
||||||
)
|
)
|
||||||
|
|
||||||
var MsgEN = map[int]string{
|
var MsgEN = map[int]string{
|
||||||
|
@ -101,7 +104,9 @@ var MsgZH = map[int]string{
|
||||||
PayChannelNotBuild: "支付方式尚未开通",
|
PayChannelNotBuild: "支付方式尚未开通",
|
||||||
PayChannelExtJsonError: "支付方式扩展参数错误",
|
PayChannelExtJsonError: "支付方式扩展参数错误",
|
||||||
|
|
||||||
RequestLogErrors: "请求日志错误",
|
RequestLogErrors: "请求日志错误",
|
||||||
|
RequestLogNotFound: "未找到日志信息",
|
||||||
|
RequestResponseValid: "上游返回格式无效",
|
||||||
|
|
||||||
OrdersNotFound: "未找到订单",
|
OrdersNotFound: "未找到订单",
|
||||||
OrdersExist: "订单已存在",
|
OrdersExist: "订单已存在",
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
package controllers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"PaymentCenter/app/constants/common"
|
||||||
|
"PaymentCenter/app/constants/errorcode"
|
||||||
|
"PaymentCenter/app/models/orderrequestlogmodel"
|
||||||
|
"PaymentCenter/app/services"
|
||||||
|
"PaymentCenter/app/utils"
|
||||||
|
"PaymentCenter/config"
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ApiRes(c *gin.Context, data interface{}, code int, msg ...string) {
|
||||||
|
var log_id int64
|
||||||
|
message := ""
|
||||||
|
if utils.IsNil(data) {
|
||||||
|
data = struct{}{}
|
||||||
|
}
|
||||||
|
if len(msg) > 0 {
|
||||||
|
message = msg[0]
|
||||||
|
} else {
|
||||||
|
message = errorcode.GetMsg(code, "")
|
||||||
|
}
|
||||||
|
log, exists := GetApiLogId(c)
|
||||||
|
if exists {
|
||||||
|
log_id = log.(int64)
|
||||||
|
dataByte, _ := json.Marshal(data)
|
||||||
|
status := common.STATUS_ENABLE
|
||||||
|
if code == errorcode.Success {
|
||||||
|
status = common.STATUS_DISABLED
|
||||||
|
}
|
||||||
|
services.RequestLogUpdate(&orderrequestlogmodel.OrderRequestLog{
|
||||||
|
Id: log_id,
|
||||||
|
MerchantResponse: string(dataByte),
|
||||||
|
Status: status,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if code == errorcode.Success {
|
||||||
|
ApiSuccess(c, data, log_id, message)
|
||||||
|
} else {
|
||||||
|
ApiError(c, code, log_id, message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ApiSuccess(c *gin.Context, data interface{}, log_id int64, messageSlice ...string) {
|
||||||
|
var message string
|
||||||
|
if len(messageSlice) > 0 {
|
||||||
|
message = messageSlice[0]
|
||||||
|
}
|
||||||
|
if message == "" {
|
||||||
|
message = errorcode.GetMsg(errorcode.Success, c.GetHeader("local"))
|
||||||
|
}
|
||||||
|
if config.GetConf().Env == "production" {
|
||||||
|
c.String(http.StatusOK, EncriptJson(gin.H{
|
||||||
|
"code": errorcode.Success,
|
||||||
|
"message": message,
|
||||||
|
"data": data,
|
||||||
|
"trace_id": log_id,
|
||||||
|
}))
|
||||||
|
} else {
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code": errorcode.Success,
|
||||||
|
"message": message,
|
||||||
|
"data": data,
|
||||||
|
"trace_id": log_id,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Abort()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 失败时返回
|
||||||
|
*/
|
||||||
|
func ApiError(c *gin.Context, code int, log_id int64, msg ...string) {
|
||||||
|
message := ""
|
||||||
|
if len(msg) > 0 {
|
||||||
|
message = msg[0]
|
||||||
|
} else {
|
||||||
|
message = errorcode.GetMsg(code, "")
|
||||||
|
}
|
||||||
|
if config.GetConf().Env == "production" {
|
||||||
|
c.String(http.StatusOK, EncriptJson(gin.H{
|
||||||
|
"code": code,
|
||||||
|
"message": message,
|
||||||
|
"data": make(map[string]string),
|
||||||
|
"trace_id": log_id,
|
||||||
|
}))
|
||||||
|
} else {
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"code": code,
|
||||||
|
"message": message,
|
||||||
|
"data": make(map[string]string),
|
||||||
|
"trace_id": log_id,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Abort()
|
||||||
|
}
|
|
@ -200,6 +200,11 @@ func GetAppCheckInfo(c *gin.Context) interface{} {
|
||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetApiLogId(c *gin.Context) (interface{}, bool) {
|
||||||
|
request, exists := c.Get("log")
|
||||||
|
return request, exists
|
||||||
|
}
|
||||||
|
|
||||||
func HandRes(c *gin.Context, data interface{}, err error) {
|
func HandRes(c *gin.Context, data interface{}, err error) {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
Success(c, data, "")
|
Success(c, data, "")
|
||||||
|
|
|
@ -1,16 +1,32 @@
|
||||||
package front
|
package front
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"PaymentCenter/app/constants/errorcode"
|
||||||
"PaymentCenter/app/http/controllers"
|
"PaymentCenter/app/http/controllers"
|
||||||
"PaymentCenter/app/http/entities/front"
|
"PaymentCenter/app/http/entities/front"
|
||||||
"PaymentCenter/app/services"
|
"PaymentCenter/app/services"
|
||||||
|
"PaymentCenter/app/services/thirdpay"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
func WebPay(c *gin.Context) {
|
func Pay(c *gin.Context) {
|
||||||
req := controllers.GetRequest(c).(*front.PayWebReqs)
|
req := controllers.GetRequest(c).(*front.PayReqs)
|
||||||
appCheckInfo := controllers.GetAppCheckInfo(c).(*services.AppCheck)
|
appCheckInfo := controllers.GetAppCheckInfo(c).(*services.AppCheck)
|
||||||
code := services.ThirdPayWeb(c.Request.Context(), req, appCheckInfo, c.ClientIP())
|
check := thirdpay.ThirdPayCheck(c.Request.Context(), req, appCheckInfo, c.ClientIP())
|
||||||
controllers.ErrWithCode(c, code)
|
if check.CheckCode != errorcode.Success {
|
||||||
|
if check.CheckCode == errorcode.OrdersExist {
|
||||||
|
//订单已存在,直接返回订单信息
|
||||||
|
controllers.ApiRes(c, thirdpay.PayCallBack(check.OldOrder, false), errorcode.Success)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
controllers.ApiRes(c, nil, check.CheckCode)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
payInfo := thirdpay.ThirdPayWeb(check)
|
||||||
|
if payInfo.PayCode != errorcode.Success {
|
||||||
|
controllers.ApiRes(c, nil, payInfo.PayCode)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
controllers.ApiRes(c, thirdpay.PayCallBack(payInfo.Order, true), errorcode.Success)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,8 +70,8 @@ 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"`
|
||||||
IpAddress string `json:"ip_address"`
|
IpAddress string `json:"ip_address"`
|
||||||
MerchantRequest string `json:"merchant_request"`
|
MerchantRequest string `json:"merchant_request"`
|
||||||
|
@ -110,17 +110,18 @@ type OrderLogsListRequest struct {
|
||||||
type OrderRequestLogResponse struct {
|
type OrderRequestLogResponse struct {
|
||||||
Id int64 `json:"id"`
|
Id int64 `json:"id"`
|
||||||
IpAddress string `json:"ip_address"`
|
IpAddress string `json:"ip_address"`
|
||||||
OrderId int64 `json:"order_id"`
|
Url string `json:"url"`
|
||||||
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) {
|
||||||
o.Id = db.Id
|
o.Id = db.Id
|
||||||
o.OrderId = db.OrderId
|
|
||||||
o.IpAddress = db.IpAddress
|
o.IpAddress = db.IpAddress
|
||||||
|
o.Url = db.URL
|
||||||
o.Status = db.Status
|
o.Status = db.Status
|
||||||
o.MerchantRequest = db.MerchantRequest
|
o.MerchantRequest = db.MerchantRequest
|
||||||
o.MerchantResponse = db.MerchantResponse
|
o.MerchantResponse = db.MerchantResponse
|
||||||
|
@ -128,8 +129,9 @@ func (o *OrderRequestLogResponse) ResponseFromDb(db orderrequestlogmodel.OrderRe
|
||||||
}
|
}
|
||||||
|
|
||||||
type OrderThirdLogResponse struct {
|
type OrderThirdLogResponse struct {
|
||||||
Id int64 `json:"id"`
|
Id int64 `json:"id"`
|
||||||
OrderId int64 `json:"order_id"`
|
OrderId int64 `json:"order_id"`
|
||||||
|
|
||||||
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"`
|
||||||
|
|
|
@ -11,7 +11,7 @@ type RequestBody struct {
|
||||||
Data string `json:"data" validate:"required"`
|
Data string `json:"data" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PayWebReqs struct {
|
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:"外侧商户订单号"`
|
||||||
|
@ -20,3 +20,9 @@ type PayWebReqs struct {
|
||||||
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:"商品描述"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OrderApiResp struct {
|
||||||
|
Code int
|
||||||
|
Msg string
|
||||||
|
Data interface{}
|
||||||
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"PaymentCenter/app/services/apicrypt"
|
"PaymentCenter/app/services/apicrypt"
|
||||||
"PaymentCenter/app/utils"
|
"PaymentCenter/app/utils"
|
||||||
"PaymentCenter/config"
|
"PaymentCenter/config"
|
||||||
|
"encoding/json"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
@ -104,10 +105,11 @@ func ValidateRequest() gin.HandlerFunc {
|
||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
var path = c.FullPath()
|
var path = c.FullPath()
|
||||||
var handler func() interface{}
|
var handler func() interface{}
|
||||||
|
|
||||||
if strings.Index(path, "admin") >= 0 {
|
if strings.Index(path, "admin") >= 0 {
|
||||||
handler = requestmapping.BackendRequestMap[path]
|
handler = requestmapping.BackendRequestMap[path]
|
||||||
} else {
|
} else {
|
||||||
handler = requestmapping.FrontRequest()
|
handler = requestmapping.FrontRequestMapBeforeDecrypt[path]
|
||||||
}
|
}
|
||||||
if handler == nil {
|
if handler == nil {
|
||||||
utils.Log(c, "path", path)
|
utils.Log(c, "path", path)
|
||||||
|
@ -133,40 +135,45 @@ func ValidatePayRequest() gin.HandlerFunc {
|
||||||
var handler func() interface{}
|
var handler func() interface{}
|
||||||
requestData, err := utils.SonicApiDataToStruct(controllers.GetRequest(c), &front.RequestBody{})
|
requestData, err := utils.SonicApiDataToStruct(controllers.GetRequest(c), &front.RequestBody{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
controllers.ErrWithCode(c, errorcode.ParamError)
|
controllers.ApiRes(c, nil, errorcode.ParamError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
requestDataStruct := requestData.(*front.RequestBody)
|
requestDataStruct := requestData.(*front.RequestBody)
|
||||||
|
|
||||||
//判断时间
|
//判断时间
|
||||||
//now := time.Now().UnixNano() / 1000000
|
//now := time.Now().UnixNano() / 1000000
|
||||||
//if comStruct.Timestamp > now || (config.GetConf().TimeOut != 0 && (now-comStruct.Timestamp) > config.GetConf().TimeOut) {
|
//if requestDataStruct.Timestamp > now || (config.GetConf().TimeOut != 0 && (now-requestDataStruct.Timestamp) > config.GetConf().TimeOut) {
|
||||||
// controllers.ErrWithCode(c, errorcode.RequestTimeOut)
|
// controllers.ApiRes(c, nil, errorcode.RequestTimeOut)
|
||||||
// return
|
// return
|
||||||
//}
|
//}
|
||||||
//获取app信息
|
//获取app信息
|
||||||
appCheck := services.AppGetAndCheck(&services.AppCheck{
|
appCheck := services.GetAppCheck(requestDataStruct.AppId, c.ClientIP())
|
||||||
AppId: requestDataStruct.AppId,
|
//存入请求记录
|
||||||
Ip: c.ClientIP(),
|
|
||||||
Code: errorcode.Success,
|
|
||||||
})
|
|
||||||
if appCheck.Code != errorcode.Success {
|
if appCheck.Code != errorcode.Success {
|
||||||
controllers.ErrWithCode(c, appCheck.Code)
|
controllers.ApiRes(c, nil, appCheck.Code)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//解密
|
//解密
|
||||||
cryptFunc := appCheck.Crypt()
|
cryptFunc := appCheck.Crypt()
|
||||||
if cryptFunc == nil {
|
if cryptFunc == nil {
|
||||||
controllers.ErrWithCode(c, appCheck.GetCode())
|
controllers.ApiRes(c, nil, appCheck.GetCode())
|
||||||
}
|
}
|
||||||
dataByte, errCode := cryptFunc(appCheck.App).Decrypt(requestDataStruct.Data)
|
dataByte, errCode := cryptFunc(appCheck.App).Decrypt(requestDataStruct.Data)
|
||||||
if errCode != apicrypt.CryptNotError {
|
if errCode != apicrypt.CryptNotError {
|
||||||
controllers.ErrWithCode(c, errCode)
|
controllers.ApiRes(c, nil, errCode)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
//记录请求日志
|
||||||
|
id, code := services.AddRequestLog(dataByte, c.ClientIP(), path)
|
||||||
|
if code != errorcode.Success {
|
||||||
|
controllers.ApiRes(c, nil, errCode)
|
||||||
|
}
|
||||||
|
c.Set("log", id)
|
||||||
//检查解密后的数据是否与请求一致
|
//检查解密后的数据是否与请求一致
|
||||||
reCheck := appCheck.ReCheckAfterDecrypt(dataByte, requestDataStruct)
|
reCheck := appCheck.ReCheckAfterDecrypt(dataByte, requestDataStruct)
|
||||||
if !reCheck {
|
if !reCheck {
|
||||||
controllers.ErrWithCode(c, appCheck.GetCode())
|
controllers.ApiRes(c, nil, appCheck.GetCode())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//表单验证
|
//表单验证
|
||||||
|
@ -175,10 +182,15 @@ func ValidatePayRequest() gin.HandlerFunc {
|
||||||
msg, err := controllers.ValidApiData(dataByte, v)
|
msg, err := controllers.ValidApiData(dataByte, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.Log(c, "参数错误", "path=", path, "err=", err.Error(), "msg=", msg)
|
utils.Log(c, "参数错误", "path=", path, "err=", err.Error(), "msg=", msg)
|
||||||
controllers.Error(c, errorcode.ParamError, msg...)
|
controllers.ApiRes(c, nil, errorcode.ParamError, msg...)
|
||||||
c.Abort()
|
c.Abort()
|
||||||
}
|
}
|
||||||
c.Set("request", dataByte)
|
err = json.Unmarshal(dataByte, &v)
|
||||||
|
if err != nil {
|
||||||
|
controllers.ApiRes(c, nil, errorcode.Forbidden)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Set("request", v)
|
||||||
c.Set("appCheckInfo", appCheck)
|
c.Set("appCheckInfo", appCheck)
|
||||||
c.Next()
|
c.Next()
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,11 +6,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var FrontRequestMap = map[string]func() interface{}{
|
var FrontRequestMap = map[string]func() interface{}{
|
||||||
common.FRONT_V1 + "/pay/web": func() interface{} { return new(front.PayWebResp) },
|
common.FRONT_V1 + "/pay/do": func() interface{} { return new(front.PayReqs) },
|
||||||
}
|
}
|
||||||
|
|
||||||
func FrontRequest() func() interface{} {
|
var FrontRequestMapBeforeDecrypt = map[string]func() interface{}{
|
||||||
return func() interface{} {
|
common.FRONT_V1 + "/pay/do": func() interface{} { return new(front.RequestBody) },
|
||||||
return new(front.RequestBody)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ func RegisterRoute(router *gin.Engine) {
|
||||||
|
|
||||||
pay := v1.Group("/pay", middlewares.ValidateRequest(), middlewares.ValidatePayRequest())
|
pay := v1.Group("/pay", middlewares.ValidateRequest(), middlewares.ValidatePayRequest())
|
||||||
{
|
{
|
||||||
pay.POST("/web", front.WebPay)
|
pay.POST("/do", front.Pay)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,12 +15,12 @@ var (
|
||||||
type OrderRequestLog struct {
|
type OrderRequestLog struct {
|
||||||
Id int64
|
Id int64
|
||||||
IpAddress string `xorm:"'ip_address' varchar(16)"`
|
IpAddress string `xorm:"'ip_address' varchar(16)"`
|
||||||
OrderId int64 `xorm:"'order_id' bigint(20)"`
|
URL string `xorm:"'url' varchar(20)"`
|
||||||
MerchantRequest string `xorm:"'merchant_request' JSON"`
|
MerchantRequest string `xorm:"'merchant_request' JSON"`
|
||||||
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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 表名
|
// 表名
|
||||||
|
|
|
@ -24,7 +24,7 @@ type Orders struct {
|
||||||
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"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ type PayChannel struct {
|
||||||
Id int64
|
Id int64
|
||||||
PayName string `xorm:"'pay_name' varchar(128)"`
|
PayName string `xorm:"'pay_name' varchar(128)"`
|
||||||
MerchantId int64 `xorm:"'merchant_id' bigint(20)"`
|
MerchantId int64 `xorm:"'merchant_id' bigint(20)"`
|
||||||
ChannelType int `xorm:"'channel_type' int(11)"`
|
ChannelType int `xorm:"'channel_type' tinyint(2)"`
|
||||||
AppId string `xorm:"'app_id' varchar(255)"`
|
AppId string `xorm:"'app_id' varchar(255)"`
|
||||||
ExtJson string `xorm:"'ext_json' JSON"`
|
ExtJson string `xorm:"'ext_json' JSON"`
|
||||||
ExpireTime time.Time `xorm:"'expire_time' datetime"`
|
ExpireTime time.Time `xorm:"'expire_time' datetime"`
|
||||||
|
|
|
@ -42,7 +42,7 @@ func (a *AppCheck) Check() *AppCheck {
|
||||||
a.Code = errorcode.AppDisabled
|
a.Code = errorcode.AppDisabled
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
if a.App.DeleteTime.Location() == nil {
|
if !a.App.DeleteTime.IsZero() {
|
||||||
a.Code = errorcode.AppNotFound
|
a.Code = errorcode.AppNotFound
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,22 +100,31 @@ func AppFindOne(req entities.IdRequest, col ...string) (row *appmodel.App, code
|
||||||
return row, errorcode.Success
|
return row, errorcode.Success
|
||||||
}
|
}
|
||||||
|
|
||||||
func AppGetAndCheck(appCheckIn *AppCheck) (appCheckOut *AppCheck) {
|
func CheckApp(appCheckIn *AppCheck) {
|
||||||
errCode := errorcode.Success
|
errCode := errorcode.Success
|
||||||
appCheckOut.App, errCode = AppFindOne(entities.IdRequest{Id: appCheckIn.AppId})
|
appCheckIn.App, errCode = AppFindOne(entities.IdRequest{Id: appCheckIn.AppId})
|
||||||
if errCode != errorcode.Success {
|
if errCode != errorcode.Success {
|
||||||
appCheckOut.Code = errCode
|
appCheckIn.Code = errCode
|
||||||
return
|
|
||||||
}
|
}
|
||||||
//检查app可用性
|
//检查app可用性
|
||||||
appCheckOut = appCheckIn.Check()
|
appCheckIn.Check()
|
||||||
if appCheckOut.GetCode() != errorcode.Success {
|
if appCheckIn.GetCode() != errorcode.Success {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//检查白名单
|
//检查白名单
|
||||||
if appCheckIn.Ip != "" && !appCheckOut.IpCheck(appCheckIn.Ip) {
|
if appCheckIn.Ip != "" && !appCheckIn.IpCheck(appCheckIn.Ip) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetAppCheck(appId int64, ip string) *AppCheck {
|
||||||
|
appCheck := &AppCheck{
|
||||||
|
AppId: appId,
|
||||||
|
Ip: ip,
|
||||||
|
Code: errorcode.Success,
|
||||||
|
}
|
||||||
|
CheckApp(appCheck)
|
||||||
|
return appCheck
|
||||||
|
}
|
||||||
|
|
|
@ -86,7 +86,8 @@ func GetAndCheckMerchant(merchant *merchantmodel.Merchant, conn builder.Cond, co
|
||||||
if code != errorcode.Success {
|
if code != errorcode.Success {
|
||||||
return nil, code
|
return nil, code
|
||||||
}
|
}
|
||||||
if merchantInfo.DeleteTime.Location() != nil {
|
|
||||||
|
if !merchantInfo.DeleteTime.IsZero() {
|
||||||
return nil, errorcode.MerchantNotFound
|
return nil, errorcode.MerchantNotFound
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package services
|
package services
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"PaymentCenter/app/constants/common"
|
|
||||||
"PaymentCenter/app/constants/errorcode"
|
"PaymentCenter/app/constants/errorcode"
|
||||||
"PaymentCenter/app/data"
|
"PaymentCenter/app/data"
|
||||||
"PaymentCenter/app/http/entities/backend"
|
"PaymentCenter/app/http/entities/backend"
|
||||||
|
@ -78,8 +77,7 @@ func OrderLogsList(req backend.OrderLogsListRequest) (requestLog []orderrequestl
|
||||||
|
|
||||||
func OrderCreate(orderIn *ordersmodel.Orders) (orderOut *ordersmodel.Orders, code int) {
|
func OrderCreate(orderIn *ordersmodel.Orders) (orderOut *ordersmodel.Orders, code int) {
|
||||||
repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
|
repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
|
||||||
orderId, err := repo.OrderInsertOne(orderIn)
|
_, err := repo.OrderInsertOne(orderIn)
|
||||||
orderIn.Id = orderId
|
|
||||||
code = handErr(err)
|
code = handErr(err)
|
||||||
return orderIn, code
|
return orderIn, code
|
||||||
}
|
}
|
||||||
|
@ -97,9 +95,7 @@ func OrderFindOne(order *ordersmodel.Orders, conn builder.Cond, col ...string) (
|
||||||
return orderInfo, errorcode.OrdersExist
|
return orderInfo, errorcode.OrdersExist
|
||||||
}
|
}
|
||||||
|
|
||||||
func HadSameValueOrder(order *ordersmodel.Orders) (exist bool, code int) {
|
func PayOrderCheckRepeat(order *ordersmodel.Orders, conn builder.Cond) (exist bool, code int) {
|
||||||
conn := builder.NewCond()
|
|
||||||
conn = conn.And(builder.Neq{"Status": common.ORDER_STATUS_CLOSE})
|
|
||||||
_, code = OrderFindOne(order, conn)
|
_, code = OrderFindOne(order, conn)
|
||||||
if code != errorcode.OrdersNotFound {
|
if code != errorcode.OrdersNotFound {
|
||||||
return false, errorcode.Success
|
return false, errorcode.Success
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
package services
|
|
||||||
|
|
||||||
import (
|
|
||||||
"PaymentCenter/app/constants/errorcode"
|
|
||||||
"PaymentCenter/app/http/entities/front"
|
|
||||||
"PaymentCenter/app/services/thirdpay"
|
|
||||||
"context"
|
|
||||||
)
|
|
||||||
|
|
||||||
func ThirdPayWeb(ctx context.Context, req *front.PayWebReqs, appCheck *AppCheck, ip string) (code int) {
|
|
||||||
pay := thirdpay.NewWebPay(&ctx, req, appCheck, ip)
|
|
||||||
// 校验表单
|
|
||||||
pay.CheckForm()
|
|
||||||
if pay.PayCode != errorcode.Success {
|
|
||||||
code = pay.PayCode
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// 校验商户
|
|
||||||
pay.CheckMerchant()
|
|
||||||
if pay.PayCode != errorcode.Success {
|
|
||||||
code = pay.PayCode
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// 校验支付通道
|
|
||||||
pay.CheckPayChannel()
|
|
||||||
if pay.PayCode != errorcode.Success {
|
|
||||||
code = pay.PayCode
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// 校验订单
|
|
||||||
pay.CheckOrder()
|
|
||||||
if pay.PayCode != errorcode.Success {
|
|
||||||
code = pay.PayCode
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// 创建订单
|
|
||||||
pay.CreateOrder()
|
|
||||||
if pay.PayCode != errorcode.Success {
|
|
||||||
code = pay.PayCode
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// 支付
|
|
||||||
pay.Pay()
|
|
||||||
return
|
|
||||||
}
|
|
|
@ -107,12 +107,12 @@ func PayChannelFindOne(channel *paychannelmodel.PayChannel, conn builder.Cond, c
|
||||||
return channelInfo, errorcode.Success
|
return channelInfo, errorcode.Success
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAndCheckPayChannel(channel *paychannelmodel.PayChannel, conn builder.Cond, col ...string) (merchantInfo *paychannelmodel.PayChannel, code int) {
|
func GetAndCheckPayChannel(channel *paychannelmodel.PayChannel, conn builder.Cond, col ...string) (channelInfo *paychannelmodel.PayChannel, code int) {
|
||||||
merchantInfo, code = PayChannelFindOne(channel, conn, col...)
|
channelInfo, code = PayChannelFindOne(channel, conn, col...)
|
||||||
if code != errorcode.Success {
|
if code != errorcode.Success {
|
||||||
return nil, code
|
return nil, code
|
||||||
}
|
}
|
||||||
if merchantInfo.DeleteTime.Location() != nil {
|
if !channelInfo.DeleteTime.IsZero() {
|
||||||
return nil, errorcode.PayChannelNotFound
|
return nil, errorcode.PayChannelNotFound
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
|
@ -1,14 +1,43 @@
|
||||||
package services
|
package services
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"PaymentCenter/app/constants/common"
|
||||||
"PaymentCenter/app/data"
|
"PaymentCenter/app/data"
|
||||||
"PaymentCenter/app/models/orderrequestlogmodel"
|
"PaymentCenter/app/models/orderrequestlogmodel"
|
||||||
|
"xorm.io/builder"
|
||||||
)
|
)
|
||||||
|
|
||||||
func RequestLogCreate(log *orderrequestlogmodel.OrderRequestLog) (code int) {
|
func RequestLogCreate(log *orderrequestlogmodel.OrderRequestLog) (*orderrequestlogmodel.OrderRequestLog, int) {
|
||||||
db := orderrequestlogmodel.GetInstance().GetDb()
|
db := orderrequestlogmodel.GetInstance().GetDb()
|
||||||
repo := data.NewOrderRequestLogRepo(db)
|
repo := data.NewOrderRequestLogRepo(db)
|
||||||
_, err := repo.OrderRequestLogInsertOne(log)
|
id, err := repo.OrderRequestLogInsertOne(log)
|
||||||
code = handErr(err)
|
code := handErr(err)
|
||||||
return
|
if err != nil {
|
||||||
|
log.Id = id
|
||||||
|
}
|
||||||
|
return log, code
|
||||||
|
}
|
||||||
|
|
||||||
|
func RequestLogUpdate(log *orderrequestlogmodel.OrderRequestLog) (logOut *orderrequestlogmodel.OrderRequestLog, code int) {
|
||||||
|
db := orderrequestlogmodel.GetInstance().GetDb()
|
||||||
|
repo := data.NewOrderRequestLogRepo(db)
|
||||||
|
conn := builder.NewCond()
|
||||||
|
conn = conn.And(builder.Eq{"Id": log.Id})
|
||||||
|
id, err := repo.OrderRequestLogUpdate(log, conn)
|
||||||
|
code = handErr(err)
|
||||||
|
if err != nil {
|
||||||
|
log.Id = id
|
||||||
|
}
|
||||||
|
return log, code
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddRequestLog(requestDataByte []byte, ip string, url string) (int64, int) {
|
||||||
|
requestLog, checkCode := RequestLogCreate(&orderrequestlogmodel.OrderRequestLog{
|
||||||
|
IpAddress: ip,
|
||||||
|
MerchantRequest: string(requestDataByte),
|
||||||
|
URL: url,
|
||||||
|
MerchantResponse: "{}",
|
||||||
|
Status: common.STATUS_ENABLE,
|
||||||
|
})
|
||||||
|
return requestLog.Id, checkCode
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
package do
|
||||||
|
|
||||||
|
import (
|
||||||
|
"PaymentCenter/app/constants/errorcode"
|
||||||
|
"PaymentCenter/app/services"
|
||||||
|
|
||||||
|
"PaymentCenter/app/models/ordersmodel"
|
||||||
|
"PaymentCenter/app/third/paymentService"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Pay struct {
|
||||||
|
paycheck *PayCheck
|
||||||
|
Order *ordersmodel.Orders
|
||||||
|
PayCode int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPay(paycheck *PayCheck) *Pay {
|
||||||
|
return &Pay{
|
||||||
|
paycheck: paycheck,
|
||||||
|
PayCode: errorcode.Success,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *Pay) CreateOrder() {
|
||||||
|
w.Order, w.PayCode = services.OrderCreate(&ordersmodel.Orders{
|
||||||
|
MerchantId: w.paycheck.Merchant.Id,
|
||||||
|
PayChannelId: w.paycheck.Channel.Id,
|
||||||
|
AppId: w.paycheck.Channel.Id,
|
||||||
|
OutTreadNo: w.paycheck.WebPayReqs.OutTradeNo,
|
||||||
|
OrderType: w.paycheck.WebPayReqs.OrderType,
|
||||||
|
Amount: w.paycheck.WebPayReqs.Amount,
|
||||||
|
ExtJson: w.paycheck.WebPayReqs.ExtJson,
|
||||||
|
Desc: w.paycheck.WebPayReqs.Desc,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *Pay) Pay() {
|
||||||
|
var (
|
||||||
|
payFunc func(commonPayInfo *paymentService.PayOrderRequest, ExtJson string) error
|
||||||
|
ok bool
|
||||||
|
)
|
||||||
|
thirdPay := &paymentService.PayOrderRequest{
|
||||||
|
PayChannelId: w.paycheck.WebPayReqs.PayChannelId,
|
||||||
|
OrderId: w.Order.Id,
|
||||||
|
ChannelType: w.paycheck.Channel.ChannelType,
|
||||||
|
Description: w.Order.Desc,
|
||||||
|
Amount: w.Order.Amount,
|
||||||
|
PayerClientIp: w.paycheck.AppCheck.Ip,
|
||||||
|
}
|
||||||
|
if payFunc, ok = PayWayList[w.paycheck.Channel.ChannelType]; !ok {
|
||||||
|
w.PayCode = errorcode.PayChannelNotBuild
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := payFunc(thirdPay, w.paycheck.Channel.ExtJson)
|
||||||
|
if err != nil {
|
||||||
|
w.PayCode = errorcode.PayChannelExtJsonError
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res := paymentService.PaymentService(*w.paycheck.ctx, *thirdPay)
|
||||||
|
|
||||||
|
w.PayCode = res.Code
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package do
|
||||||
|
|
||||||
|
import (
|
||||||
|
"PaymentCenter/app/constants/common"
|
||||||
|
"PaymentCenter/app/constants/errorcode"
|
||||||
|
"PaymentCenter/app/services"
|
||||||
|
"xorm.io/builder"
|
||||||
|
|
||||||
|
"PaymentCenter/app/http/entities/front"
|
||||||
|
"PaymentCenter/app/models/merchantmodel"
|
||||||
|
"PaymentCenter/app/models/orderrequestlogmodel"
|
||||||
|
"PaymentCenter/app/models/ordersmodel"
|
||||||
|
"PaymentCenter/app/models/paychannelmodel"
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PayCheck struct {
|
||||||
|
ctx *context.Context
|
||||||
|
WebPayReqs *front.PayReqs
|
||||||
|
AppCheck *services.AppCheck
|
||||||
|
RequestLog *orderrequestlogmodel.OrderRequestLog
|
||||||
|
Channel *paychannelmodel.PayChannel
|
||||||
|
Merchant *merchantmodel.Merchant
|
||||||
|
OldOrder *ordersmodel.Orders
|
||||||
|
CheckCode int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPayCheck(ctx *context.Context, reqs *front.PayReqs, appCheck *services.AppCheck, ip string) *PayCheck {
|
||||||
|
if appCheck == nil {
|
||||||
|
appCheck = services.GetAppCheck(reqs.AppId, ip)
|
||||||
|
}
|
||||||
|
return &PayCheck{
|
||||||
|
ctx: ctx,
|
||||||
|
WebPayReqs: reqs,
|
||||||
|
AppCheck: appCheck,
|
||||||
|
CheckCode: appCheck.Code,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *PayCheck) CheckForm() {
|
||||||
|
if _, ok := common.OrderTypeList[w.WebPayReqs.OrderType]; !ok { //判断是否是支持的支付渠道
|
||||||
|
w.CheckCode = errorcode.PayChannelNotFound
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *PayCheck) CheckPayChannel() {
|
||||||
|
conn := builder.NewCond()
|
||||||
|
conn = conn.And(builder.Eq{"id": w.WebPayReqs.PayChannelId})
|
||||||
|
w.Channel, w.CheckCode = services.GetAndCheckPayChannel(&paychannelmodel.PayChannel{}, conn)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *PayCheck) CheckMerchant() {
|
||||||
|
conn := builder.NewCond()
|
||||||
|
conn = conn.And(builder.Eq{"id": w.AppCheck.App.MerchantId})
|
||||||
|
w.Merchant, w.CheckCode = services.GetAndCheckMerchant(&merchantmodel.Merchant{}, conn)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *PayCheck) CheckOrder() {
|
||||||
|
cond := builder.NewCond()
|
||||||
|
cond = cond.And(builder.Eq{"out_tread_no": w.WebPayReqs.OutTradeNo}, builder.Eq{"app_id": w.AppCheck.AppId}, builder.Neq{"status": common.ORDER_STATUS_CLOSE})
|
||||||
|
order, code := services.OrderFindOne(&ordersmodel.Orders{}, cond)
|
||||||
|
if code == errorcode.OrdersExist {
|
||||||
|
w.OldOrder = order
|
||||||
|
w.CheckCode = code
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package do
|
||||||
|
|
||||||
|
import (
|
||||||
|
"PaymentCenter/app/constants/common"
|
||||||
|
"PaymentCenter/app/third/paymentService"
|
||||||
|
"github.com/bytedance/sonic"
|
||||||
|
)
|
||||||
|
|
||||||
|
var PayWayList = map[int]func(commonPayInfo *paymentService.PayOrderRequest, ExtJson string) error{
|
||||||
|
common.PAY_CHANNEL_WECHAT_H5: WechatH5,
|
||||||
|
common.PAY_CHANNEL_ALIPAY_WEB: AlipayWeb,
|
||||||
|
}
|
||||||
|
|
||||||
|
func WechatH5(commonPayInfo *paymentService.PayOrderRequest, ExtJson string) error {
|
||||||
|
err := sonic.Unmarshal([]byte(ExtJson), &commonPayInfo.Wx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func AlipayWeb(commonPayInfo *paymentService.PayOrderRequest, ExtJson string) error {
|
||||||
|
err := sonic.Unmarshal([]byte(ExtJson), &commonPayInfo.Ali)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
package thirdpay
|
||||||
|
|
||||||
|
import (
|
||||||
|
"PaymentCenter/app/constants/errorcode"
|
||||||
|
"PaymentCenter/app/http/entities/front"
|
||||||
|
"PaymentCenter/app/models/ordersmodel"
|
||||||
|
"PaymentCenter/app/services"
|
||||||
|
thirdpay "PaymentCenter/app/services/thirdpay/do"
|
||||||
|
"PaymentCenter/app/services/thirdpay/types"
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ThirdPayWeb(check *thirdpay.PayCheck) *thirdpay.Pay {
|
||||||
|
pay := thirdpay.NewPay(check)
|
||||||
|
// 创建订单
|
||||||
|
pay.CreateOrder()
|
||||||
|
if pay.PayCode != errorcode.Success {
|
||||||
|
return pay
|
||||||
|
}
|
||||||
|
// 支付
|
||||||
|
pay.Pay()
|
||||||
|
return pay
|
||||||
|
}
|
||||||
|
|
||||||
|
func ThirdPayCheck(ctx context.Context, req *front.PayReqs, appCheck *services.AppCheck, ip string) (check *thirdpay.PayCheck) {
|
||||||
|
check = thirdpay.NewPayCheck(&ctx, req, appCheck, ip)
|
||||||
|
// 校验表单
|
||||||
|
check.CheckForm()
|
||||||
|
if check.CheckCode != errorcode.Success {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 校验订单
|
||||||
|
check.CheckOrder()
|
||||||
|
if check.CheckCode != errorcode.Success {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 校验商户
|
||||||
|
check.CheckMerchant()
|
||||||
|
if check.CheckCode != errorcode.Success {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 校验支付通道
|
||||||
|
check.CheckPayChannel()
|
||||||
|
if check.CheckCode != errorcode.Success {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func PayCallBack(order *ordersmodel.Orders, isNew bool) *types.PayResp {
|
||||||
|
res := &types.PayResp{
|
||||||
|
OrderNo: order.Id,
|
||||||
|
OrderType: order.OrderType,
|
||||||
|
Amount: order.Amount,
|
||||||
|
Desc: order.Desc,
|
||||||
|
IsNewCreate: isNew,
|
||||||
|
Status: order.Status,
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
type PayResp struct {
|
||||||
|
OrderNo int64 `json:"order_no"`
|
||||||
|
OrderType int32 `json:"out_trade_no"`
|
||||||
|
Amount int `json:"order_type"`
|
||||||
|
Desc string `json:"amount"`
|
||||||
|
IsNewCreate bool `json:"is_new_create"`
|
||||||
|
Status int32 `json:"status"`
|
||||||
|
}
|
|
@ -1,123 +0,0 @@
|
||||||
package thirdpay
|
|
||||||
|
|
||||||
import (
|
|
||||||
"PaymentCenter/app/constants/common"
|
|
||||||
"PaymentCenter/app/constants/errorcode"
|
|
||||||
"PaymentCenter/app/services"
|
|
||||||
|
|
||||||
"PaymentCenter/app/http/entities/front"
|
|
||||||
"PaymentCenter/app/models/merchantmodel"
|
|
||||||
"PaymentCenter/app/models/orderrequestlogmodel"
|
|
||||||
"PaymentCenter/app/models/ordersmodel"
|
|
||||||
"PaymentCenter/app/models/paychannelmodel"
|
|
||||||
"PaymentCenter/app/third/paymentService"
|
|
||||||
"context"
|
|
||||||
"github.com/bytedance/sonic"
|
|
||||||
)
|
|
||||||
|
|
||||||
type WebPay struct {
|
|
||||||
ctx *context.Context
|
|
||||||
WebPayReqs *front.PayWebReqs
|
|
||||||
AppCheck *services.AppCheck
|
|
||||||
Order *ordersmodel.Orders
|
|
||||||
Channel *paychannelmodel.PayChannel
|
|
||||||
Merchant *merchantmodel.Merchant
|
|
||||||
PayCode int
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewWebPay(ctx *context.Context, reqs *front.PayWebReqs, appCheck *services.AppCheck, ip string) *WebPay {
|
|
||||||
if appCheck == nil {
|
|
||||||
appCheck = services.AppGetAndCheck(&services.AppCheck{
|
|
||||||
AppId: reqs.AppId,
|
|
||||||
Ip: ip,
|
|
||||||
Code: errorcode.Success,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &WebPay{
|
|
||||||
ctx: ctx,
|
|
||||||
WebPayReqs: reqs,
|
|
||||||
AppCheck: appCheck,
|
|
||||||
PayCode: appCheck.Code,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WebPay) CheckForm() {
|
|
||||||
if _, ok := common.OrderTypeList[w.WebPayReqs.OrderType]; !ok { //判断是否是支持的支付渠道
|
|
||||||
w.PayCode = errorcode.PayChannelNotFound
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WebPay) AddPayLog() {
|
|
||||||
requestJson, err := sonic.Marshal(w.WebPayReqs)
|
|
||||||
if err != nil {
|
|
||||||
w.PayCode = errorcode.RequestLogErrors
|
|
||||||
return
|
|
||||||
}
|
|
||||||
code := services.RequestLogCreate(&orderrequestlogmodel.OrderRequestLog{
|
|
||||||
IpAddress: w.AppCheck.Ip,
|
|
||||||
MerchantRequest: string(requestJson),
|
|
||||||
})
|
|
||||||
w.PayCode = code
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WebPay) CheckPayChannel() {
|
|
||||||
w.Channel, w.PayCode = services.GetAndCheckPayChannel(&paychannelmodel.PayChannel{Id: w.WebPayReqs.PayChannelId}, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WebPay) CheckMerchant() {
|
|
||||||
w.Merchant, w.PayCode = services.GetAndCheckMerchant(&merchantmodel.Merchant{Id: w.AppCheck.App.MerchantId}, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WebPay) CheckOrder() {
|
|
||||||
exist, code := services.HadSameValueOrder(&ordersmodel.Orders{OutTreadNo: w.WebPayReqs.OutTradeNo})
|
|
||||||
if exist {
|
|
||||||
w.PayCode = code
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WebPay) CreateOrder() {
|
|
||||||
w.Order, w.PayCode = services.OrderCreate(&ordersmodel.Orders{
|
|
||||||
MerchantId: w.Merchant.Id,
|
|
||||||
PayChannelId: w.Channel.Id,
|
|
||||||
AppId: w.Channel.Id,
|
|
||||||
OutTreadNo: w.WebPayReqs.OutTradeNo,
|
|
||||||
OrderType: w.WebPayReqs.OrderType,
|
|
||||||
Amount: w.WebPayReqs.Amount,
|
|
||||||
ExtJson: w.WebPayReqs.ExtJson,
|
|
||||||
Desc: w.WebPayReqs.Desc,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *WebPay) Pay() {
|
|
||||||
thirdPay := &paymentService.PayOrderRequest{
|
|
||||||
PayChannelId: w.WebPayReqs.PayChannelId,
|
|
||||||
OrderId: w.Order.Id,
|
|
||||||
ChannelType: w.Channel.ChannelType,
|
|
||||||
Description: w.Order.Desc,
|
|
||||||
Amount: w.Order.Amount,
|
|
||||||
PayerClientIp: w.AppCheck.Ip,
|
|
||||||
}
|
|
||||||
//{"api_v_3_key": "131231231", "app_id": "123", "mch_id": "123123", "private_key": "2131312", "serial_no": "123213213"}
|
|
||||||
switch w.WebPayReqs.OrderType {
|
|
||||||
case common.PAY_CHANNEL_WECHAT_H5:
|
|
||||||
var wx paymentService.WxPay
|
|
||||||
err := sonic.Unmarshal([]byte(w.Channel.ExtJson), &wx)
|
|
||||||
if err != nil {
|
|
||||||
w.PayCode = errorcode.PayChannelExtJsonError
|
|
||||||
return
|
|
||||||
}
|
|
||||||
wx.AppId = w.Channel.AppId
|
|
||||||
case common.PAY_CHANNEL_ALIPAY_WEB:
|
|
||||||
//{"ali_public_key": "123", "private_key_path": "123", "sign_type": "123"}
|
|
||||||
//thirdPay.Ali = &paymentService.AliPay{}
|
|
||||||
default:
|
|
||||||
w.PayCode = errorcode.PayChannelNotBuild
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_ = paymentService.PaymentService(*w.ctx, *thirdPay)
|
|
||||||
return
|
|
||||||
}
|
|
|
@ -34,6 +34,14 @@ type AliPay struct {
|
||||||
AlipayPublicCert []byte `json:"alipay_public_cert"` // 支付宝公钥
|
AlipayPublicCert []byte `json:"alipay_public_cert"` // 支付宝公钥
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AliPayA 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"` // 支付宝公钥
|
||||||
|
}
|
||||||
|
|
||||||
type PayOrderResponse struct {
|
type PayOrderResponse struct {
|
||||||
Code int `json:"code"`
|
Code int `json:"code"`
|
||||||
ErrorMsg string `json:"error_msg"`
|
ErrorMsg string `json:"error_msg"`
|
||||||
|
|
|
@ -27,7 +27,7 @@ func TestRsaDecrypt(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func encrypt() string {
|
func encrypt() string {
|
||||||
data := "{\"app_id\":5476377146882523138,\"name\":\"张三\",\"sex\":1,\"is_human\":true,\"timestamp\":53612533412643}"
|
data := "{\"pay_channel_id\":8935141660703064070,\"out_trade_no\":\"asdadasdas\",\"order_type\":1,\"amount\":1,\"desc\":\"abc\",\"ext_json\":\"\",\"app_id\":5476377146882523138,\"timestamp\":53612533412643}"
|
||||||
dataJson := []byte(data)
|
dataJson := []byte(data)
|
||||||
pub := `-----BEGIN PUBLIC KEY-----
|
pub := `-----BEGIN PUBLIC KEY-----
|
||||||
` + PUB + `
|
` + PUB + `
|
||||||
|
|
Loading…
Reference in New Issue