jcq消费消息
This commit is contained in:
@@ -85,7 +85,7 @@ func TestGetDistricts(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetCoordinateFromAddress(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)
|
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) {
|
func TestAA(t *testing.T) {
|
||||||
result, err := autonaviAPI.GetCoordinateAreaInfo(121.237244, 31.052816)
|
result, err := autonaviAPI.GetCoordinateAreaInfo(113.325814, 23.133907)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import (
|
|||||||
const (
|
const (
|
||||||
sigKey = "signature"
|
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"
|
TopicCreateOrder = "open_message_pop_order_create_E1D746D42474D5F1F1A10CECE75D99F6"
|
||||||
ConsumerGroupIdCreateOrder = "open_message_573819178445"
|
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{}{
|
result, err := a.AccessAPI("v1/messages", httpURL, map[string]interface{}{
|
||||||
"topic": topic,
|
"topic": topic,
|
||||||
"consumerGroupId": consumerGroupId,
|
"consumerGroupId": consumerGroupId,
|
||||||
|
"size": 1,
|
||||||
})
|
})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
utils.Map2StructByJson(result, &consumeInfoResult, false)
|
utils.Map2StructByJson(result, &consumeInfoResult, false)
|
||||||
|
|||||||
@@ -1,2 +1,30 @@
|
|||||||
package jcqapi
|
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))
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
package jdshopapi
|
package jdshopapi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
//订单出库
|
//订单出库
|
||||||
@@ -53,3 +59,106 @@ func (a *API) GetOrder(orderID int64) (err error) {
|
|||||||
})
|
})
|
||||||
return err
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,3 +29,19 @@ func TestGetOrder(t *testing.T) {
|
|||||||
}
|
}
|
||||||
// t.Log(utils.Format4Output(result, false))
|
// 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))
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,14 +2,14 @@ package jdshopapi
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
"crypto/md5"
|
"crypto/cipher"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
)
|
)
|
||||||
@@ -105,19 +105,51 @@ func TestTryGetCookie(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestAAADS(t *testing.T) {
|
func TestAAADS(t *testing.T) {
|
||||||
const prefix = 80
|
str := "AAS2QGu5EUYo35u+GIPUbcPQrI8MbLvXIHaYS47i8I6De0Fzgdpyw7TT9Iti3RiIY30="
|
||||||
const randPartNum = 100
|
data, _ := base64.StdEncoding.DecodeString(str)
|
||||||
orderNoBeginTimestamp := utils.Str2Time("2010-01-01 00:00:00").Unix()
|
dataStr := hex.EncodeToString(data)
|
||||||
orderNo := time.Now().Unix() - orderNoBeginTimestamp
|
fmt.Println("all:", dataStr)
|
||||||
orderNo = orderNo * randPartNum
|
fmt.Println("key ID:", dataStr[4:36])
|
||||||
md5Bytes := md5.Sum([]byte(utils.GetUUID()))
|
fmt.Println("IV:", dataStr[36:68])
|
||||||
randPart := 0
|
fmt.Println("key main:", dataStr[68:len(dataStr)])
|
||||||
for k, v := range md5Bytes {
|
data2, _ := base64.StdEncoding.DecodeString("/xdYPxcavDO9IpsJP1uFfbbuv7WdIyckhJ9RBe3h9r8=")
|
||||||
randPart += int(v) << ((k % 3) * 8)
|
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
|
||||||
}
|
}
|
||||||
orderNo += int64(randPart % randPartNum)
|
if bl+1 == cl {
|
||||||
orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix
|
return string(bs[:i+cl])
|
||||||
fmt.Println(orderNo)
|
}
|
||||||
|
return string(bs[:i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func DecryptDESECB(d, key []byte) string {
|
func DecryptDESECB(d, key []byte) string {
|
||||||
@@ -149,3 +181,41 @@ func PKCS5UnPadding(origData []byte) []byte {
|
|||||||
unpadding := int(origData[length-1])
|
unpadding := int(origData[length-1])
|
||||||
return origData[:(length - unpadding)]
|
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)]
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user