From 40bd8acd5276b635dc32c695ea73837fcf160b6a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 21 Jun 2018 16:17:45 +0800 Subject: [PATCH] - fixed dada callback sign error. --- platform/dadaapi/callback.go | 6 +-- platform/dadaapi/dadaapi.go | 31 +++++++++-- platform/dadaapi/dadaapi_test.go | 90 +++++++++++++++++++++++++++++++- platform/dadaapi/order.go | 31 +++++++++++ utils/utils.go | 16 ++++++ 5 files changed, 165 insertions(+), 9 deletions(-) diff --git a/platform/dadaapi/callback.go b/platform/dadaapi/callback.go index ec1bb15d..cd555f4e 100644 --- a/platform/dadaapi/callback.go +++ b/platform/dadaapi/callback.go @@ -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) diff --git a/platform/dadaapi/dadaapi.go b/platform/dadaapi/dadaapi.go index c42cb3c5..8fe0ec46 100644 --- a/platform/dadaapi/dadaapi.go +++ b/platform/dadaapi/dadaapi.go @@ -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 +} diff --git a/platform/dadaapi/dadaapi_test.go b/platform/dadaapi/dadaapi_test.go index 60ca2ec8..f9d9375c 100644 --- a/platform/dadaapi/dadaapi_test.go +++ b/platform/dadaapi/dadaapi_test.go @@ -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) +} diff --git a/platform/dadaapi/order.go b/platform/dadaapi/order.go index 10c9ea6f..881964d3 100644 --- a/platform/dadaapi/order.go +++ b/platform/dadaapi/order.go @@ -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 +} diff --git a/utils/utils.go b/utils/utils.go index 226fe020..af443a76 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -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 +}