diff --git a/platformapi/jdapi/store_page.go b/platformapi/jdapi/store_page.go index c4e56f73..9b7d7526 100644 --- a/platformapi/jdapi/store_page.go +++ b/platformapi/jdapi/store_page.go @@ -1,9 +1,13 @@ package jdapi import ( + "bytes" "crypto/md5" "fmt" + "io/ioutil" + "mime/multipart" "net/http" + "net/url" "regexp" "strings" @@ -136,14 +140,56 @@ type PageShopInfo struct { StoreShareURL string `json:"storeShareUrl"` } -var ( - monthSaleNumReg = regexp.MustCompile(`(\d+)([千|万])`) +const ( + LincenceEconKindPerson = "个体工商户" + + QualifyTypePerson = "25" // 营业执照 + QualifyTypeCompany = "22" // 身份证,个体工商户要求填 + QualifyTypeAddInfo = "31" // 附加信息,如果身份证是长期有效,要求身份证背面信息 + + SaveQualifyActionTypeCommit = 0 // 提交 + SaveQualifyActionTypeSave = 1 // 暂时保存 ) -func (a *API) AccessStorePage(fullURL string, params map[string]interface{}, isPost bool) (retVal map[string]interface{}, err error) { +type QualifyItem struct { + QualifyURL string `json:"qualifyUrl"` + QualifyType string `json:"qualifyType"` + QualifyExpireForever int `json:"qualifyExpireForever"` // 0:永久有性,1:非永久有效(需要填QualifyExpireEnd) + QualifyExpireStart string `json:"qualifyExpireStart"` + QualifyExpireEnd string `json:"qualifyExpireEnd,omitempty"` + QualifyName string `json:"qualifyName,omitempty"` + QualifyOwner string `json:"qualifyOwner,omitempty"` + LicenceType string `json:"licenceType,omitempty"` // -1 + QualifyNumber string `json:"qualifyNumber,omitempty"` + QualifyAddress string `json:"qualifyAddress,omitempty"` + LicenceName string `json:"licenceName,omitempty"` + EconKind string `json:"econKind,omitempty"` + Scope string `json:"scope,omitempty"` +} + +var ( + monthSaleNumReg = regexp.MustCompile(`(\d+)([千|万])`) + pageExceedLimitCodes = map[string]int{ + "403": 1, + } +) + +const ( + KeyImgData = "imgData" + KeyImgName = "imgName" + + ResultKeyData = "data" + ResultKeyResult = "result" +) + +func (a *API) AccessStorePage2(fullURL string, params map[string]interface{}, isPost bool, resultKey string) (retVal interface{}, err error) { if a.GetCookieCount() == 0 { return nil, fmt.Errorf("需要设置Store Cookie才能使用此方法") } + imgData := params[KeyImgData] + if imgData != nil { + delete(params, KeyImgData) + } err = platformapi.AccessPlatformAPIWithRetry(a.client, func() *http.Request { var request *http.Request @@ -151,8 +197,26 @@ func (a *API) AccessStorePage(fullURL string, params map[string]interface{}, isP request, _ = http.NewRequest(http.MethodGet, utils.GenerateGetURL(fullURL, "", params), nil) } else { request, _ = http.NewRequest(http.MethodPost, fullURL, strings.NewReader(utils.Map2URLValues(params).Encode())) + if params[KeyImgName] == nil { + request.Header.Set("Content-Type", "application/x-www-form-urlencoded") + } else { + var b bytes.Buffer + w := multipart.NewWriter(&b) + if fw, err := w.CreateFormFile("uploadFile", params[KeyImgName].(string)); err != nil { + panic(err.Error()) + } else { + fw.Write(imgData.([]byte)) + } + for k, v := range params { + fmt.Println(k, " ", v) + w.WriteField(k, url.QueryEscape(fmt.Sprint(v))) + } + w.Close() + // b.WriteString(utils.Map2URLValues(params).Encode()) + request, _ = http.NewRequest(http.MethodPost, fullURL, &b) + request.Header.Set("Content-Type", w.FormDataContentType()) + } request.Header.Set("charset", "UTF-8") - request.Header.Set("Content-Type", "application/x-www-form-urlencoded") } if err != nil { return nil @@ -166,13 +230,18 @@ func (a *API) AccessStorePage(fullURL string, params map[string]interface{}, isP return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil") } retVal = jsonResult1 - code := jsonResult1["code"].(string) + code, ok := jsonResult1["code"].(string) + if !ok { + return platformapi.ErrLevelGeneralFail, utils.NewErrorCode(utils.Format4Output(jsonResult1, true), "999") + } if code == ResponseCodeSuccess { - retVal, _ = jsonResult1["result"].(map[string]interface{}) + if resultKey != "" { + retVal = jsonResult1[resultKey] + } return platformapi.ErrLevelSuccess, nil } newErr := utils.NewErrorCode(jsonResult1["msg"].(string), code) - if _, ok := exceedLimitCodes[code]; ok { + if _, ok := pageExceedLimitCodes[code]; ok { return platformapi.ErrLevelExceedLimit, newErr } else if _, ok := canRetryCodes[code]; ok { return platformapi.ErrLevelRecoverableErr, newErr @@ -184,6 +253,14 @@ func (a *API) AccessStorePage(fullURL string, params map[string]interface{}, isP return retVal, err } +func (a *API) AccessStorePage(fullURL string, params map[string]interface{}, isPost bool) (retVal map[string]interface{}, err error) { + result, err := a.AccessStorePage2(fullURL, params, isPost, ResultKeyResult) + if err == nil { + retVal = result.(map[string]interface{}) + } + return retVal, err +} + func (a *API) GetRealMobile4Order(orderId, stationNo string) (mobile string, err error) { retVal, err := a.GetStoreOrderInfo(orderId, stationNo) if err == nil { @@ -346,3 +423,47 @@ func MonthSaleNum2Int(monthSaleNumStr string) (monthSaleNum int) { } return monthSaleNum } + +func (a *API) StoreUploadImg(imgFileName string, imgBin []byte) (imgURL string, err error) { + result, err := a.AccessStorePage2("https://sta-store.jddj.com/store/uploadImg.json", map[string]interface{}{ + KeyImgData: imgBin, + KeyImgName: imgFileName, + }, true, ResultKeyData) + if err == nil { + imgURL = result.(string) + } + return imgURL, err +} + +func (a *API) StoreUploadImgByURL(inImgURL string) (imgURL string, err error) { + response, err := http.Get(inImgURL) + if err == nil { + defer func() { + response.Body.Close() + }() + if response.StatusCode == http.StatusOK { + bodyData, err2 := ioutil.ReadAll(response.Body) + if err = err2; err == nil { + imgName := utils.GetUUID() + if lastSlashIndex := strings.LastIndex(inImgURL, "/"); lastSlashIndex >= 0 { + imgName = inImgURL[lastSlashIndex+1:] + } + return a.StoreUploadImg(imgName, bodyData) + } + } else { + err = platformapi.ErrHTTPCodeIsNot200 + } + } + return "", err +} + +func (a *API) SaveQualify(stationNo string, actionType int, qualifyList []*QualifyItem) (err error) { + _, err = a.AccessStorePage2("https://sta-store.jddj.com/store/saveQualify.o2o", map[string]interface{}{ + "stationNo": stationNo, + "actionType": actionType, + "qualifyList": qualifyList, + "type": 1, + "degrade": "no", + }, true, "") + return err +} diff --git a/platformapi/jdapi/store_page_test.go b/platformapi/jdapi/store_page_test.go index 5e773b19..c137ee02 100644 --- a/platformapi/jdapi/store_page_test.go +++ b/platformapi/jdapi/store_page_test.go @@ -56,7 +56,7 @@ func TestGetSkuPageImageInfo(t *testing.T) { } func TestGetCorporationInfo(t *testing.T) { - imgList, err := api.GetCorporationInfo("", "915101003431062533") + imgList, err := api.GetCorporationInfo("", "92330104MA28XPXH5G") if err != nil { t.Fatal(err) } @@ -101,3 +101,91 @@ func TestMonthSaleNum2Int(t *testing.T) { t.Fatalf("num3:%d", num3) } } + +func TestStoreUploadImgByURL(t *testing.T) { + outImgURL, err := api.StoreUploadImgByURL("http://image.jxc4.com/940c151db7e396f2ceaec0304597836f.jpg") + t.Log(outImgURL) + if err != nil { + t.Fatal(err) + } +} + +func TestSaveQualify(t *testing.T) { + jsonStr := ` + [ + { + "qualifyUrl":"http://img30.360buyimg.com/vendersettle/jfs/t1/69834/24/6602/68812/5d4d35fdEaaf373c6/5c1c50e7bb6330e4.jpg", + "qualifyType":"25", + "qualifyExpireForever":0, + "qualifyExpireStart":"2017-09-07 00:00:00", + "qualifyName":"刘男", + "licenceType":"-1", + "qualifyNumber":"92330104MA28XPXH5G", + "qualifyAddress":"浙江省杭州市江干区八堡家园5排10号一楼102", + "licenceName":"杭州市江干区刘男便利店", + "econKind":"个体工商户", + "scope":"食品经营(凭有效许可证经营);零售:卷烟、雪茄烟(凭有效许可证经营);批发、零售:日用百货,五金。(依法须经批准的项目,经相关部门批准后方可开展经营活动)" + }, + { + "qualifyUrl":"http://img30.360buyimg.com/vendersettle/jfs/t1/58554/26/7134/19343/5d4d3639E57b14138/bcce25e1eac11be8.jpg", + "qualifyType":"22", + "qualifyExpireForever":1, + "qualifyExpireStart":"2013-07-22 16:59:38", + "qualifyExpireEnd":"2033-07-22 16:59:50", + "qualifyOwner":"刘男", + "qualifyNumber":"420621198110303336" + }, + { + "qualifyUrl":"", + "qualifyType":"33", + "qualifyExpireForever":1, + "qualifyExpireStart":"", + "qualifyExpireEnd":"" + }, + { + "qualifyUrl":"", + "qualifyType":"8", + "qualifyExpireForever":1, + "qualifyExpireStart":"", + "qualifyExpireEnd":"" + }, + { + "qualifyUrl":"", + "qualifyType":"9", + "qualifyExpireForever":1, + "qualifyExpireStart":"", + "qualifyExpireEnd":"" + }, + { + "qualifyUrl":"", + "qualifyType":"10", + "qualifyExpireForever":1, + "qualifyExpireStart":"", + "qualifyExpireEnd":"" + }, + { + "qualifyUrl":"", + "qualifyType":"29", + "qualifyExpireForever":1, + "qualifyExpireStart":"", + "qualifyExpireEnd":"" + }, + { + "qualifyUrl":"", + "qualifyType":"31", + "qualifyExpireForever":1, + "qualifyExpireStart":"", + "qualifyExpireEnd":"" + } + ] + ` + var qualityList []*QualifyItem + err := utils.UnmarshalUseNumber([]byte(jsonStr), &qualityList) + if err != nil { + t.Fatal(err) + } + err = api.SaveQualify("11902261", SaveQualifyActionTypeSave, qualityList) + if err != nil { + t.Fatal(err) + } +}