218 lines
7.3 KiB
Go
218 lines
7.3 KiB
Go
package lakala
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
"git.rosy.net.cn/baseapi/platformapi"
|
|
"git.rosy.net.cn/baseapi/utils"
|
|
"git.rosy.net.cn/jx-callback/globals"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type API struct {
|
|
appID string
|
|
serialNo string
|
|
sM4Key string
|
|
clientId string
|
|
clientSecret string
|
|
incomingToken string // 进件相关token
|
|
incomingExpire int64 // 进件token过期时间
|
|
modifiedToken string // 改件token
|
|
modifiedExpire int64 // 改件过期时间
|
|
orgCode string // 机构代码
|
|
client *http.Client
|
|
config *platformapi.APIConfig
|
|
}
|
|
|
|
func New(appID, serialNo, sM4Key, clientId, clientSecret, incomingToken, changeToken, orgCode string, config ...*platformapi.APIConfig) *API {
|
|
curConfig := platformapi.DefAPIConfig
|
|
if len(config) > 0 {
|
|
curConfig = *config[0]
|
|
}
|
|
return &API{
|
|
appID: appID,
|
|
serialNo: serialNo,
|
|
sM4Key: sM4Key,
|
|
clientId: clientId,
|
|
clientSecret: clientSecret,
|
|
incomingToken: incomingToken,
|
|
incomingExpire: 0,
|
|
modifiedToken: changeToken,
|
|
modifiedExpire: 0,
|
|
orgCode: orgCode,
|
|
client: &http.Client{Timeout: curConfig.ClientTimeout},
|
|
config: &curConfig,
|
|
}
|
|
}
|
|
|
|
// AccessAPI form表单格式
|
|
func (a *API) AccessAPI(baseUrl, action, method string, pathParam string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) {
|
|
if action != TokenActive {
|
|
a.CheckToken()
|
|
}
|
|
err = platformapi.AccessPlatformAPIWithRetry(a.client,
|
|
func() *http.Request {
|
|
var request *http.Request
|
|
if http.MethodPost == method {
|
|
// 全路径请求参数s
|
|
fullURL := utils.GenerateGetURL(baseUrl, action, nil)
|
|
request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(utils.Map2URLValues(bizParams).Encode()))
|
|
request.Header.Set("charset", "UTF-8")
|
|
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
|
} else {
|
|
getUrl := utils.GenerateGetURL(baseUrl, action, nil)
|
|
if pathParam != "" {
|
|
getUrl = getUrl + fmt.Sprintf("/%s", pathParam)
|
|
}
|
|
if bizParams != nil {
|
|
getUrl = utils.GenerateGetURL(getUrl, "", bizParams)
|
|
}
|
|
request, _ = http.NewRequest(http.MethodGet, getUrl, nil)
|
|
}
|
|
switch IncomingTokenActive[action] {
|
|
case IncomingToken:
|
|
request.Header.Set("Authorization", fmt.Sprintf("bearer %s", a.incomingToken))
|
|
case ModifiedToken:
|
|
request.Header.Set("Authorization", fmt.Sprintf("bearer %s", a.modifiedToken))
|
|
case NotToken:
|
|
if bizParams["grant_type"].(string) == "password" {
|
|
base64Unicode := fmt.Sprintf("%s:%s", a.clientId, a.clientSecret)
|
|
request.Header.Set("Authorization", fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(base64Unicode))))
|
|
}
|
|
}
|
|
return request
|
|
},
|
|
a.config,
|
|
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
|
if jsonResult1 == nil {
|
|
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
|
}
|
|
if err == nil {
|
|
//returnCode := utils.Interface2String(jsonResult1["trxstatus"])
|
|
//if returnCode != "200" {
|
|
// errLevel = platformapi.ErrLevelGeneralFail
|
|
// err = utils.NewErrorCode(utils.Interface2String(jsonResult1["errmsg"])+utils.Interface2String(jsonResult1["retmsg"]), returnCode)
|
|
//}
|
|
retVal = jsonResult1
|
|
}
|
|
return errLevel, err
|
|
})
|
|
return retVal, err
|
|
}
|
|
|
|
// AccessAPI2 json格式
|
|
func (a *API) AccessAPI2(baseUrl, action, method string, pathParam string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) {
|
|
if action != TokenActive {
|
|
a.CheckToken()
|
|
}
|
|
err = platformapi.AccessPlatformAPIWithRetry(a.client,
|
|
func() *http.Request {
|
|
var request *http.Request
|
|
if http.MethodPost == method {
|
|
// 全路径请求参数
|
|
data, _ := json.Marshal(bizParams)
|
|
fullURL := utils.GenerateGetURL(baseUrl, action, nil)
|
|
if pathParam != "" {
|
|
fullURL = fullURL + fmt.Sprintf("/%s", pathParam)
|
|
}
|
|
request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(string(data)))
|
|
} else {
|
|
getUrl := utils.GenerateGetURL(baseUrl, action, nil)
|
|
if pathParam != "" {
|
|
getUrl = getUrl + fmt.Sprintf("/%s", pathParam)
|
|
}
|
|
if bizParams != nil {
|
|
getUrl = utils.GenerateGetURL(getUrl, "", bizParams)
|
|
}
|
|
request, _ = http.NewRequest(http.MethodGet, getUrl, nil)
|
|
}
|
|
request.Header.Set("Content-Type", "application/json")
|
|
switch IncomingTokenActive[action] {
|
|
case IncomingToken:
|
|
request.Header.Set("Authorization", fmt.Sprintf("bearer %s", a.incomingToken))
|
|
case ModifiedToken:
|
|
request.Header.Set("Authorization", fmt.Sprintf("bearer %s", a.modifiedToken))
|
|
case SignToken:
|
|
request.Header.Set("Authorization", fmt.Sprintf("LKLAPI-SHA256withRSA %s", a.modifiedToken))
|
|
case NotToken:
|
|
if bizParams["grant_type"].(string) == "password" {
|
|
base64Unicode := fmt.Sprintf("%s:%s", a.clientId, a.clientSecret)
|
|
request.Header.Set("Authorization", fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(base64Unicode))))
|
|
}
|
|
}
|
|
return request
|
|
},
|
|
a.config,
|
|
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
|
if jsonResult1 == nil {
|
|
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
|
}
|
|
if err == nil {
|
|
retVal = jsonResult1
|
|
}
|
|
return errLevel, err
|
|
})
|
|
return retVal, err
|
|
}
|
|
|
|
// AccessAPISign 支付相关需要签名
|
|
func (a *API) AccessAPISign(baseUrl, action, method string, pathParam string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) {
|
|
if action != TokenActive {
|
|
a.CheckToken()
|
|
}
|
|
Authorization, err := a.signParamPrivateKey(bizParams, LaKaLaPrivateKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
globals.SugarLogger.Debugf("------Authorization:= %s", Authorization)
|
|
err = platformapi.AccessPlatformAPIWithRetry(a.client,
|
|
func() *http.Request {
|
|
var request *http.Request
|
|
if http.MethodPost == method {
|
|
// 全路径请求参数
|
|
data, _ := json.Marshal(bizParams)
|
|
fullURL := utils.GenerateGetURL(baseUrl, action, nil)
|
|
if pathParam != "" {
|
|
fullURL = fullURL + fmt.Sprintf("/%s", pathParam)
|
|
}
|
|
request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(string(data)))
|
|
} else {
|
|
getUrl := utils.GenerateGetURL(baseUrl, action, nil)
|
|
if pathParam != "" {
|
|
getUrl = getUrl + fmt.Sprintf("/%s", pathParam)
|
|
}
|
|
if bizParams != nil {
|
|
getUrl = utils.GenerateGetURL(getUrl, "", bizParams)
|
|
}
|
|
request, _ = http.NewRequest(http.MethodGet, getUrl, nil)
|
|
}
|
|
request.Header.Set("Content-Type", "application/json")
|
|
request.Header.Set("Authorization", Authorization)
|
|
request.Header.Set("Accept", "application/json")
|
|
return request
|
|
},
|
|
a.config,
|
|
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
|
|
if jsonResult1 == nil {
|
|
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
|
|
}
|
|
if err == nil {
|
|
retVal = jsonResult1
|
|
}
|
|
return errLevel, err
|
|
})
|
|
return retVal, err
|
|
}
|
|
|
|
func (a *API) CheckToken() {
|
|
if a.incomingToken == "" || a.incomingExpire-time.Now().Unix() < 0 {
|
|
a.IncomingToken()
|
|
}
|
|
if a.modifiedToken == "" || a.modifiedExpire-time.Now().Unix() < 0 {
|
|
a.ModifiedToken(UserName, Password)
|
|
}
|
|
}
|