Files
jx-callback/controllers/api_controller.go
2021-07-01 11:20:48 +08:00

293 lines
7.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package controllers
import (
"crypto/md5"
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/server/web"
"net/url"
"reflect"
"strings"
"time"
)
type ApiController struct {
web.Controller
}
const (
keyAppID = "app_id"
keyTimestamp = "timestamp"
keyMethod = "method"
keySign = "sign"
)
const (
keyPrintNo = "print_no"
keyPrintKey = "print_key"
keyName = "name"
keyStatus = "status"
keyOrderNo = "order_no"
)
var (
routerMap map[string]reflect.Value
)
func Init() {
routerMap = make(map[string]reflect.Value)
var ruTest ApiController
vf := reflect.ValueOf(&ruTest)
vft := vf.Type()
//读取方法数量
mNum := vf.NumMethod()
fmt.Println("mNum", mNum)
//遍历路由器的方法,并将其存入控制器映射变量中
for i := 0; i < mNum; i++ {
mName := vft.Method(i).Name
routerMap[mName] = vf.Method(i)
}
}
// @Title api调用入口
// @Description api调用入口
// @Param app_id formData string false "应用ID"
// @Param timestamp formData int64 false "unix时间戳"
// @Param sign formData string false "签名"
// @Param method formData string false "接口名"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /CallOpenAPI [post]
func (c *ApiController) CallOpenAPI() {
var (
err error
errCode = model.ErrCodeGeneralFailed
callResult = &CallResult{}
accessID = utils.GetUUID()
requireParams []string
dataMap = make(map[string]interface{})
now = time.Now().Unix()
parms, result []reflect.Value
urls url.Values
app = &model.Apps{}
db = dao.GetDB()
)
var (
appID int
sign, method string
timestamp int64
)
//判断必传参数是否传入begin
if appID, err = c.GetInt(keyAppID); err != nil {
requireParams = append(requireParams, keyAppID)
}
if method = c.GetString(keyMethod); method == "" {
requireParams = append(requireParams, keyMethod)
}
if sign = c.GetString(keySign); sign == "" {
requireParams = append(requireParams, keySign)
}
if timestamp, err = c.GetInt64(keyTimestamp); err != nil {
requireParams = append(requireParams, keyTimestamp)
}
if len(requireParams) > 0 {
err = buildParamRequiredErr(requireParams)
}
//判断必传参数是否传入end
if err != nil {
goto end
}
//判断timestamp传入是否正确begin
if len(utils.Int64ToStr(timestamp)) != len(utils.Int64ToStr(now)) {
err = buildTimestampParamErr()
errCode = model.ErrCodeOpenAPIParamErrTimeStamp
}
if now-timestamp < 5 {
err = buildTimestampParamErr()
errCode = model.ErrCodeOpenAPIParamErrTimeStamp
}
//判断timestamp传入是否正确end
if err != nil {
goto end
}
//判断app_id和sign匹配begin ,sign = app_id + app_key + timestamp的MD5加密
app.ID = appID
if err = dao.GetEntity(db, app); err != nil {
goto end
} else {
if app.Status != model.UserStatusNormal {
errCode = model.ErrCodeGeneralFailed
err = fmt.Errorf("很抱歉您的应用已失效!")
goto end
}
appKey := app.AppKey
signOrigin := fmt.Sprintf("%x", md5.Sum([]byte(utils.Int2Str(appID)+appKey+utils.Int64ToStr(timestamp))))
if strings.Compare(sign, signOrigin) != 0 {
errCode = model.ErrCodeOpenAPIParamErrSign
err = buildMethodParamSign()
goto end
}
}
//判断app_id和sign匹配end
//call
urls, _ = c.Input()
dataMap = utils.URLValues2Map(urls)
delete(dataMap, keyMethod)
delete(dataMap, keyTimestamp)
delete(dataMap, keySign)
parms = []reflect.Value{reflect.ValueOf(dataMap)}
if routerMap[method] == reflect.ValueOf(nil) {
errCode = model.ErrCodeOpenAPIParamErrMethod
err = buildMethodParamErr()
}
globals.SugarLogger.Debugf("Begin API CallOpenAPI Method: %s, accessUUID:%s, sign:%s\n", method, accessID, sign)
if err == nil {
result = routerMap[method].Call(parms)
if result[2].Interface() != nil {
err = result[2].Interface().(error)
errCode = result[1].String()
goto end
}
goto success
} else {
callResult.Code = errCode
callResult.Desc = err.Error()
}
end:
{
callResult.Code = errCode
callResult.Desc = err.Error()
c.Data["json"] = callResult
c.ServeJSON()
}
success:
{
callResult.Code = model.ErrCodeSuccess
callResult.Data = result[0].String()
c.Data["json"] = callResult
c.ServeJSON()
}
}
//添加打印机,暂不支持批量
func (c *ApiController) AddPrinter(dataMap map[string]interface{}) (data, errCode string, err error) {
var (
printNo, printKey, name string
appID int
)
if _, ok := dataMap[keyPrintNo].(string); !ok {
return buildParamErrCodeAndErr(keyPrintNo)
} else {
if printNo = dataMap[keyPrintNo].(string); printNo == "" {
return buildParamErrCodeAndErr(keyPrintNo)
}
}
if _, ok := dataMap[keyPrintKey].(string); !ok {
return buildParamErrCodeAndErr(keyPrintKey)
} else {
if printKey = dataMap[keyPrintKey].(string); printKey == "" {
return buildParamErrCodeAndErr(keyPrintKey)
}
}
appID = dataMap[keyAppID].(int)
name = dataMap[keyName].(string)
if err = cms.AddPrinter(appID, printNo, printKey, name); err != nil {
return "", model.ErrCodeGeneralFailed, err
}
return "", errCode, err
}
//删除打印机绑定,暂不支持批量
func (c *ApiController) DelPrinter(dataMap map[string]interface{}) (data, errCode string, err error) {
var (
printNo string
appID int
)
if _, ok := dataMap[keyPrintNo].(string); !ok {
return buildParamErrCodeAndErr(keyPrintNo)
} else {
if printNo = dataMap[keyPrintNo].(string); printNo == "" {
return buildParamErrCodeAndErr(keyPrintNo)
}
}
appID = dataMap[keyAppID].(int)
if err = cms.DelPrinter(appID, printNo); err != nil {
return "", model.ErrCodeGeneralFailed, err
}
return "", errCode, err
}
//修改打印机备注名
func (c *ApiController) UpdatePrinter(dataMap map[string]interface{}) (data, errCode string, err error) {
var (
printNo, name string
appID int
)
if _, ok := dataMap[keyPrintNo].(string); !ok {
return buildParamErrCodeAndErr(keyPrintNo)
} else {
if printNo = dataMap[keyPrintNo].(string); printNo == "" {
return buildParamErrCodeAndErr(keyPrintNo)
}
}
if _, ok := dataMap[keyName].(string); !ok {
return buildParamErrCodeAndErr(keyName)
} else {
if name = dataMap[keyName].(string); name == "" {
return buildParamErrCodeAndErr(keyName)
}
}
appID = dataMap[keyAppID].(int)
if err = cms.UpdatePrinter(appID, printNo, name); err != nil {
return "", model.ErrCodeGeneralFailed, err
}
return "", errCode, err
}
//清空打印机队列
func (c *ApiController) DelPrinterSeq(dataMap map[string]interface{}) (data, errCode string, err error) {
var (
printNo string
appID int
)
if _, ok := dataMap[keyPrintNo].(string); !ok {
return buildParamErrCodeAndErr(keyPrintNo)
} else {
if printNo = dataMap[keyPrintNo].(string); printNo == "" {
return buildParamErrCodeAndErr(keyPrintNo)
}
}
appID = dataMap[keyAppID].(int)
if err = cms.DelPrinterSeq(appID, printNo); err != nil {
return "", model.ErrCodeGeneralFailed, err
}
return "", errCode, err
}
func (c *ApiController) DoPrint(dataMap map[string]interface{}) (data, errCode string, err error) {
var (
content = dataMap["data"].(string)
printNo = dataMap["print_no"].(string)
orderNo = utils.Interface2Int64WithDefault(dataMap["order_no"], 0)
db = dao.GetDB()
)
globals.SugarLogger.Debugf("Begin API DoPrint data: [%v]", utils.Format4Output(dataMap, true))
if orderNo == 0 {
return data, model.ErrCodeOpenAPIParamErrNormal, fmt.Errorf("参数错误order_no 不能为空")
}
printMsg := &model.PrintMsg{
PrintNo: printNo,
Content: content,
OrderNo: int(orderNo),
}
dao.WrapAddIDCULDEntity(printMsg, "")
if err = dao.CreateEntity(db, printMsg); err != nil {
return data, model.ErrCodeGeneralFailed, err
}
return data, errCode, err
}