package controllers import ( "encoding/json" "fmt" "git.rosy.net.cn/baseapi/utils" "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" ) type ApiController struct { web.Controller } const ( keyAppID = "app_id" keyTimestamp = "timestamp" keyMethod = "method" keySign = "sign" ) var ( routerMap map[string]reflect.Value textChan chan string ) 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 ) var ( appID, sign, method string //timestamp int64 ) //判断必传参数是否传入begin if appID = c.GetString(keyAppID); appID == "" { 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("timestamp"); err != nil { // requireParams = append(requireParams, "timestamp") //} 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 //判断app_id和sign匹配end //call urls, _ = c.Input() dataMap = utils.URLValues2Map(urls) delete(dataMap, keyMethod) delete(dataMap, keyTimestamp) 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[1].String() != "" { err = fmt.Errorf(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) AddPrint(dataMap map[string]interface{}) (data string, err error) { if dataMap[keySign].(string) != "222" { return "", buildParamErr(keySign) } data2, err := json.Marshal(dataMap) return string(data2), err } func (c *ApiController) DoPrint(dataMap map[string]interface{}) (data string, err string) { 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, fmt.Sprintf("订单序号不能为0") } printMsg := &model.PrintMsg{ PrintNo: printNo, Content: content, OrderNo: int(orderNo), } dao.WrapAddIDCULDEntity(printMsg, "") dao.CreateEntity(db, printMsg) return data, err }