|
|
|
|
package util
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"crypto/md5"
|
|
|
|
|
"crypto/sha256"
|
|
|
|
|
"encoding/hex"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/url"
|
|
|
|
|
"reflect"
|
|
|
|
|
"regexp"
|
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"github.com/liangdas/mqant/log"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
key = "HXSQnFRhs1v1cEty"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// UnPackMD5 统一的解析方法
|
|
|
|
|
func UnPackMD5(body []byte) string {
|
|
|
|
|
pkg := rawPack{}
|
|
|
|
|
if err := json.Unmarshal(body, &pkg); err != nil {
|
|
|
|
|
log.Error("umarshal msg fail %v", err)
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
sign := pkg.Sign
|
|
|
|
|
data := pkg.Data
|
|
|
|
|
if CalculateMD5(data) != sign {
|
|
|
|
|
log.Error("check sign fail")
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
return data
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type rawPack struct {
|
|
|
|
|
Sign string
|
|
|
|
|
Data string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CalculateMD5 calculate md5
|
|
|
|
|
func CalculateMD5(data string) string {
|
|
|
|
|
h := md5.New()
|
|
|
|
|
h.Write([]byte(data))
|
|
|
|
|
return hex.EncodeToString(h.Sum(nil))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CalculateSHA256(input string) string {
|
|
|
|
|
hasher := sha256.New()
|
|
|
|
|
hasher.Write([]byte(input))
|
|
|
|
|
hashBytes := hasher.Sum(nil)
|
|
|
|
|
|
|
|
|
|
// Convert the hash bytes to a hexadecimal string
|
|
|
|
|
hashString := hex.EncodeToString(hashBytes)
|
|
|
|
|
|
|
|
|
|
return hashString
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// HttpUseProxy 使用代理请求
|
|
|
|
|
func HttpUseProxy(proxyURL, target string, ret interface{}) error {
|
|
|
|
|
uri, err := url.Parse(proxyURL)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("parse url error: ", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
client := http.Client{
|
|
|
|
|
Transport: &http.Transport{
|
|
|
|
|
// 设置代理
|
|
|
|
|
Proxy: http.ProxyURL(uri),
|
|
|
|
|
},
|
|
|
|
|
Timeout: 5 * time.Second,
|
|
|
|
|
}
|
|
|
|
|
log.Debug("reqURL:%v", target)
|
|
|
|
|
resp, err := client.Get(target)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("get err:%v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
// log.Debug("ret:%v", resp)
|
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
|
|
log.Error("req fail err code:%v", resp.StatusCode)
|
|
|
|
|
return errors.New("http req fail")
|
|
|
|
|
}
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
data, err := ioutil.ReadAll(resp.Body)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("read err %v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if err := json.Unmarshal(data, ret); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// HttpGet Get请求
|
|
|
|
|
func HttpGet(target string, ret interface{}) error {
|
|
|
|
|
client := http.Client{
|
|
|
|
|
Timeout: 5 * time.Second,
|
|
|
|
|
}
|
|
|
|
|
resp, err := client.Get(target)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("get err:%v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
|
|
log.Error("req fail err code:%v", resp.StatusCode)
|
|
|
|
|
return errors.New("http req fail")
|
|
|
|
|
}
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
data, err := ioutil.ReadAll(resp.Body)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("read err %v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
log.Debug("resp:%v", string(data))
|
|
|
|
|
if err := json.Unmarshal(data, ret); err != nil {
|
|
|
|
|
log.Error("Unmarshal err %v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// HttpPost post请求
|
|
|
|
|
func HttpPost(target string, send, ret interface{}, header map[string]string) error {
|
|
|
|
|
reqStr, _ := json.Marshal(send)
|
|
|
|
|
log.Debug("Post to:%v,req:%v", target, string(reqStr))
|
|
|
|
|
req, err := http.NewRequest("POST", target, bytes.NewBuffer(reqStr))
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("err:%v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
for k, v := range header {
|
|
|
|
|
req.Header.Set(k, v)
|
|
|
|
|
}
|
|
|
|
|
// req.Header.Set("Accept", "application/problem+json")
|
|
|
|
|
// req.Header.Set("Authorization", "api-key "+config.GetConfig().Web.OrangePay.APISecret)
|
|
|
|
|
// req.Header.Set("Authorization", "api-key "+OrangeAPISecret)
|
|
|
|
|
|
|
|
|
|
client := &http.Client{
|
|
|
|
|
Timeout: 20 * time.Second,
|
|
|
|
|
}
|
|
|
|
|
log.Debug("req:%+v", req)
|
|
|
|
|
resp, err := client.Do(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("http post call err:%v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
// if resp.StatusCode != http.StatusOK {
|
|
|
|
|
// log.Error("req fail err code:%v", resp.StatusCode)
|
|
|
|
|
// return errors.New("http req fail")
|
|
|
|
|
// }
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
body, _ := ioutil.ReadAll(resp.Body)
|
|
|
|
|
log.Debug("response Body:%v", string(body))
|
|
|
|
|
if err := json.Unmarshal(body, ret); err != nil {
|
|
|
|
|
log.Error("unmarshal fail err:%v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// HttpPostForm post请求
|
|
|
|
|
func HttpPostForm(target string, send, ret interface{}, header map[string]string) error {
|
|
|
|
|
log.Debug("send:%+v", send)
|
|
|
|
|
uv := url.Values{}
|
|
|
|
|
typ := reflect.TypeOf(send).Elem()
|
|
|
|
|
val := reflect.ValueOf(send).Elem()
|
|
|
|
|
for i := 0; i < typ.NumField(); i++ {
|
|
|
|
|
if val.Field(i).IsZero() {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
uv.Add(typ.Field(i).Tag.Get("json"), fmt.Sprintf("%v", val.Field(i).Interface()))
|
|
|
|
|
}
|
|
|
|
|
log.Debug("uv:%v", uv)
|
|
|
|
|
// ul += fmt.Sprintf("%v=%v", "sign", util.CalculateMD5(oid+strconv.Itoa(apiReq.AdvChannel)+apiReq.ClientDate+apiReq.Money+values.ZYAppKey))
|
|
|
|
|
|
|
|
|
|
req, err := http.NewRequest("POST", target, strings.NewReader(uv.Encode()))
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("err:%v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
|
|
|
|
// req.Header.Set("Accept", "application/problem+json")
|
|
|
|
|
// req.Header.Set("Authorization", "api-key "+config.GetConfig().Web.OrangePay.APISecret)
|
|
|
|
|
// req.Header.Set("Authorization", "api-key "+OrangeAPISecret)
|
|
|
|
|
|
|
|
|
|
client := &http.Client{
|
|
|
|
|
Timeout: 5 * time.Second,
|
|
|
|
|
}
|
|
|
|
|
log.Debug("req:%+v", req)
|
|
|
|
|
resp, err := client.Do(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("http post call err:%v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
// if resp.StatusCode != http.StatusOK {
|
|
|
|
|
// log.Error("req fail err code:%v", resp.StatusCode)
|
|
|
|
|
// return errors.New("http req fail")
|
|
|
|
|
// }
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
body, _ := ioutil.ReadAll(resp.Body)
|
|
|
|
|
log.Debug("response Body%v:", string(body))
|
|
|
|
|
if err := json.Unmarshal(body, ret); err != nil {
|
|
|
|
|
log.Error("unmarshal fail err:%v", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func ParseFormReq(va url.Values, req interface{}) {
|
|
|
|
|
typ := reflect.TypeOf(req).Elem()
|
|
|
|
|
val := reflect.ValueOf(req).Elem()
|
|
|
|
|
for i := 0; i < typ.NumField(); i++ {
|
|
|
|
|
one := val.Field(i)
|
|
|
|
|
value := va.Get(typ.Field(i).Tag.Get("json"))
|
|
|
|
|
if value == "" {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if one.Kind() == reflect.Int || one.Kind() == reflect.Int64 {
|
|
|
|
|
this, err := strconv.Atoi(value)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("err:%v", err)
|
|
|
|
|
}
|
|
|
|
|
one.SetInt(int64(this))
|
|
|
|
|
} else if one.Kind() == reflect.Float32 || one.Kind() == reflect.Float64 {
|
|
|
|
|
this, err := strconv.ParseFloat(value, 64)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("err:%v", err)
|
|
|
|
|
}
|
|
|
|
|
one.SetFloat(this)
|
|
|
|
|
} else if one.Kind() == reflect.Bool {
|
|
|
|
|
this, err := strconv.ParseBool(value)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error("err:%v", err)
|
|
|
|
|
}
|
|
|
|
|
one.SetBool(this)
|
|
|
|
|
} else {
|
|
|
|
|
one.SetString(value)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 将http的请求头替换为https
|
|
|
|
|
func ReplaceHTTPWithHTTPS(text string) string {
|
|
|
|
|
// 创建正则表达式,用于匹配 HTTP 链接
|
|
|
|
|
httpPattern := regexp.MustCompile(`http://[^\s]+`)
|
|
|
|
|
|
|
|
|
|
// 将 HTTP 替换为 HTTPS
|
|
|
|
|
httpsText := httpPattern.ReplaceAllStringFunc(text, func(match string) string {
|
|
|
|
|
httpsURL := "https" + strings.TrimPrefix(match, "http")
|
|
|
|
|
return httpsURL
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return httpsText
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func CheckRequestBody(c *gin.Context) (bool, []byte) {
|
|
|
|
|
// 读取请求体
|
|
|
|
|
bodyBytes, err := ioutil.ReadAll(c.Request.Body)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return false, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 恢复请求体的内容,以便后续处理
|
|
|
|
|
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
|
|
|
|
|
|
|
|
|
|
// 检查请求体长度
|
|
|
|
|
if len(bodyBytes) == 0 {
|
|
|
|
|
return false, nil
|
|
|
|
|
}
|
|
|
|
|
return true, bodyBytes
|
|
|
|
|
}
|