|
|
@@ -1,43 +1,51 @@
|
|
|
package asign
|
|
|
|
|
|
import (
|
|
|
+ "bytes"
|
|
|
+ "crypto"
|
|
|
+ "crypto/md5"
|
|
|
+ "crypto/rand"
|
|
|
+ "crypto/rsa"
|
|
|
+ "crypto/sha1"
|
|
|
+ "crypto/x509"
|
|
|
+ "encoding/base64"
|
|
|
+ "encoding/hex"
|
|
|
"encoding/json"
|
|
|
+ "encoding/pem"
|
|
|
+ "fmt"
|
|
|
+ "io"
|
|
|
+ "mime/multipart"
|
|
|
"mtp2_if/config"
|
|
|
"mtp2_if/logger"
|
|
|
+ "net/http"
|
|
|
+ "reflect"
|
|
|
+ "sort"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
|
|
|
"github.com/fatih/structs"
|
|
|
)
|
|
|
|
|
|
-// APIPersonBankCard4 个人银行卡四要素认证
|
|
|
-func APIPersonBankCard4(req APIPersonBankCard4Req) (rsp *APIRsp[APIBankCard4Rsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/auth/person/bankCard4"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
- if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
- return
|
|
|
+func APIPost[T1 APIReqData, T2 APIRspData](req APIReq[T1], apiPort APIURL) (rsp *APIRsp[T2], err error) {
|
|
|
+ apiUrl := config.SerCfg.AsignCfg.Url + string(apiPort)
|
|
|
+
|
|
|
+ var rspBody []byte
|
|
|
+ if len(req.Datas) > 0 {
|
|
|
+ // 数组入参
|
|
|
+ reqArray := make([]map[string]interface{}, 0)
|
|
|
+ for _, item := range req.Datas {
|
|
|
+ reqArray = append(reqArray, structs.Map(item))
|
|
|
+ }
|
|
|
+ logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqArray)
|
|
|
+ rspBody, err = httpPost_Array(apiUrl, reqArray)
|
|
|
+ } else {
|
|
|
+ // 对象入参
|
|
|
+ reqMap := structs.Map(req.Data)
|
|
|
+ logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
+ rspBody, err = httpPost(apiUrl, reqMap)
|
|
|
}
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APIBankCard4Rsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
-
|
|
|
- return
|
|
|
-}
|
|
|
|
|
|
-// APICompanyBankCard4 企业法人银行卡四要素认证
|
|
|
-func APICompanyBankCard4(req APICompanyBankCard4Req) (rsp *APIRsp[APIBankCard4Rsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/auth/company/bankCard4"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
if err != nil {
|
|
|
logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
return
|
|
|
@@ -48,218 +56,213 @@ func APICompanyBankCard4(req APICompanyBankCard4Req) (rsp *APIRsp[APIBankCard4Rs
|
|
|
return
|
|
|
}
|
|
|
logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APIBankCard4Rsp])
|
|
|
+ rsp = new(APIRsp[T2])
|
|
|
err = json.Unmarshal(rspBody, rsp)
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// APICaptchaVerify 认证验证码校验
|
|
|
-func APICaptchaResend(req APICaptchaResendReq) (rsp *APIRsp[interface{}], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/auth/captcha/resend"
|
|
|
+func httpPost(apiUrl string, bizData map[string]interface{}) (rspBody []byte, err error) {
|
|
|
+ appId := config.SerCfg.AsignCfg.AppId
|
|
|
+ privateKey := fmt.Sprintf("-----BEGIN PRIVATE KEY-----\n%s\n-----END PRIVATE KEY-----", config.SerCfg.AsignCfg.PrivateKey)
|
|
|
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
- if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
- return
|
|
|
- }
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[interface{}])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
+ // fuck asign dev.
|
|
|
+ timestamp := strconv.Itoa(int(time.Now().UnixMilli() + 10000*60))
|
|
|
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-// APICaptchaVerify 认证验证码校验
|
|
|
-func APICaptchaVerify(req APICaptchaVerifyReq) (rsp *APIRsp[APICaptchaVerifyRsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/auth/captcha/verify"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
+ // 签名
|
|
|
+ sortedData := sortMapByKey(bizData)
|
|
|
+ signature, err := getSignature(sortedData, appId, timestamp, privateKey)
|
|
|
if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
+ logger.GetLogger().Errorf("签名失败:" + err.Error())
|
|
|
return
|
|
|
}
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
- return
|
|
|
- }
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APICaptchaVerifyRsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-// APIGetUser 查询用户信息
|
|
|
-func APIGetUser(req APIGetUserReq) (rsp *APIRsp[[]APIGetUserRsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/user/getUser"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
+ // 构建form-data请求参数
|
|
|
+ var requestBody bytes.Buffer
|
|
|
+ multipartWriter := multipart.NewWriter(&requestBody)
|
|
|
+ multipartWriter.WriteField("appId", appId)
|
|
|
+ multipartWriter.WriteField("timestamp", timestamp)
|
|
|
+ multipartWriter.WriteField("bizData", sortedData)
|
|
|
+ multipartWriter.Close()
|
|
|
+ // 构建请求
|
|
|
+ req, err := http.NewRequest("POST", apiUrl, &requestBody)
|
|
|
+ // 设置请求头
|
|
|
+ req.Header.Set("sign", signature)
|
|
|
+ req.Header.Set("timestamp", timestamp)
|
|
|
+ req.Header.Set("Content-Type", multipartWriter.FormDataContentType())
|
|
|
+
|
|
|
+ // 调用接口
|
|
|
+ client := &http.Client{}
|
|
|
+ rsp, err := client.Do(req)
|
|
|
if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
+ logger.GetLogger().Errorf("调用接口失败:" + err.Error())
|
|
|
return
|
|
|
}
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[[]APIGetUserRsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
+ defer rsp.Body.Close()
|
|
|
+ rspBody, err = io.ReadAll(rsp.Body)
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// APIAddPersonalUser 添加个人用户(V2)
|
|
|
-func APIAddPersonalUser(req APIAddPersonalUserReq) (rsp *APIRsp[APIAddUserRsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/v2/user/addPersonalUser"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
- if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
- return
|
|
|
+// bizData入参为数组
|
|
|
+func httpPost_Array(apiUrl string, bizData []map[string]interface{}) (rspBody []byte, err error) {
|
|
|
+ appId := config.SerCfg.AsignCfg.AppId
|
|
|
+ privateKey := fmt.Sprintf("-----BEGIN PRIVATE KEY-----\n%s\n-----END PRIVATE KEY-----", config.SerCfg.AsignCfg.PrivateKey)
|
|
|
+
|
|
|
+ // fuck asign dev.
|
|
|
+ timestamp := strconv.Itoa(int(time.Now().UnixMilli() + 10000*60))
|
|
|
+
|
|
|
+ // 签名
|
|
|
+ sortedData := "["
|
|
|
+ for i, item := range bizData {
|
|
|
+ if i > 0 {
|
|
|
+ sortedData += ","
|
|
|
+ }
|
|
|
+ sortedData += sortMapByKey(item)
|
|
|
}
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
- return
|
|
|
- }
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APIAddUserRsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
+ sortedData += "]"
|
|
|
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-// APIAddEnterpriseUser 添加企业用户(V2)
|
|
|
-func APIAddEnterpriseUser(req APIAddEnterpriseUserReq) (rsp *APIRsp[APIAddUserRsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/v2/user/addEnterpriseUser"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
+ signature, err := getSignature(sortedData, appId, timestamp, privateKey)
|
|
|
if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
+ logger.GetLogger().Errorf("签名失败:" + err.Error())
|
|
|
return
|
|
|
}
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
- return
|
|
|
- }
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APIAddUserRsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
-
|
|
|
- return
|
|
|
-}
|
|
|
|
|
|
-// APITemplateList 查询模板列表
|
|
|
-func APITemplateList(req APITemplateListReq) (rsp *APIRsp[APITemplateListRsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/template/list"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
+ // 构建form-data请求参数
|
|
|
+ var requestBody bytes.Buffer
|
|
|
+ multipartWriter := multipart.NewWriter(&requestBody)
|
|
|
+ multipartWriter.WriteField("appId", appId)
|
|
|
+ multipartWriter.WriteField("timestamp", timestamp)
|
|
|
+ multipartWriter.WriteField("bizData", sortedData)
|
|
|
+ multipartWriter.Close()
|
|
|
+ // 构建请求
|
|
|
+ req, err := http.NewRequest("POST", apiUrl, &requestBody)
|
|
|
+ // 设置请求头
|
|
|
+ req.Header.Set("sign", signature)
|
|
|
+ req.Header.Set("timestamp", timestamp)
|
|
|
+ req.Header.Set("Content-Type", multipartWriter.FormDataContentType())
|
|
|
+
|
|
|
+ // 调用接口
|
|
|
+ client := &http.Client{}
|
|
|
+ rsp, err := client.Do(req)
|
|
|
if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
+ logger.GetLogger().Errorf("调用接口失败:" + err.Error())
|
|
|
return
|
|
|
}
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APITemplateListRsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
+ defer rsp.Body.Close()
|
|
|
+ rspBody, err = io.ReadAll(rsp.Body)
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// APICreateContract 上传待签署文件
|
|
|
-func APICreateContract(req APICreateContractReq) (rsp *APIRsp[APICreateContractRsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/contract/createContract"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
+// 签名规范:
|
|
|
+// 1、表单提交方式:form-data
|
|
|
+// 示例:1B2M2Y8AsgTpgAmY7PhCfg==
|
|
|
+// 2、请求头部参数
|
|
|
+// 参数1:sign(签名值,具体算法参考一下的前面算法)
|
|
|
+// 参数2:timestamp(时间戳,13位)
|
|
|
+// 3、请求体参数:
|
|
|
+// 参数1:appId(appId值,每个接入者唯一一个)
|
|
|
+// 参数2:timestamp(时间戳,13位,与上述一致)
|
|
|
+// 参数3:bizData(json字符串,举个例子,比方说要传合同编号如:{"contractNo":"0001"})
|
|
|
+// 4、签名算法:
|
|
|
+// 4.1、将上述3所属的bizData(json字符串),按照阿拉伯字母排序(如:{"ba":1,"ac":2}--->{"ac":2,"ba":1}),
|
|
|
+// 4.2、将4.1排序后的字符串,将【bizData+md5(bizData)+ appId + timestatmp】拼接后利用RSA非对称加密算法(SHA1withRSA),计算出最后的签名sign,对其base64编码,放入head的key(sign)中。
|
|
|
+//
|
|
|
+// String sign ;
|
|
|
+// String rsaSuffix = jsonStr + DigestUtils.md5Hex ( jsonStr ) + appId + timestatmp ;
|
|
|
+// byte [] bytes = RSAUtils.generateSHA1withRSASignature ( rsaSuffix, privateKey ) ;
|
|
|
+// try {
|
|
|
+// sign = Base64Utils.encode ( bytes ) ;
|
|
|
+// sign = sign.replaceAll ( " \r\n" , "" ) ;
|
|
|
+// } catch ( Exception e ) {
|
|
|
+// log.error( "sdk异常", e ) ;
|
|
|
+// return ApiRespBody.create ( ApiResponseInfo. _ERROR ) ;
|
|
|
+// }
|
|
|
+func getSignature(sortedData string, appId, timestamp, privateKey string) (signature string, err error) {
|
|
|
+ pem10, _ := pem.Decode([]byte(privateKey))
|
|
|
+ privateKey10I, _ := x509.ParsePKCS8PrivateKey(pem10.Bytes)
|
|
|
+ privateKey10 := privateKey10I.(*rsa.PrivateKey)
|
|
|
+
|
|
|
+ // md5(bizData)
|
|
|
+ m := md5.New()
|
|
|
+ m.Write([]byte(sortedData))
|
|
|
+ bdMd5Hx := hex.EncodeToString(m.Sum(nil))
|
|
|
+
|
|
|
+ // 待签内容
|
|
|
+ message := sortedData + bdMd5Hx + appId + timestamp
|
|
|
+ h := sha1.New()
|
|
|
+ h.Write([]byte(message))
|
|
|
+ sum := h.Sum(nil)
|
|
|
+
|
|
|
+ // 使用私钥进行签名
|
|
|
+ sign, err := rsa.SignPKCS1v15(rand.Reader, privateKey10, crypto.SHA1, sum)
|
|
|
if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
+ fmt.Println("Error signing:", err)
|
|
|
return
|
|
|
}
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APICreateContractRsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
-
|
|
|
- return
|
|
|
-}
|
|
|
|
|
|
-// APIAddSigner 添加签署方
|
|
|
-func APIAddSigner(req []APIAddSignerReq) (rsp *APIRsp[APIAddSignerRsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/contract/addSigner"
|
|
|
-
|
|
|
- reqArray := make([]map[string]interface{}, 0)
|
|
|
- for _, item := range req {
|
|
|
- reqArray = append(reqArray, structs.Map(item))
|
|
|
- }
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqArray)
|
|
|
- rspBody, err := HttpPost2(apiUrl, reqArray)
|
|
|
- if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
- return
|
|
|
- }
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APIAddSignerRsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
+ // fmt.Println(signature)
|
|
|
+ signature = base64.StdEncoding.EncodeToString(sign)
|
|
|
+ signature = strings.ReplaceAll(signature, "\r\n", "")
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// APIContractStatus 查询合同状态
|
|
|
-func APIContractStatus(req APIContractStatusReq) (rsp *APIRsp[APIContractStatusRsp], err error) {
|
|
|
- apiUrl := config.SerCfg.AsignCfg.Url + "/contract/status"
|
|
|
-
|
|
|
- reqMap := structs.Map(req)
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 请求, request:", reqMap)
|
|
|
- rspBody, err := HttpPost(apiUrl, reqMap)
|
|
|
- if err != nil {
|
|
|
- logger.GetLogger().Error("调用接口 "+apiUrl+" 错误, error:", err.Error())
|
|
|
- return
|
|
|
+// sortMapByKey 按key排序map返回string
|
|
|
+func sortMapByKey(data map[string]interface{}) (sortedData string) {
|
|
|
+ keys := make([]string, 0, len(data))
|
|
|
+ for k := range data {
|
|
|
+ keys = append(keys, k)
|
|
|
}
|
|
|
- rspStr := string(rspBody)
|
|
|
- if len(rspStr) == 0 {
|
|
|
- logger.GetLogger().Error("调用接口 " + apiUrl + " 错误, response为空")
|
|
|
- return
|
|
|
+ sort.Strings(keys)
|
|
|
+ for i, k := range keys {
|
|
|
+ if i > 0 {
|
|
|
+ sortedData += ","
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否指针
|
|
|
+ v := reflect.ValueOf(data[k])
|
|
|
+ if v.Kind() == reflect.Ptr {
|
|
|
+ switch data[k].(type) {
|
|
|
+ case *string:
|
|
|
+ sortedData += fmt.Sprintf(`"%s":"%s"`, k, *(data[k].(*string)))
|
|
|
+ case *map[string]interface{}:
|
|
|
+ sortedData += fmt.Sprintf(`"%s":%s`, k, sortMapByKey(*(data[k].(*map[string]interface{}))))
|
|
|
+ case *[]interface{}:
|
|
|
+ list := data[k].([]interface{})
|
|
|
+ sortedData += fmt.Sprintf(`"%s":[`, k)
|
|
|
+ for j, item := range list {
|
|
|
+ if j > 0 {
|
|
|
+ sortedData += ","
|
|
|
+ }
|
|
|
+ sortedData += sortMapByKey(item.(map[string]interface{}))
|
|
|
+ }
|
|
|
+ sortedData += "]"
|
|
|
+ default:
|
|
|
+ sortedData += fmt.Sprintf(`"%s":%v`, k, reflect.ValueOf(data[k]).Elem())
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ switch data[k].(type) {
|
|
|
+ case string:
|
|
|
+ sortedData += fmt.Sprintf(`"%s":"%s"`, k, data[k].(string))
|
|
|
+ case map[string]interface{}:
|
|
|
+ sortedData += fmt.Sprintf(`"%s":%s`, k, sortMapByKey(data[k].(map[string]interface{})))
|
|
|
+ case []interface{}:
|
|
|
+ list := data[k].([]interface{})
|
|
|
+ sortedData += fmt.Sprintf(`"%s":[`, k)
|
|
|
+ for j, item := range list {
|
|
|
+ if j > 0 {
|
|
|
+ sortedData += ","
|
|
|
+ }
|
|
|
+ sortedData += sortMapByKey(item.(map[string]interface{}))
|
|
|
+ }
|
|
|
+ sortedData += "]"
|
|
|
+ default:
|
|
|
+ sortedData += fmt.Sprintf(`"%s":%v`, k, data[k])
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- logger.GetLogger().Info("调用接口 "+apiUrl+" 返回, response:", rspStr)
|
|
|
- rsp = new(APIRsp[APIContractStatusRsp])
|
|
|
- err = json.Unmarshal(rspBody, rsp)
|
|
|
|
|
|
- return
|
|
|
+ return fmt.Sprintf("{%s}", sortedData)
|
|
|
}
|