From 0aa0655556379ea3dec9c2ca5a6b5ca04a7f61ff Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 9 Apr 2019 11:37:04 +0800 Subject: [PATCH] - xiaowm api --- platformapi/platformapi.go | 2 +- platformapi/xiaowmapi/xiaowmapi.go | 160 ++++++++++++++++++++++++ platformapi/xiaowmapi/xiaowmapi_test.go | 61 +++++++++ 3 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 platformapi/xiaowmapi/xiaowmapi.go create mode 100644 platformapi/xiaowmapi/xiaowmapi_test.go diff --git a/platformapi/platformapi.go b/platformapi/platformapi.go index eff41e00..5815cf37 100644 --- a/platformapi/platformapi.go +++ b/platformapi/platformapi.go @@ -151,12 +151,12 @@ func AccessPlatformAPIWithRetry(client *http.Client, handleRequest func() *http. baseapi.SugarLogger.Infof("AccessPlatformAPIWithRetry:%s TryUnmarshalUseNumber failed, url:%v, request:%v, error:%v, bodyData:%s", trackID, request.URL, getClonedData(request.URL, savedBuf), err, string(bodyData2)) } + baseapi.SugarLogger.Debugf("AccessPlatformAPIWithRetry:%s url:%v, response:%s", trackID, request.URL, utils.Format4Output(bodyMap, true)) if err != nil { errLevel = ErrLevelRecoverableErr // 读取数据错误,或数据格式错误认为是偶发情况,重试 } else { errLevel, err = handleResponse(bodyMap) } - baseapi.SugarLogger.Debugf("AccessPlatformAPIWithRetry:%s url:%v, response:%s", trackID, request.URL, utils.Format4Output(bodyMap, true)) if err == nil { return nil } else if errLevel == ErrLevelExceedLimit { diff --git a/platformapi/xiaowmapi/xiaowmapi.go b/platformapi/xiaowmapi/xiaowmapi.go new file mode 100644 index 00000000..166312f9 --- /dev/null +++ b/platformapi/xiaowmapi/xiaowmapi.go @@ -0,0 +1,160 @@ +package xiaowmapi + +import ( + "bytes" + "net/http" + + "git.rosy.net.cn/baseapi" + "git.rosy.net.cn/baseapi/platformapi" + "git.rosy.net.cn/baseapi/utils" +) + +const ( + prodURL = "http://open.xiaowm.com" +) + +const ( + // ResponseCodeSuccess 操作成功 + ResponseCodeSuccess = 0 +) + +const ( + RunningStateOfflineStr = "正常运行" + RunningStateNormalStr = "掉线" + RunningStateOffline = 0 + RunningStateNormal = 1 + + PaperStateLackPaperStr = "缺纸" + PaperStateNormalStr = "正常" + PaperStateLackPaper = 0 + PaperStateNormal = 1 +) + +var ( + exceedLimitCodes = map[int]int{} + canRetryCodes = map[int]int{} + + stateMap = map[string]int{ + RunningStateOfflineStr: RunningStateOffline, + RunningStateNormalStr: RunningStateNormal, + PaperStateLackPaperStr: PaperStateLackPaper, + PaperStateNormalStr: PaperStateNormal, + } +) + +type API struct { + appID int // 应用ID + appKey string // 应用编号 + client *http.Client + config *platformapi.APIConfig +} + +func New(appID int, appKey string, config ...*platformapi.APIConfig) *API { + curConfig := platformapi.DefAPIConfig + if len(config) > 0 { + curConfig = *config[0] + } + return &API{ + appID: appID, + appKey: appKey, + client: &http.Client{Timeout: curConfig.ClientTimeout}, + config: &curConfig, + } +} + +func (a *API) AccessAPI(apiName string, apiParams map[string]interface{}) (retVal map[string]interface{}, err error) { + params := utils.MergeMaps(map[string]interface{}{ + "app_key": a.appKey, + }, apiParams) + + err = platformapi.AccessPlatformAPIWithRetry(a.client, + func() *http.Request { + request, _ := http.NewRequest(http.MethodPost, utils.GenerateGetURL(prodURL, apiName, nil), bytes.NewReader(utils.MustMarshal(params))) + request.Header.Set("charset", "UTF-8") + request.Header.Set("Content-Type", "application/json") + + // request.Close = true //todo 为了性能考虑还是不要关闭 + return request + }, + a.config, + func(jsonResult1 map[string]interface{}) (errLevel string, err error) { + code := int(utils.Interface2Int64WithDefault(jsonResult1["errno"], ResponseCodeSuccess)) + if code == ResponseCodeSuccess { + retVal = jsonResult1 + return platformapi.ErrLevelSuccess, nil + } + newErr := utils.NewErrorIntCode(jsonResult1["msg"].(string), code) + if _, ok := exceedLimitCodes[code]; ok { + return platformapi.ErrLevelExceedLimit, newErr + } else if _, ok := canRetryCodes[code]; ok { + return platformapi.ErrLevelRecoverableErr, newErr + } else { + baseapi.SugarLogger.Debugf("xiaowm AccessAPI failed, jsonResult1:%s", utils.Format4Output(jsonResult1, true)) + return platformapi.ErrLevelCodeIsNotOK, newErr + } + }) + return retVal, err +} + +func (a *API) AuthPrinter(printerNumber, pwd, extends string) (printerToken string, err error) { + if pwd == "" { + pwd = "888888" // 缺省密码 + } + params := map[string]interface{}{ + "number": printerNumber, + "app_id": a.appID, + "pwd": pwd, + } + if extends != "" { + params["extends"] = extends + } + result, err := a.AccessAPI("Auth_api/auth", params) + if err == nil { + return utils.Interface2String(result["data"].(map[string]interface{})["token"]), nil + } + return "", err +} + +func (a *API) DelPrinter(printerNumber, printerToken string) (err error) { + _, err = a.AccessAPI("Auth_api/delete", map[string]interface{}{ + "number": printerNumber, + "token": printerToken, + }) + return err +} + +func (a *API) SendMsg(printerNumber, printerToken, msg string) (msgID string, err error) { + result, err := a.AccessAPI("Api/send_msg", map[string]interface{}{ + "number": printerNumber, + "token": printerToken, + "msg": msg, + }) + if err == nil { + return utils.Interface2String(result["msg_id"]), nil + } + return "", err +} + +func (a *API) GetPrinterStatus(printerNumber, printerToken string) (runningState, paperState int, err error) { + result, err := a.AccessAPI("Api/get_printer_status", map[string]interface{}{ + "number": printerNumber, + "token": printerToken, + }) + if err == nil { + data := result["data"].(map[string]interface{}) + return stateMap[utils.Interface2String(data["running_state"])], stateMap[utils.Interface2String(data["paper_state"])], nil + } + return 0, 0, err +} + +func (a *API) GetMsgStatus(printerNumber, printerToken, msgID string) (msgStatus string, err error) { + result, err := a.AccessAPI("Api/get_msg_status", map[string]interface{}{ + "number": printerNumber, + "token": printerToken, + "msg_id": msgID, + }) + if err == nil { + return utils.Interface2String(result["msg"]), nil + } + return "", err +} diff --git a/platformapi/xiaowmapi/xiaowmapi_test.go b/platformapi/xiaowmapi/xiaowmapi_test.go new file mode 100644 index 00000000..6290af28 --- /dev/null +++ b/platformapi/xiaowmapi/xiaowmapi_test.go @@ -0,0 +1,61 @@ +package xiaowmapi + +import ( + "testing" + + "git.rosy.net.cn/baseapi" + + "go.uber.org/zap" +) + +var ( + api *API + sugarLogger *zap.SugaredLogger +) + +func init() { + logger, _ := zap.NewDevelopment() + sugarLogger = logger.Sugar() + baseapi.Init(sugarLogger) + + api = New(267, "94337") +} + +func TestPrinterAuth(t *testing.T) { + result, err := api.AuthPrinter("7JizmSyiXNzkggaqU", "", "") + if err != nil { + t.Fatalf("PrinterAuth return error:%v", err) + } + t.Log(result) +} + +func TestPrinterDel(t *testing.T) { + err := api.DelPrinter("7JizmSyiXNzkggaqU", "177f213277dd842ba2b53f6c926a48ea") + if err != nil { + t.Fatalf("PrinterDel return error:%v", err) + } +} + +func TestSendMsg(t *testing.T) { + result, err := api.SendMsg("7JizmSyiXNzkggaqU", "177f213277dd842ba2b53f6c926a48ea", "hello") + if err != nil { + t.Fatalf("SendMsg return error:%v", err) + } + t.Log(result) +} + +func TestGetPrinterStatus(t *testing.T) { + runningStae, paperState, err := api.GetPrinterStatus("7JizmSyiXNzkggaqU", "177f213277dd842ba2b53f6c926a48ea") + if err != nil { + t.Fatalf("GetPrinterStatus return error:%v", err) + } + t.Log(runningStae, paperState) +} + +func TestGetMsgStatus(t *testing.T) { + msgStatus, err := api.GetMsgStatus("7JizmSyiXNzkggaqU", "177f213277dd842ba2b53f6c926a48ea", "29F953F9C26C4E2D7FD1279634C72ADD") + if err != nil { + t.Fatalf("GetMsgStatus return error:%v", err) + } + t.Log(msgStatus) +}