diff --git a/platformapi/autonavi/autonavi_test.go b/platformapi/autonavi/autonavi_test.go index a2c344f7..088328eb 100644 --- a/platformapi/autonavi/autonavi_test.go +++ b/platformapi/autonavi/autonavi_test.go @@ -85,7 +85,7 @@ func TestGetDistricts(t *testing.T) { } func TestGetCoordinateFromAddress(t *testing.T) { - lng, lat, districtCode := autonaviAPI.GetCoordinateFromAddress("北京昌平区城区军民路1号院", "") + lng, lat, districtCode := autonaviAPI.GetCoordinateFromAddress("广东广州市白云区棠景街道水边街棠下村东一街36号(可放北街的菜鸟驿站)", "广州") t.Logf("lng:%f, lat:%f, districtCode:%d", lng, lat, districtCode) } @@ -151,7 +151,7 @@ func TestBatchWalkingDistance(t *testing.T) { } func TestAA(t *testing.T) { - result, err := autonaviAPI.GetCoordinateAreaInfo(121.237244, 31.052816) + result, err := autonaviAPI.GetCoordinateAreaInfo(113.325814, 23.133907) if err != nil { t.Fatal(err) } diff --git a/platformapi/jcqapi/jcqapi.go b/platformapi/jcqapi/jcqapi.go index 6c60695d..05b078db 100644 --- a/platformapi/jcqapi/jcqapi.go +++ b/platformapi/jcqapi/jcqapi.go @@ -18,7 +18,7 @@ import ( const ( sigKey = "signature" - httpURL = "jcq-hb-yd-001-httpsrv-nlb-FI.jvessel-open-hb.jdcloud.com:8080" + httpURL = "http://jcq-hb-yd-001-httpsrv-nlb-FI.jvessel-open-hb.jdcloud.com:8080" TopicCreateOrder = "open_message_pop_order_create_E1D746D42474D5F1F1A10CECE75D99F6" ConsumerGroupIdCreateOrder = "open_message_573819178445" @@ -105,6 +105,7 @@ func (a *API) ConsumeInfo(topic, consumerGroupId string) (consumeInfoResult *Con result, err := a.AccessAPI("v1/messages", httpURL, map[string]interface{}{ "topic": topic, "consumerGroupId": consumerGroupId, + "size": 1, }) if err == nil { utils.Map2StructByJson(result, &consumeInfoResult, false) diff --git a/platformapi/jcqapi/jcqapi_test.go b/platformapi/jcqapi/jcqapi_test.go index 17584e49..dc9c99d2 100644 --- a/platformapi/jcqapi/jcqapi_test.go +++ b/platformapi/jcqapi/jcqapi_test.go @@ -1,2 +1,30 @@ package jcqapi +import ( + "testing" + + "git.rosy.net.cn/baseapi" + "go.uber.org/zap" + + "git.rosy.net.cn/baseapi/utils" +) + +var ( + api *API + sugarLogger *zap.SugaredLogger +) + +func init() { + logger, _ := zap.NewDevelopment() + sugarLogger = logger.Sugar() + baseapi.Init(sugarLogger) + api = New("C0EB36912C652079DB111A922ACA406B", "86B6330051ECC88391E2630D34C2CA13") +} + +func TestConsumeInfo(t *testing.T) { + result, err := api.ConsumeInfo("topic-a08u00zul9", "open_message_573819178445") + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(result, false)) +} diff --git a/platformapi/jdshopapi/order.go b/platformapi/jdshopapi/order.go index 0167ff94..a4cdce6d 100644 --- a/platformapi/jdshopapi/order.go +++ b/platformapi/jdshopapi/order.go @@ -1,8 +1,14 @@ package jdshopapi import ( + "crypto/hmac" + "crypto/sha256" + "encoding/base64" "encoding/json" "fmt" + "time" + + "git.rosy.net.cn/baseapi/utils" ) //订单出库 @@ -53,3 +59,106 @@ func (a *API) GetOrder(orderID int64) (err error) { }) return err } + +type VoucherInfoGetResult struct { + Sig string `json:"sig"` + Data struct { + Act string `json:"act"` + Effective int64 `json:"effective"` + Expired int64 `json:"expired"` + ID string `json:"id"` + Key string `json:"key"` + Service string `json:"service"` + Stype int `json:"stype"` + } `json:"data"` + ExternalData struct { + Zone string `json:"zone"` + } `json:"externalData"` +} + +//获取解密凭证 +//https://open.jd.com/home/home#/doc/api?apiCateId=243&apiId=3093&apiName=jingdong.jos.voucher.info.get +func (a *API) VoucherInfoGet() (voucherInfoGetResult *VoucherInfoGetResult, err error) { + result, err := a.AccessAPI("jingdong.jos.voucher.info.get", prodURL, nil) + if err == nil { + data, err2 := base64.StdEncoding.DecodeString(result["jingdong_jos_voucher_info_get_responce"].(map[string]interface{})["response"].(map[string]interface{})["data"].(map[string]interface{})["voucher"].(string)) + if err2 == nil { + json.Unmarshal(data, &voucherInfoGetResult) + } + err = err2 + } + return voucherInfoGetResult, err +} + +type KeyGetSign struct { + SdkVer int `json:"sdk_ver"` + Ts int64 `json:"ts"` + Tid string `json:"tid"` +} + +type KeyGetResult struct { + Code string `json:"code"` + Response struct { + StatusCode int `json:"status_code"` + KeyCacheDisabled int `json:"key_cache_disabled"` + KeyBackupDisabled int `json:"key_backup_disabled"` + Ts int64 `json:"ts"` + EncService string `json:"enc_service"` + ErrorMsg string `json:"errorMsg"` + Tid string `json:"tid"` + ServiceKeyList []struct { + CurrentKeyVersion int `json:"current_key_version"` + Keys []struct { + ID string `json:"id"` + KeyExp int64 `json:"key_exp"` + KeyStatus int `json:"key_status"` + KeyDigest string `json:"key_digest"` + KeyType string `json:"key_type"` + KeyString string `json:"key_string"` + KeyEffective int64 `json:"key_effective"` + Version int `json:"version"` + } `json:"keys"` + Service string `json:"service"` + GrantUsage string `json:"grant_usage"` + } `json:"service_key_list"` + } `json:"response"` +} + +//获取解密密钥 +//https://open.jd.com/home/home#/doc/api?apiCateId=243&apiId=4262&apiName=jingdong.jos.master.key.get +func (a *API) KeyGet() (keyGetResult *KeyGetResult, err error) { + voucherInfoGetResult, err := a.VoucherInfoGet() + if err != nil { + return keyGetResult, err + } + var ( + sdkVer = 2 + ts = time.Now().Unix() + tid = voucherInfoGetResult.Data.ID + ) + keyGetSign := &KeyGetSign{ + SdkVer: sdkVer, + Ts: ts, + Tid: tid, + } + data, err := json.Marshal(keyGetSign) + if err != nil { + return keyGetResult, err + } + key, err := base64.StdEncoding.DecodeString(voucherInfoGetResult.Data.Key) + if err != nil { + return keyGetResult, err + } + h := hmac.New(sha256.New, key) + h.Write(data) + result, err := a.AccessAPI("jingdong.jos.master.key.get", prodURL, map[string]interface{}{ + "sig": base64.StdEncoding.EncodeToString(h.Sum(nil)), + "sdk_ver": sdkVer, + "ts": ts, + "tid": tid, + }) + if err == nil { + utils.Map2StructByJson(result["jingdong_jos_master_key_get_responce"], &keyGetResult, false) + } + return keyGetResult, err +} diff --git a/platformapi/jdshopapi/order_test.go b/platformapi/jdshopapi/order_test.go index 71aa58ef..ec90089a 100644 --- a/platformapi/jdshopapi/order_test.go +++ b/platformapi/jdshopapi/order_test.go @@ -29,3 +29,19 @@ func TestGetOrder(t *testing.T) { } // t.Log(utils.Format4Output(result, false)) } + +func TestVoucherInfoGet(t *testing.T) { + result, err := api.VoucherInfoGet() + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(result, false)) +} + +func TestKeyGet(t *testing.T) { + result, err := api.KeyGet() + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(result, false)) +} diff --git a/platformapi/jdshopapi/store_page_test.go b/platformapi/jdshopapi/store_page_test.go index 65eff409..4bf3b446 100644 --- a/platformapi/jdshopapi/store_page_test.go +++ b/platformapi/jdshopapi/store_page_test.go @@ -2,14 +2,14 @@ package jdshopapi import ( "crypto/aes" - "crypto/md5" + "crypto/cipher" "encoding/base64" + "encoding/hex" "fmt" "io/ioutil" - "math" + "log" "net/http" "testing" - "time" "git.rosy.net.cn/baseapi/utils" ) @@ -105,19 +105,51 @@ func TestTryGetCookie(t *testing.T) { } func TestAAADS(t *testing.T) { - const prefix = 80 - const randPartNum = 100 - orderNoBeginTimestamp := utils.Str2Time("2010-01-01 00:00:00").Unix() - orderNo := time.Now().Unix() - orderNoBeginTimestamp - orderNo = orderNo * randPartNum - md5Bytes := md5.Sum([]byte(utils.GetUUID())) - randPart := 0 - for k, v := range md5Bytes { - randPart += int(v) << ((k % 3) * 8) + str := "AAS2QGu5EUYo35u+GIPUbcPQrI8MbLvXIHaYS47i8I6De0Fzgdpyw7TT9Iti3RiIY30=" + data, _ := base64.StdEncoding.DecodeString(str) + dataStr := hex.EncodeToString(data) + fmt.Println("all:", dataStr) + fmt.Println("key ID:", dataStr[4:36]) + fmt.Println("IV:", dataStr[36:68]) + fmt.Println("key main:", dataStr[68:len(dataStr)]) + data2, _ := base64.StdEncoding.DecodeString("/xdYPxcavDO9IpsJP1uFfbbuv7WdIyckhJ9RBe3h9r8=") + dataStr2 := hex.EncodeToString(data2) + // key := base64.StdEncoding.EncodeToString([]byte(dataStr[36:68])) + fmt.Println(SubstrByByte(dataStr[36:len(dataStr)], 16)) + result, _ := AESBase64Decrypt("417381da72c3b4d3f48b62dd1888637d", dataStr2[:32], "ac8f0c6cbbd72076984b8ee2f08e837b") + fmt.Println(string(result)) +} + +func SubstrByByte(str string, length int) string { + bs := []byte(str)[:length] + bl := 0 + for i := len(bs) - 1; i >= 0; i-- { + switch { + case bs[i] >= 0 && bs[i] <= 127: + return string(bs[:i+1]) + case bs[i] >= 128 && bs[i] <= 191: + bl++ + case bs[i] >= 192 && bs[i] <= 253: + cl := 0 + switch { + case bs[i]&252 == 252: + cl = 6 + case bs[i]&248 == 248: + cl = 5 + case bs[i]&240 == 240: + cl = 4 + case bs[i]&224 == 224: + cl = 3 + default: + cl = 2 + } + if bl+1 == cl { + return string(bs[:i+cl]) + } + return string(bs[:i]) + } } - orderNo += int64(randPart % randPartNum) - orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix - fmt.Println(orderNo) + return "" } func DecryptDESECB(d, key []byte) string { @@ -149,3 +181,41 @@ func PKCS5UnPadding(origData []byte) []byte { unpadding := int(origData[length-1]) return origData[:(length - unpadding)] } + +func AESBase64Decrypt(encrypt_data string, key, iv string) (origin_data string, err error) { + var block cipher.Block + if block, err = aes.NewCipher([]byte(key)); err != nil { + log.Println(err) + return + } + encrypt := cipher.NewCBCDecrypter(block, []byte(iv)) + + var source []byte + if source, err = base64.RawStdEncoding.DecodeString(encrypt_data); err != nil { + log.Println(err) + return + } + var dst []byte = make([]byte, len(source)) + encrypt.CryptBlocks(dst, source) + origin_data = string(PKCS5Trimming(dst)) + return +} + +func Decrypt(src, key, iv string) (data []byte, err error) { + decrypted := make([]byte, len(src)) + var aesBlockDecrypter cipher.Block + aesBlockDecrypter, err = aes.NewCipher([]byte(key)) + if err != nil { + println(err.Error()) + return nil, err + } + fmt.Println(aesBlockDecrypter.BlockSize()) + aesDecrypter := cipher.NewCBCDecrypter(aesBlockDecrypter, []byte(iv)) + aesDecrypter.CryptBlocks(decrypted, []byte(src)) + return PKCS5Trimming(decrypted), nil +} + +func PKCS5Trimming(encrypt []byte) []byte { + padding := encrypt[len(encrypt)-1] + return encrypt[:len(encrypt)-int(padding)] +}