- fixed dada callback sign error.
This commit is contained in:
@@ -42,10 +42,8 @@ var (
|
||||
|
||||
func (d *DadaAPI) signParamsCallback(mapData map[string]interface{}) string {
|
||||
values := make([]string, 0)
|
||||
for k, v := range mapData {
|
||||
if k != signKey {
|
||||
values = append(values, fmt.Sprint(v))
|
||||
}
|
||||
for _, k := range []string{"client_id", "order_id", "update_time"} {
|
||||
values = append(values, fmt.Sprint(mapData[k]))
|
||||
}
|
||||
sort.Strings(values)
|
||||
|
||||
|
||||
@@ -56,6 +56,11 @@ type DadaCity struct {
|
||||
CityCode string `json:"cityCode"`
|
||||
}
|
||||
|
||||
type CancelReason struct {
|
||||
Id int `json:"id"`
|
||||
Reason string `json:"reason"`
|
||||
}
|
||||
|
||||
func NewDadaAPI(appKey, appSecret, sourceId, callbackURL string, isProd bool) *DadaAPI {
|
||||
api := &DadaAPI{
|
||||
appKey: appKey,
|
||||
@@ -75,15 +80,15 @@ func NewDadaAPI(appKey, appSecret, sourceId, callbackURL string, isProd bool) *D
|
||||
func (d *DadaAPI) signParams(mapData map[string]interface{}) string {
|
||||
keys := make([]string, 0)
|
||||
for k := range mapData {
|
||||
keys = append(keys, k)
|
||||
if k != signKey {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
}
|
||||
sort.Strings(keys)
|
||||
|
||||
finalStr := d.appSecret
|
||||
for _, k := range keys {
|
||||
if k != signKey {
|
||||
finalStr += k + fmt.Sprint(mapData[k])
|
||||
}
|
||||
finalStr += k + fmt.Sprint(mapData[k])
|
||||
}
|
||||
|
||||
finalStr += d.appSecret
|
||||
@@ -162,3 +167,21 @@ func (d *DadaAPI) GetCities() (retVal []DadaCity, err error) {
|
||||
}
|
||||
return retVal, nil
|
||||
}
|
||||
|
||||
func (d *DadaAPI) GetCancelReasons() (retVal []CancelReason, err error) {
|
||||
result, err := d.AccessDada("api/order/cancel/reasons", nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cites := result.Result.([]interface{})
|
||||
for _, v := range cites {
|
||||
v2 := v.(map[string]interface{})
|
||||
reason := CancelReason{
|
||||
Id: int(utils.MustInterface2Int64(v2["id"])),
|
||||
Reason: v2["reason"].(string),
|
||||
}
|
||||
retVal = append(retVal, reason)
|
||||
}
|
||||
return retVal, nil
|
||||
}
|
||||
|
||||
@@ -12,6 +12,11 @@ import (
|
||||
var (
|
||||
dadaapi *DadaAPI
|
||||
sugarLogger *zap.SugaredLogger
|
||||
testOrder *OperateOrderRequiredParams
|
||||
)
|
||||
|
||||
const (
|
||||
testShopNo = "11047059"
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -20,15 +25,39 @@ func init() {
|
||||
baseapi.Init(sugarLogger)
|
||||
|
||||
// sandbox
|
||||
dadaapi = NewDadaAPI("dada9623324449cd250", "30c2abbfe8a8780ad5aace46300c64b9", "73753", "", false)
|
||||
dadaapi = NewDadaAPI("dada9623324449cd250", "30c2abbfe8a8780ad5aace46300c64b9", "73753", "http://callback.jxc4.com/dada/order", false)
|
||||
|
||||
// prod
|
||||
|
||||
testOrder = &OperateOrderRequiredParams{
|
||||
ShopNo: testShopNo,
|
||||
OriginId: "234242342",
|
||||
CityCode: "028",
|
||||
CargoPrice: 12.34,
|
||||
IsPrepay: 1,
|
||||
ReceiverName: "我是谁",
|
||||
ReceiverAddress: "九里堤",
|
||||
ReceiverLat: 30.74631,
|
||||
ReceiverLng: 103.99112,
|
||||
ReceiverPhone: "12812345678",
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestTest(t *testing.T) {
|
||||
sugarLogger.Debug(utils.GetCurTimeStr())
|
||||
}
|
||||
|
||||
func TestSignCallback(t *testing.T) {
|
||||
sampleData := `{"signature":"5a277f2519b6011028ff541fb09b8553","client_id":"275000419162381","order_id":"234242342","order_status":1,"cancel_reason":"","cancel_from":0,"dm_id":0,"update_time":1529564947}`
|
||||
mapData := make(map[string]interface{})
|
||||
utils.UnmarshalUseNumber([]byte(sampleData), &mapData)
|
||||
sign := dadaapi.signParamsCallback(mapData)
|
||||
if sign != mapData["signature"] {
|
||||
t.Fatal("sign is not correct")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAccessDada(t *testing.T) {
|
||||
body := make(map[string]interface{})
|
||||
body["order_id"] = "fakeorderid"
|
||||
@@ -49,3 +78,62 @@ func TestAccessDada(t *testing.T) {
|
||||
t.Fatalf("Error when accessing api result:%v, error:%v", result, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetCites(t *testing.T) {
|
||||
result, err := dadaapi.GetCities()
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
failed := true
|
||||
for _, city := range result {
|
||||
if city.CityCode == "028" {
|
||||
failed = false
|
||||
}
|
||||
}
|
||||
|
||||
if failed {
|
||||
t.Fatal("failed")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetReasons(t *testing.T) {
|
||||
result, err := dadaapi.GetCancelReasons()
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
// baseapi.SugarLogger.Debug(result)
|
||||
failed := true
|
||||
for _, reason := range result {
|
||||
if reason.Id == 1 {
|
||||
failed = false
|
||||
}
|
||||
}
|
||||
|
||||
if failed {
|
||||
t.Fatal("failed")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAddOrder(t *testing.T) {
|
||||
result, err := dadaapi.AddOrder(testOrder, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
baseapi.SugarLogger.Debug(result)
|
||||
}
|
||||
|
||||
func TestReaddOrder(t *testing.T) {
|
||||
result, err := dadaapi.ReaddOrder(testOrder, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
baseapi.SugarLogger.Debug(result)
|
||||
}
|
||||
|
||||
func TestCancelOrder(t *testing.T) {
|
||||
result, err := dadaapi.CancelOrder("234242342", ReasonIdClientDontWantItAnymore, "")
|
||||
if err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
baseapi.SugarLogger.Debug(result)
|
||||
}
|
||||
|
||||
@@ -5,6 +5,19 @@ import (
|
||||
"github.com/fatih/structs"
|
||||
)
|
||||
|
||||
const (
|
||||
ReasonIdNobodyAccept = 1
|
||||
ReasonIdNobodyPickup = 2
|
||||
ReasonIdCourierIsPig = 3
|
||||
ReasonIdClientCanceled = 4
|
||||
ReasonIdOrderIsWrong = 5
|
||||
ReasonIdCourierWantMeCancel = 34
|
||||
ReasonIdCourierDontWantToPickup = 35
|
||||
ReasonIdClientDontWantItAnymore = 36
|
||||
ReasonIdCourierShirk = 37
|
||||
ReasonIdOther = 10000
|
||||
)
|
||||
|
||||
type OperateOrderRequiredParams struct {
|
||||
ShopNo string `json:"shop_no"`
|
||||
OriginId string `json:"origin_id"`
|
||||
@@ -28,6 +41,10 @@ type CreateOrderResponse struct {
|
||||
InsuranceFee float64
|
||||
}
|
||||
|
||||
type CancelOrderResponse struct {
|
||||
DeductFee float64 `json:"deduct_fee"`
|
||||
}
|
||||
|
||||
func (d *DadaAPI) QueryOrderInfo(orderId string) (retVal map[string]interface{}, err error) {
|
||||
params := make(map[string]interface{})
|
||||
params["order_id"] = orderId
|
||||
@@ -85,3 +102,17 @@ func (d *DadaAPI) QueryDeliverFee(orderInfo *OperateOrderRequiredParams, addPara
|
||||
func (d *DadaAPI) AddOrderAfterQuery(orderInfo *OperateOrderRequiredParams, addParams map[string]interface{}) (retVal *CreateOrderResponse, err error) {
|
||||
return d.operateOrder("api/order/addAfterQuery", orderInfo, addParams)
|
||||
}
|
||||
|
||||
func (d *DadaAPI) CancelOrder(orderId string, cancelOrderReasonId int, cancelOrderReason string) (retVal *CancelOrderResponse, err error) {
|
||||
mapData := utils.Params2Map("order_id", orderId, "cancel_reason_id", cancelOrderReasonId, "cancel_reason", cancelOrderReason)
|
||||
result, err := d.AccessDada("api/order/formalCancel", mapData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
mapResult := result.Result.(map[string]interface{})
|
||||
retVal = new(CancelOrderResponse)
|
||||
retVal.DeductFee = utils.MustInterface2Float64(mapResult["deduct_fee"])
|
||||
|
||||
return retVal, nil
|
||||
}
|
||||
|
||||
@@ -206,3 +206,19 @@ func CallFuncLogError(funcToCall func() error, msg string) {
|
||||
baseapi.SugarLogger.Warnf("%s, error:%v", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func Params2Map(key1, value1 interface{}, kv ...interface{}) (retVal map[string]interface{}) {
|
||||
retVal = make(map[string]interface{})
|
||||
retVal[key1.(string)] = value1
|
||||
|
||||
key := ""
|
||||
for index, v := range kv {
|
||||
if index%2 == 0 {
|
||||
key = v.(string)
|
||||
} else {
|
||||
retVal[key] = v
|
||||
}
|
||||
}
|
||||
|
||||
return retVal
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user