|
@@ -2,12 +2,15 @@ package controllers
|
|
|
|
|
|
import (
|
|
|
"crypto/md5"
|
|
|
+ "encoding/json"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "github.com/shopspring/decimal"
|
|
|
"hongze/hongze_open_api/models/custom"
|
|
|
"hongze/hongze_open_api/models/tables/open_api_user"
|
|
|
"hongze/hongze_open_api/utils"
|
|
|
"math"
|
|
|
+ "reflect"
|
|
|
"sort"
|
|
|
"strconv"
|
|
|
"strings"
|
|
@@ -43,6 +46,9 @@ func (c *BaseAuth) Prepare() {
|
|
|
|
|
|
//请求类型
|
|
|
contentType := c.Ctx.Request.Header.Get("content-type")
|
|
|
+ //fmt.Println("contentType:", contentType)
|
|
|
+ //fmt.Println("c.Ctx.Input.RequestBody:", string(c.Ctx.Input.RequestBody))
|
|
|
+
|
|
|
switch contentType {
|
|
|
case "multipart/form-data":
|
|
|
//文件最大5M
|
|
@@ -53,16 +59,43 @@ func (c *BaseAuth) Prepare() {
|
|
|
//c.Abort()
|
|
|
return
|
|
|
}
|
|
|
- default:
|
|
|
+ params := c.Ctx.Request.Form
|
|
|
+ signData = convertParam(params)
|
|
|
+ case "application/x-www-form-urlencoded":
|
|
|
err := c.Ctx.Request.ParseForm()
|
|
|
if err != nil {
|
|
|
c.FailWithMessage(fmt.Sprintf("获取参数失败,%v", err))
|
|
|
return
|
|
|
}
|
|
|
+ params := c.Ctx.Request.Form
|
|
|
+ signData = convertParam(params)
|
|
|
+ case "application/json":
|
|
|
+ //var v interface{}
|
|
|
+ params := make(map[string]interface{})
|
|
|
+ err := json.Unmarshal(c.Ctx.Input.RequestBody, ¶ms)
|
|
|
+ if err != nil {
|
|
|
+ // handle error
|
|
|
+ //fmt.Println("err json:", err)
|
|
|
+ c.FailWithMessage(fmt.Sprintf("获取参数失败,%v", err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //fmt.Println("params:", params)
|
|
|
+
|
|
|
+ signData = convertParamInterface(params)
|
|
|
+ //tmpV := v.(map[string]string)
|
|
|
+ //fmt.Println("tmpV:", tmpV)
|
|
|
+ //fmt.Sprintln("list type is v%", tmpV["list"])
|
|
|
+ default: //正常应该是其他方式获取解析的,暂时这么处理吧
|
|
|
+ err := c.Ctx.Request.ParseForm()
|
|
|
+ if err != nil {
|
|
|
+ c.FailWithMessage(fmt.Sprintf("获取参数失败,%v", err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ params := c.Ctx.Request.Form
|
|
|
+ signData = convertParam(params)
|
|
|
}
|
|
|
- params := c.Ctx.Request.Form
|
|
|
- signData = convertParam(params)
|
|
|
}
|
|
|
+ //fmt.Println("signData:", signData)
|
|
|
|
|
|
//页码数
|
|
|
var startSize int
|
|
@@ -104,6 +137,36 @@ func convertParam(params map[string][]string) (signData map[string]string) {
|
|
|
return signData
|
|
|
}
|
|
|
|
|
|
+//将请求传入的数据格式转换成签名需要的格式(目前只能处理简单的类型,数组、对象暂不支持)
|
|
|
+func convertParamInterface(params map[string]interface{}) (signData map[string]string) {
|
|
|
+ signData = make(map[string]string)
|
|
|
+ for key := range params {
|
|
|
+ val := ``
|
|
|
+ //fmt.Println("key", key, ";val:", params[key], ";type:", reflect.TypeOf(params[key]))
|
|
|
+ //signData[key] = params[key][0]
|
|
|
+ tmpVal := params[key]
|
|
|
+ switch reflect.TypeOf(tmpVal).Kind() {
|
|
|
+ case reflect.String:
|
|
|
+ val = fmt.Sprint(tmpVal)
|
|
|
+ case reflect.Int, reflect.Int16, reflect.Int64, reflect.Int32, reflect.Int8:
|
|
|
+ val = fmt.Sprint(tmpVal)
|
|
|
+ case reflect.Uint, reflect.Uint32, reflect.Uint16, reflect.Uint8, reflect.Uint64:
|
|
|
+ val = fmt.Sprint(tmpVal)
|
|
|
+ case reflect.Bool:
|
|
|
+ val = fmt.Sprint(tmpVal)
|
|
|
+ case reflect.Float64:
|
|
|
+ decimalNum := decimal.NewFromFloat(tmpVal.(float64))
|
|
|
+ val = decimalNum.String()
|
|
|
+ //val = strconv.FormatFloat(tmpVal.(float64), 'E', -1, 64) //float64
|
|
|
+ case reflect.Float32:
|
|
|
+ decimalNum := decimal.NewFromFloat32(tmpVal.(float32))
|
|
|
+ val = decimalNum.String()
|
|
|
+ }
|
|
|
+ signData[key] = val
|
|
|
+ }
|
|
|
+ return signData
|
|
|
+}
|
|
|
+
|
|
|
//请求参数签名校验
|
|
|
func checkSign(postData map[string]string, ip string) (err error) {
|
|
|
isSandbox := postData["is_sandbox"]
|
|
@@ -168,7 +231,7 @@ func checkSign(postData map[string]string, ip string) (err error) {
|
|
|
|
|
|
//先取出除sign外的所有的提交的参数key
|
|
|
var keys []string
|
|
|
- for k, _ := range postData {
|
|
|
+ for k := range postData {
|
|
|
if k != "sign" {
|
|
|
keys = append(keys, k)
|
|
|
}
|