Bladeren bron

增加物流信息查询接口

abiao 5 jaren geleden
bovenliggende
commit
68eb93eee4

+ 151 - 0
go/gopath/src/fohow.com/apps/controllers/tool_controller/express_controller.go

@@ -0,0 +1,151 @@
+package tool_controller
+
+import (
+	"crypto/md5"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"fohow.com/apps"
+	"fohow.com/apps/models/express_model"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+func (self *ToolController) GetExpressCompany() {
+	//请求地址
+	juheURL := "http://v.juhe.cn/exp/com"
+	//初始化参数
+	param := url.Values{}
+	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
+	param.Set("key", express_model.JUHE_KEY)
+
+	//发送请求
+	var netReturn map[string]interface{}
+
+	data, err := Get(juheURL, param)
+	if err != nil {
+		fmt.Errorf("请求失败,错误信息:\r\n%v", err)
+	} else {
+		json.Unmarshal(data, &netReturn)
+		if netReturn["error_code"].(float64) == 0 {
+			fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+		}
+	}
+	for _, net := range netReturn["result"].([]interface{}) {
+
+		str := net.(map[string]interface{})
+		fmt.Printf("接口返回result字段是:\r\n%v", str)
+		expressCompany := express_model.GetCompanyByNo(str["no"].(string), false)
+		if expressCompany == nil {
+			new(express_model.ExpressCompany).Create(str["no"].(string), str["com"].(string))
+		}
+
+		/*		for k1, v1 := range net.(map[string]interface{}) {
+				//expressCompany := express_model.GetCompanyByNo(v1.["no"], false)
+				//if expressCompany == nil {
+				//	new(express_model.ExpressCompany).Create(k1, v1.(string))
+				//}
+
+			}*/
+	}
+	fmt.Printf("netReturn:%v\n", netReturn)
+	type Ret struct {
+		Ret map[string]interface{} `json:"resp"`
+	}
+
+	self.Data["json"] = &Ret{Ret: netReturn}
+	self.ServeJSON()
+}
+
+//获取物流信息
+func (self *ToolController) GetExpressInfo() {
+
+	expressNo := self.GetString("express_no")
+	expressCode := self.GetString("express_code")
+	sign := self.GetString("sign")
+
+	if len(expressNo) <= 0 || len(expressCode) <= 0 || len(sign) <= 0 {
+		self.ReturnError(200, apps.ParamsError, "", nil)
+	}
+	//验证参数
+	md5Sign := GenExpressPassword(expressNo)
+	if strings.ToUpper(md5Sign) != strings.ToUpper(sign) {
+		self.ReturnError(200, apps.ValidParamsError, "", nil)
+	}
+
+	//请求地址
+	juheURL := "http://v.juhe.cn/exp/index"
+
+	//初始化参数
+	param := url.Values{}
+
+	//配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
+	param.Set("com", expressCode)            //需要查询的快递公司编号
+	param.Set("no", expressNo)               //需要查询的订单号
+	param.Set("key", express_model.JUHE_KEY) //应用APPKEY(应用详细页查询)
+	param.Set("dtype", "json")               //返回数据的格式,xml或json,默认json
+	var netReturn map[string]interface{}
+
+	//发送请求
+	data, err := Get(juheURL, param)
+	if err != nil {
+		fmt.Errorf("请求失败,错误信息:\r\n%v", err)
+	} else {
+		json.Unmarshal(data, &netReturn)
+		if netReturn["error_code"].(float64) == 0 {
+			fmt.Printf("接口返回result字段是:\r\n%v", netReturn["result"])
+		}
+	}
+	type Ret struct {
+		Ret map[string]interface{} `json:"resp"`
+	}
+
+	self.Data["json"] = &Ret{Ret: netReturn}
+	self.ServeJSON()
+}
+
+// get 网络请求
+func Get(apiURL string, params url.Values) (rs []byte, err error) {
+	var Url *url.URL
+	Url, err = url.Parse(apiURL)
+	if err != nil {
+		fmt.Printf("解析url错误:\r\n%v", err)
+		return nil, err
+	}
+	//如果参数中有中文参数,这个方法会进行URLEncode
+	Url.RawQuery = params.Encode()
+	resp, err := http.Get(Url.String())
+	if err != nil {
+		fmt.Println("err:", err)
+		return nil, err
+	}
+	defer resp.Body.Close()
+	return ioutil.ReadAll(resp.Body)
+}
+
+// post 网络请求 ,params 是url.Values类型
+func Post(apiURL string, params url.Values) (rs []byte, err error) {
+	resp, err := http.PostForm(apiURL, params)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+	return ioutil.ReadAll(resp.Body)
+}
+
+//根据用户快递单号和Tkey得到物流信息查询的密钥
+func GenExpressPassword(expressNo string) string {
+	md5CtxUsn := md5.New()
+	md5CtxUsn.Write([]byte(express_model.ZT_PASSWORD))
+	UsnCipherStr := md5CtxUsn.Sum(nil)
+	UsnMd5Pwd := hex.EncodeToString(UsnCipherStr)
+
+	md5CtxTkey := md5.New()
+	md5CtxTkey.Write([]byte(fmt.Sprintf("%s%s", UsnMd5Pwd, expressNo)))
+	TkeyCipherStr := md5CtxTkey.Sum(nil)
+	md5PwdTkey := hex.EncodeToString(TkeyCipherStr)
+
+	return md5PwdTkey[0:12]
+}

+ 2 - 2
go/gopath/src/fohow.com/apps/controllers/tool_controller/init.go

@@ -15,8 +15,8 @@ import (
 )
 
 var (
-	exceptCheckUserLoginAction   = []string{"GetQrcode", "GetHaibao", "Monitor"}
-	exceptCheckWxUserLoginAction = []string{"GetQrcode", "GetHaibao", "Monitor"}
+	exceptCheckUserLoginAction   = []string{"GetQrcode", "GetHaibao", "Monitor", "GetExpressCompany", "GetExpressInfo"}
+	exceptCheckWxUserLoginAction = []string{"GetQrcode", "GetHaibao", "Monitor", "GetExpressCompany", "GetExpressInfo"}
 )
 
 type ToolController struct {

+ 1 - 0
go/gopath/src/fohow.com/apps/init.go

@@ -77,6 +77,7 @@ var (
 
 	PayFail               = []string{"payFail", "支付失败"}
 	ParamsError           = []string{"paramsError", "参数错误"}
+	ValidParamsError      = []string{"validateParamsError", "验证参数错误"}
 	ParamsRequired        = []string{"paramsRequired", "缺少参数"}
 	ProductStockZero      = []string{"productStockZero", "商品库存为零"}
 	ProductStockNotEnough = []string{"productStockNotEnough", "商品库存不足"}

+ 62 - 0
go/gopath/src/fohow.com/apps/models/express_model/express_company.go

@@ -0,0 +1,62 @@
+package express_model
+
+import (
+	"fmt"
+	"fohow.com/cache"
+	"github.com/astaxie/beego"
+	"github.com/astaxie/beego/orm"
+	"time"
+)
+
+const (
+	express_companys_tablename = "express_companys"
+	JUHE_KEY                   = "e964266c70cc70cd8d96ab76ed30227f"
+	URL_EXPRESS_COMPANY        = "http://v.juhe.cn/exp/com"
+	ZT_PASSWORD                = "pQtIjP"
+)
+
+type ExpressCompany struct {
+	Id             int64  `orm:"column(id);pk"         json:"id,omitempty"`           // int(11)
+	ExpressNo      string `orm:"column(express_code)"          json:"express_code"`   // varchar(100)
+	ExpressCompany string `orm:"column(express_company);null" json:"express_company"` // int(11)
+}
+
+func (self *ExpressCompany) TableName() string {
+	return express_companys_tablename
+}
+
+func (self *ExpressCompany) Create(expressNo, expressCom string) (item *ExpressCompany) {
+	item = &ExpressCompany{
+		ExpressNo:      expressNo,
+		ExpressCompany: expressCom,
+	}
+	id, err := orm.NewOrm().Insert(item)
+	if err != nil {
+		beego.BeeLogger.Error("Insert ExpressCompany err=[%s]", err)
+		return nil
+	}
+	item.Id = id
+	return item
+}
+
+//获取物流信息
+func GetCompanyByNo(expressNo string, useCache bool) *ExpressCompany {
+	k := fmt.Sprintf("express_model.GetCompanyByNo(%s)", expressNo)
+	if useCache {
+		if ret, ok := cache.Cache.Get(k).(*ExpressCompany); ok {
+			return ret
+		}
+	} else {
+		cache.Cache.Delete(k)
+	}
+
+	item := new(ExpressCompany)
+	if err := orm.NewOrm().QueryTable(item).Filter("express_code", expressNo).Limit(1).One(item); err != nil {
+		beego.BeeLogger.Error("get ExpressCompany by no=[%s] err=[%s]", expressNo, err)
+		return nil
+	}
+	if err := cache.Cache.Put(k, item, 5*time.Minute); err != nil {
+		beego.BeeLogger.Error("set cache ExpressCompany err=[%s]", err)
+	}
+	return item
+}

+ 10 - 0
go/gopath/src/fohow.com/apps/models/express_model/init.go

@@ -0,0 +1,10 @@
+package express_model
+
+import (
+	"github.com/astaxie/beego/orm"
+)
+
+func init() {
+	orm.RegisterModel(
+		new(ExpressCompany))
+}

+ 23 - 0
go/gopath/src/fohow.com/apps/models/order_model/order.go

@@ -1,6 +1,8 @@
 package order_model
 
 import (
+	"crypto/md5"
+	"encoding/hex"
 	"fmt"
 	"strconv"
 	"strings"
@@ -47,6 +49,7 @@ const (
 	FREIGHT         = int64(500)
 	PROMOTION_TOTAL = int64(9900)
 	SEND_PRODUCT_ID = int64(77)
+	ZT_PASSWORD     = "pQtIjP"
 )
 
 var STATUS_CN_TEXT = map[string]string{
@@ -87,6 +90,8 @@ type Order struct {
 	ExpressOrderNo string                   `orm:"column(express_order_no);null"                       json:"express_order_no"` // varchar(255)
 	Remark         string                   `orm:"column(remark);null"                                 json:"remark"`           // varchar(255)
 	OrderRemark    string                   `orm:"column(order_remark);null"                           json:"-"`                // varchar(255)
+	ExpressCode    string                   `orm:"column(express_code);null"                           json:"express_code"`     // varchar(255)
+	Sign           string                   `orm:"-"                                                   json:"sign"`             // varchar(255)
 	CTime          int64                    `orm:"-"                                 json:"ctime"`                              // int(11)
 	DTime          int64                    `orm:"-"                                 json:"dtime"`                              // int(11)
 	Freight        int64                    `orm:"column(freight);null"                            json:"freight"`              // int(11)
@@ -170,6 +175,9 @@ func GetOrderByIntId(id int64) (order *Order) {
 		beego.BeeLogger.Error("get order by id=%d err=%s", id, err)
 		order = nil
 	}
+	if len(order.ExpressOrderNo) > 0 {
+		order.Sign = GenExpressPassword(order.ExpressOrderNo)
+	}
 	return order
 }
 
@@ -655,3 +663,18 @@ func UpdateSaleNums(saleProducts map[int64]int64) bool {
 	}
 	return true
 }
+
+//根据用户快递单号和Tkey得到物流信息查询的密钥
+func GenExpressPassword(expressNo string) string {
+	md5CtxUsn := md5.New()
+	md5CtxUsn.Write([]byte(ZT_PASSWORD))
+	UsnCipherStr := md5CtxUsn.Sum(nil)
+	UsnMd5Pwd := hex.EncodeToString(UsnCipherStr)
+
+	md5CtxTkey := md5.New()
+	md5CtxTkey.Write([]byte(fmt.Sprintf("%s%s", UsnMd5Pwd, expressNo)))
+	TkeyCipherStr := md5CtxTkey.Sum(nil)
+	md5PwdTkey := hex.EncodeToString(TkeyCipherStr)
+
+	return md5PwdTkey[0:12]
+}

+ 4 - 1
go/gopath/src/fohow.com/routers/routes.go

@@ -197,7 +197,6 @@ func init() {
 	beego.Router("/v1/share/info", &share_controller.ShareController{}, "post:DoShare")
 
 	beego.Router("/v1/formid", &form_id_controller.FromIdController{}, "post:Create")
-	beego.Router("/v1/formid", &form_id_controller.FromIdController{}, "delete:TestSendingTemplatemsg")
 
 	//---------------railsadmin后台请求相关----------------
 	beego.InsertFilter("/railsadmin/*", beego.BeforeExec, apps.CheckIsInvokeFromRailsAdmin, true)
@@ -244,6 +243,10 @@ func init() {
 	//-----导航图标
 	beego.Router("/v1/navigate/icons", &category_controller.CategoryController{}, "get:GetNavigateIcons")
 
+	//获取物流信息对照表
+	beego.Router("/v1/experess_company/query", &tool_controller.ToolController{}, "get:GetExpressCompany")
+	beego.Router("/v1/experess_info/query", &tool_controller.ToolController{}, "post:GetExpressInfo")
+
 	//----------------购物车 -------------------
 	//加入购物车
 	beego.Router("/v1/cart/:id([0-9]+)/:count", &order_controller.OrderController{}, "post:CreateCart")