This commit is contained in:
suyl
2021-07-23 14:11:59 +08:00
parent 215bf52530
commit 5d6e5582aa
16 changed files with 166 additions and 24 deletions

View File

@@ -1,8 +1,10 @@
package controllers
import (
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/services"
"github.com/gin-gonic/gin"
"io/ioutil"
)
type CallbackController struct {
@@ -15,3 +17,8 @@ func (t *CallbackController) Msg(c *gin.Context) {
})
}
}
func (t *CallbackController) TlPayCallback(c *gin.Context) {
data, _ := ioutil.ReadAll(c.Request.Body)
globals.SugarLogger.Debugf("TlPayCallback msg: %v", string(data))
}

View File

@@ -5,8 +5,8 @@ import (
"fmt"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/putils"
"git.rosy.net.cn/jx-print/services"
"git.rosy.net.cn/jx-print/utils"
"github.com/dchest/captcha"
"github.com/gin-gonic/gin"
"net/http"
@@ -44,7 +44,7 @@ func checkToken(c *gin.Context) (tokenInfo *model.TokenInfo) {
tokenInfo.Token = cookie.Value
}
globals.SugarLogger.Debugf("checkToken token: %v", tokenInfo.Token)
if tokenMap = utils.GetKey(tokenInfo.Token).(map[string]interface{}); tokenMap == nil {
if tokenMap = putils.GetKey(tokenInfo.Token).(map[string]interface{}); tokenMap == nil {
err = fmt.Errorf("token过期或无效请重新登录")
c.JSON(http.StatusOK, &CallBack{
Desc: err.Error(),
@@ -63,7 +63,7 @@ func checkToken(c *gin.Context) (tokenInfo *model.TokenInfo) {
})
return nil
}
globals.SugarLogger.Debugf("checkToken user: %v", utils.Format4Output(user, true))
globals.SugarLogger.Debugf("checkToken user: %v", putils.Format4Output(user, true))
}
return tokenInfo
}
@@ -106,8 +106,8 @@ func callFunc(c *gin.Context, worker func() (retVal interface{}, errCode string,
func captchaVerify(c *gin.Context, code string) bool {
//session := sessions.Default(c)
if captchaId := utils.GetKey(c.ClientIP() + model.SessionKey).(string); captchaId != "" {
utils.DelKey(c.ClientIP() + model.SessionKey)
if captchaId := putils.GetKey(c.ClientIP() + model.SessionKey).(string); captchaId != "" {
putils.DelKey(c.ClientIP() + model.SessionKey)
if captcha.VerifyString(captchaId, code) {
return true
} else {

View File

@@ -2,6 +2,7 @@ package controllers
import (
"git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/services"
"github.com/gin-gonic/gin"
)
@@ -24,6 +25,7 @@ func CreateOrder(c *gin.Context) {
return
}
if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
retVal, err = services.CreateOrder(tokenInfo, param.OrderType, param.Origin, param.ThingID, param.TypeID)
return retVal, "", err
}) {
return
@@ -48,6 +50,7 @@ func Pay(c *gin.Context) {
return
}
if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
retVal, err = services.Pay(tokenInfo, param.OrderID, param.PayType, param.VendorPayType)
return retVal, "", err
}) {
return

View File

@@ -2,8 +2,8 @@ package controllers
import (
"git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/putils"
"git.rosy.net.cn/jx-print/services"
"git.rosy.net.cn/jx-print/utils"
"github.com/gin-gonic/gin"
)
@@ -25,7 +25,7 @@ func AddPrinters(c *gin.Context) {
if tokenInfo = checkToken(c); tokenInfo == nil {
return
}
if err = utils.UnmarshalUseNumber([]byte(param.Prints), &printInfos); err != nil {
if err = putils.UnmarshalUseNumber([]byte(param.Prints), &printInfos); err != nil {
buildErrJson(c, err)
return
}
@@ -87,7 +87,7 @@ func DelPrinters(c *gin.Context) {
if tokenInfo = checkToken(c); tokenInfo == nil {
return
}
if err = utils.UnmarshalUseNumber([]byte(param.PrintNos), &printNos); err != nil {
if err = putils.UnmarshalUseNumber([]byte(param.PrintNos), &printNos); err != nil {
buildErrJson(c, err)
return
}

View File

@@ -4,15 +4,15 @@ import (
"encoding/json"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/putils"
"git.rosy.net.cn/jx-print/services"
"git.rosy.net.cn/jx-print/utils"
"github.com/gin-gonic/gin"
"net/http"
)
//刷新验证码 POST
func RefreshCode(c *gin.Context) {
utils.Captcha(c, 4)
putils.Captcha(c, 4)
}
type UserParam struct {

View File

@@ -2,7 +2,7 @@ package dao
import (
"fmt"
putils "git.rosy.net.cn/jx-print/utils"
putils "git.rosy.net.cn/jx-print/putils"
"github.com/jmoiron/sqlx"
"reflect"
"strings"

20
dao/order_dao.go Normal file
View File

@@ -0,0 +1,20 @@
package dao
import (
"git.rosy.net.cn/jx-print/model"
"github.com/jmoiron/sqlx"
)
func GetOrder(db *sqlx.DB, orderID string) (order *model.PayOrder, err error) {
var (
orders []*model.PayOrder
)
sql := `
SELECT * FROM pay_order WHERE order_id = ?
`
sqlParams := []interface{}{orderID}
if err = db.Select(&orders, sql, sqlParams...); err == nil && len(orders) > 0 {
return orders[0], err
}
return order, err
}

View File

@@ -41,6 +41,14 @@ const (
OrderOriginWxMini = "weixinmini"
OrderOriginOpenAPI = "openAPI"
OrderStatusWaitPay = 0 //待支付
OrderStatusPaid = 1 //已支付
OrderStatusPayFail = 2
OrderStatusPayCancel = 3
OrderStatusRefund = 4
PayTypeTL = "tl" //通联支付
)
const (
@@ -64,7 +72,7 @@ type TokenInfo struct {
type FlowConfig struct {
ID int `json:"id"`
Price int `json:"price"`
Price int64 `json:"price"`
Flow float64 `json:"flow"`
Unit string `json:"unit"`
}
@@ -207,7 +215,7 @@ type PayOrder struct {
OrderType string `json:"order_type" db:"order_type"` //订单类型,流量充值等
Origin string `json:"origin"` //订单来源,小程序,开放后台
Status int `json:"status"` //订单状态,待支付2已支付5支付成功110支付失败115
PayPrice int `json:"pay_price" db:"pay_price"` //支付金额
PayPrice int64 `json:"pay_price" db:"pay_price"` //支付金额
TransactionID string `json:"transaction_id" db:"transaction_id"` // 支付成功后支付方生成的事务ID
PayFinishedAt *time.Time `json:"pay_finished_at" db:"pay_finished_at"`
PrepayID string `json:"prepay_id" db:"prepay_id"` // 下单后支付前支付方生成的事务ID

View File

@@ -1,4 +1,4 @@
package utils
package putils
import (
"git.rosy.net.cn/baseapi/utils"

View File

@@ -1,7 +1,8 @@
package utils
package putils
import (
"bytes"
"crypto/md5"
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi"
@@ -10,6 +11,7 @@ import (
"git.rosy.net.cn/jx-print/model"
"github.com/dchest/captcha"
"github.com/gin-gonic/gin"
"math"
"math/rand"
"net/http"
"strings"
@@ -40,6 +42,7 @@ var (
"MB": struct{}{},
"GB": struct{}{},
}
orderNoBeginTimestamp = utils.Str2Time("2010-01-01 00:00:00").Unix()
)
func RandStringBytes(n int) string {
@@ -251,3 +254,18 @@ func FlowKB2Other(flowKB float64) (flow float64, unit string) {
}
return flow, unit
}
func GenOrderNo() (orderNo int64) {
var prefix = utils.Str2Int64(time.Now().Format("20060102"))
const randPartNum = 1000
orderNo = time.Now().Unix() - orderNoBeginTimestamp
orderNo = orderNo * randPartNum
md5Bytes := md5.Sum([]byte(utils.GetUUID()))
randPart := 0
for k, v := range md5Bytes {
randPart += int(v) << ((k % 3) * 8)
}
orderNo += int64(randPart % randPartNum)
orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix
return orderNo
}

View File

@@ -6,7 +6,7 @@ import (
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
putils "git.rosy.net.cn/jx-print/utils"
putils "git.rosy.net.cn/jx-print/putils"
"github.com/gin-gonic/gin"
"time"
)

View File

@@ -2,8 +2,8 @@ package misc
import (
"git.rosy.net.cn/baseapi/utils"
putils "git.rosy.net.cn/jx-print/putils"
"git.rosy.net.cn/jx-print/services"
putils "git.rosy.net.cn/jx-print/utils"
"git.rosy.net.cn/jx-print/globals"
"time"

View File

@@ -1,7 +1,93 @@
package services
import "git.rosy.net.cn/jx-print/model"
import (
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/tonglianpayapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/putils"
"git.rosy.net.cn/jx-print/services/api"
"github.com/jmoiron/sqlx"
"strings"
"time"
)
func CreateOrder(tokenInfo *model.TokenInfo) (err error) {
return err
var (
findOrderPayPriceMap = map[string]func(db *sqlx.DB, typeID string) (int64, error){
model.OrderTypeFlow: func(db *sqlx.DB, typeID string) (payPrice int64, err error) {
var flowCfg []*model.FlowConfig
if config, err2 := dao.GetConfig(db, model.ConfigTypeSys, model.OrderTypeFlow); err2 == nil && config != nil {
if err = json.Unmarshal([]byte(config.Value), &flowCfg); err == nil && len(flowCfg) > 0 {
for _, v := range flowCfg {
if v.ID == utils.Str2Int(typeID) {
payPrice = v.Price
break
}
}
}
} else {
err = err2
}
return payPrice, err
},
}
payFunc = map[string]func(db *sqlx.DB, order *model.PayOrder, vendorPayType string) (err error){
model.PayTypeTL: func(db *sqlx.DB, order *model.PayOrder, vendorPayType string) (err error) {
param := &tonglianpayapi.CreateUnitorderOrderParam{
Trxamt: int(order.PayPrice),
NotifyUrl: "http://print.jxc4.com/callback/tlPayCallback",
Reqsn: order.OrderID,
PayType: vendorPayType,
}
if vendorPayType != tonglianpayapi.PayTypeWxCode {
return fmt.Errorf("暂不支持的支付类型vendorPayType :%s", vendorPayType)
}
result, err := api.TLpayAPI.CreateUnitorderOrder(param)
if err == nil {
var result2 tonglianpayapi.PayInfo
json.Unmarshal([]byte(result.PayInfo), &result2)
order.PrepayID = result2.Package[strings.LastIndex(result2.Package, "=")+1 : len(result2.Package)]
order.TransactionID = result.TrxID
err = dao.Update(db, order, "prepay_id", "transaction_id")
}
return err
},
}
)
func CreateOrder(tokenInfo *model.TokenInfo, orderType, origin, thingID, typeID string) (orderID string, err error) {
var (
db = globals.GetDB()
now = time.Now()
payPrice int64
)
if payPrice, err = findOrderPayPriceMap[orderType](db, typeID); err != nil {
return "", err
}
orderID = utils.Int64ToStr(putils.GenOrderNo())
payOrder := &model.PayOrder{
CreatedAt: &now,
OrderID: orderID,
PayPrice: payPrice,
UserID: tokenInfo.User.UserID,
OrderType: orderType,
Origin: origin,
ThingID: thingID,
TypeID: typeID,
}
err = dao.Insert(db, payOrder)
return orderID, err
}
func Pay(tokenInfo *model.TokenInfo, orderID, payType, vendorPayType string) (order *model.PayOrder, err error) {
var (
db = globals.GetDB()
)
order, _ = dao.GetOrder(db, orderID)
err = payFunc[payType](db, order, vendorPayType)
return order, err
}

View File

@@ -6,7 +6,7 @@ import (
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
putils "git.rosy.net.cn/jx-print/utils"
putils "git.rosy.net.cn/jx-print/putils"
"github.com/gin-gonic/gin"
"time"
)

View File

@@ -6,8 +6,8 @@ import (
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
putils "git.rosy.net.cn/jx-print/putils"
"git.rosy.net.cn/jx-print/services/api"
putils "git.rosy.net.cn/jx-print/utils"
"time"
)
@@ -68,7 +68,7 @@ func SimFlowDaySettle() (err error) {
sumIncome, _ := dao.GetSimFlowIncomeSum(db, v.IccID, monthBegin, monthEnd)
sumExpend, _ := dao.GetSimFlowExpendSum(db, v.IccID, monthBegin, monthEnd)
if sumIncome != nil && sumExpend != nil {
if sumExpend.Flow-sumIncome.Flow <= 0 {
if sumIncome.Flow-sumExpend.Flow <= 0 {
v.FlowFlag = 1
err = dao.Update(db, v, "flow_flag")
}

View File

@@ -8,7 +8,7 @@ import (
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
putils "git.rosy.net.cn/jx-print/utils"
putils "git.rosy.net.cn/jx-print/putils"
"github.com/gin-gonic/gin"
"github.com/jmoiron/sqlx"
"strings"