Files
baseapi/platformapi/fnpsapi_v3/fnpsapi.go
2022-03-18 14:08:15 +08:00

115 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package fnpsapi
import (
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi"
"net/http"
"strings"
"sync"
"time"
"git.rosy.net.cn/baseapi/platformapi"
"git.rosy.net.cn/baseapi/utils"
)
func (a *API) SetToken(token string) {
a.locker.Lock()
defer a.locker.Unlock()
a.accessToken = token
}
func (a *API) MakeFnRequestHead() map[string]interface{} {
requestParam := make(map[string]interface{}, 6)
requestParam["access_token"] = a.accessToken
requestParam["signature"] = a.signature
requestParam["merchant_id"] = a.merchantId
requestParam["version"] = a.version
requestParam["app_id"] = a.appID
requestParam["timestamp"] = a.timestamp
return requestParam
}
func New(appID, appSecret, merchantId string, config ...*platformapi.APIConfig) *API {
curConfig := platformapi.DefAPIConfig
if len(config) > 0 {
curConfig = *config[0]
}
return &API{
grantType: "authorization_code", // 授权模式填固定值authorization_code
code: "cod3",
appID: appID,
merchantId: merchantId,
signature: "",
timestamp: time.Now().UnixNano(),
accessToken: "",
appSecret: appSecret,
locker: sync.RWMutex{},
client: &http.Client{Timeout: curConfig.ClientTimeout},
config: &curConfig,
}
}
// signParam2 apiV3签名算法SHA-256
func (a *API) signParam2() (sig string) {
sb := new(strings.Builder)
sb.WriteString("grant_type=")
sb.WriteString(a.grantType)
sb.WriteString("&code=")
sb.WriteString(a.code) //todo
sb.WriteString("&app_id=")
sb.WriteString(a.appID)
sb.WriteString("&merchant_id=")
sb.WriteString(a.merchantId)
sb.WriteString("&timestamp=")
sb.WriteString(utils.Int64ToStr(a.timestamp))
sig = sb.String()
sig = base64.StdEncoding.EncodeToString(sha256.New().Sum([]byte(sig)))
return sig
}
func (a *API) AccessAPI(baseUrl, actionApi, method string, bizParams map[string]interface{}) (retVal map[string]interface{}, err error) {
// 序列化
data, err := json.Marshal(bizParams)
if err != nil {
return nil, err
}
// 全路径请求参数
fullURL := utils.GenerateGetURL(baseUrl, actionApi, nil)
// 发送请求
sendUrl := func() *http.Request {
var request *http.Request
if method == "POST" {
request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(string(data)))
} else {
request, _ = http.NewRequest(http.MethodGet, utils.GenerateGetURL(baseUrl, actionApi, bizParams), nil)
}
request.Header.Set("Content-Type", "application/json")
return request
}
// 数据解析
dataMarshal := 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 {
return "", err
}
if utils.MustInterface2Int64(jsonResult1["code"]) != 200 {
errLevel = platformapi.ErrLevelGeneralFail
err = utils.NewErrorCode(jsonResult1["msg"].(string), utils.Int64ToStr(utils.MustInterface2Int64(jsonResult1["code"])))
baseapi.SugarLogger.Debugf("fnps AccessAPI failed, jsonResult1:%s", utils.Format4Output(jsonResult1, true))
}
retVal = jsonResult1
return errLevel, err
}
err = platformapi.AccessPlatformAPIWithRetry(a.client, sendUrl, a.config, dataMarshal)
return retVal, err
}