- fixed dada callback sign error.

This commit is contained in:
gazebo
2018-06-21 16:17:45 +08:00
parent e0ce7a1c29
commit 40bd8acd52
5 changed files with 165 additions and 9 deletions

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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
}