zoie пре 1 година
родитељ
комит
99d22e3b51
12 измењених фајлова са 332 додато и 8 уклоњено
  1. 6 2
      conf/app.conf
  2. 3 0
      conf/config.go
  3. 40 0
      controllers/Data.go
  4. 133 0
      controllers/User.go
  5. 26 4
      controllers/lib/Aes.go
  6. 2 2
      controllers/lib/Qiniu.go
  7. 49 0
      controllers/lib/wxpay.go
  8. 1 0
      go.mod
  9. 3 0
      go.sum
  10. 64 0
      models/Company/CompanyPayOrder.go
  11. 1 0
      routers/Data.go
  12. 4 0
      routers/User.go

+ 6 - 2
conf/app.conf

@@ -63,11 +63,15 @@ Qiniu_Url = "https://coldoss.coldbaozhida.com/"
 # Panel
 Panel_url = "http://127.0.0.1:6204/Cold_Panel"
 
-FilterExcludeURL = /Login_verification,/Data/List
+FilterExcludeURL = /Login_verification,/Data/List,/WxPay/Notify
 # 小程序 冷链验证 /Data/List
 # 小程序接口 /DeviceWarning/DeviceSensor_List,/Device/Applet_Stat_View2,/DeviceSensor/Applet_List_View1,/DeviceSensor/Applet_List_View2,/DeviceSensorType/List,/Device/DeviceTask_Post
 #FilterOnlyLoginCheckURL = /Menu/List,/User/Info,/User/Home,/User/Post,/UpFileToken,/User/WxQRCode,/Company/Get,/DeviceWarning/DeviceSensor_List,/Device/Applet_Stat_View2,/DeviceSensor/Applet_List_View1,/DeviceSensor/Applet_List_View2,/DeviceSensorType/List,/Device/DeviceTask_Post,/Data/DeviceSensor_Data_Print
-FilterOnlyLoginCheckURL = /Menu/List,/User/Info,/User/Home,/User/Post,/UpFileToken,/User/WxQRCode,/Company/Get,/DataSource,/Company/Bill_Excel,/WarningSend/List
+FilterOnlyLoginCheckURL = /Menu/List,/User/Info,/User/Home,/User/Post,/UpFileToken,/User/WxQRCode,/Company/Get,/DataSource,/Company/Bill_Excel,/WarningSend/List,/WxPay/Get_QRCode,/WxPay/GetOrderState
+
 
 MqttIds = mqttjxit,mqttlodr,mqttyuht
 MqttServer_id = "mqttjxit"
+
+Weixin_PwdKey = "7Nt9sJb1Xy0PoQrEl3Df5Zv2Cg6AhRkT"
+Weixin_Notify = "https://cold.coldbaozhida.com/api/WxPay/Notify"

+ 3 - 0
conf/config.go

@@ -43,3 +43,6 @@ var FilterOnlyLoginCheckURL, _ = beego.AppConfig.String("FilterOnlyLoginCheckURL
 var MqttIds, _ = beego.AppConfig.String("MqttIds")
 var MqttServer_id, _ = beego.AppConfig.String("MqttServer_id")
 var WarningRateExcludePid, _ = beego.AppConfig.String("WarningRateExcludePid")
+
+var Weixin_PwdKey, _ = beego.AppConfig.String("Weixin_PwdKey")
+var Weixin_Notify, _ = beego.AppConfig.String("Weixin_Notify")

+ 40 - 0
controllers/Data.go

@@ -151,6 +151,46 @@ func (c *DataController) Device_Sensor_Data() {
 	return
 }
 
+// 实时轨迹
+func (c *DataController) Device_Sensor_Data_Real() {
+	page, _ := c.GetInt("page")
+	page_z, _ := c.GetInt("page_z")
+	T_id, _ := c.GetInt("T_id")
+	T_sn := c.GetString("T_sn")
+
+	TaskList, num := Device.Read_DeviceTask_All(T_sn)
+	if num == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "暂时没有轨迹信息"}
+		c.ServeJSON()
+		return
+	}
+	Time_start := TaskList[0].T_Ut_start
+	Time_end := TaskList[0].T_Ut_end
+
+	type R_JSONS struct {
+		//必须的大写开头
+		DeviceSensor_data []Device.DeviceData_R
+		Num               int
+		Page              int
+		Page_size         int
+		Pages             []lib.Page_T
+	}
+	var r_jsons R_JSONS
+	var cnt int
+	Device.Read_DeviceSensorParameter_All_Map(T_sn, T_id)
+	r_jsons.DeviceSensor_data, cnt = Device.Read_DeviceData_ById_List(T_sn, T_id, Time_start, Time_end, page, page_z)
+
+	page_size := math.Ceil(float64(cnt) / float64(page_z))
+	r_jsons.Page = page
+	r_jsons.Page_size = int(page_size)
+	r_jsons.Pages = lib.Func_page(int64(page), int64(page_size))
+	r_jsons.Num = cnt
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
+	c.ServeJSON()
+	return
+}
+
 // 设备数据
 func (c *DataController) Device_Sensor_Data_More() {
 	page, _ := c.GetInt("page")

+ 133 - 0
controllers/User.go

@@ -9,6 +9,7 @@ import (
 	"Cold_Api/models/Company"
 	"Cold_Api/models/System"
 	"Cold_Api/models/Warning"
+	"encoding/json"
 	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
 	beego "github.com/beego/beego/v2/server/web"
@@ -1600,3 +1601,135 @@ func (c *UserController) CompanyBill_Excel() {
 	return
 
 }
+
+// 获取微信支付二维码
+func (c *UserController) WxPay_QRCode() {
+	if c.Admin_r.T_pid == 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "非公司用户不能充值"}
+		c.ServeJSON()
+		return
+	}
+	Total, _ := c.GetFloat("Total")
+	Title := "冷链3.0-" + c.Admin_r.T_user
+	res, err := lib.PayTransactionNative(Title, Total)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: err.Error()}
+		c.ServeJSON()
+		return
+	}
+	if res.Code != 200 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: res.Message}
+		c.ServeJSON()
+		return
+	}
+
+	var_ := Company.CompanyPayOrder{
+		T_pid:      c.Admin_r.T_pid,
+		T_type:     "微信",
+		T_title:    Title,
+		T_total:    Total,
+		T_order_no: res.OrderNo,
+		T_remark:   c.Admin_r.T_uuid,
+	}
+
+	_, err = Company.Add_CompanyPayOrder(var_)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加订单失败!"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: res}
+	c.ServeJSON()
+	return
+
+}
+
+// 微信支付回调
+func (c *UserController) WxPay_Notify() {
+
+	type RequestBody struct {
+		TradeNo string
+		Status  string
+	}
+	type JSON struct {
+		Code    int
+		Message string
+	}
+	buf := make([]byte, 1024)
+	n, _ := c.Ctx.Request.Body.Read(buf)
+	logs.Info("Body================ ", string(buf[0:n]))
+
+	//解密
+	adc_str, _ := lib.AesDeCrypt(buf[0:n], []byte(conf.Weixin_PwdKey))
+	//adc_str, _ := lib.AesDeCrypt(buf[0:n], []byte(conf.Weixin_PwdKey))
+
+	var body RequestBody
+	logs.Info("data================ ", string(adc_str))
+	err := json.Unmarshal(adc_str, &body)
+	if err != nil {
+		c.Data["json"] = JSON{Code: 202, Message: "json.Unmarshal is err:" + err.Error()}
+		c.ServeJSON()
+	}
+
+	payOrder, err := Company.Get_CompanyPayOrder_ByT_order_no(body.TradeNo)
+	if err != nil {
+		c.Data["json"] = JSON{Code: 202, Message: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+	//交易状态
+	//SUCCESS:支付成功
+	//REFUND:转入退款
+	//NOTPAY:未支付
+	//CLOSED:已关闭
+	//REVOKED:已撤销(付款码支付)
+	//USERPAYING:用户支付中(付款码支付)
+	//PAYERROR:支付失败(其他原因,如银行返回失败)
+	payOrder.T_status = body.Status
+	err = Company.Update_CompanyPayOrder(payOrder, "T_status")
+	if err != nil {
+		c.Data["json"] = JSON{Code: 202, Message: "更新状态失败!"}
+		c.ServeJSON()
+		return
+	}
+	// 添加充值记录
+	// 余额加上充值金额
+	if body.Status == "SUCCESS" {
+		Company_r, err := Account.Read_Company_ById(payOrder.T_pid)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
+			c.ServeJSON()
+			return
+		}
+
+		T_money64, _ := decimal.NewFromFloat(float64(Company_r.T_money) + payOrder.T_total).Round(2).Float64()
+		Company_r.T_money = float32(T_money64)
+
+		is := Account.Update_Company(Company_r, "T_money")
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "充值失败!"}
+			c.ServeJSON()
+			return
+		}
+	}
+
+	c.Data["json"] = JSON{Code: 200, Message: "成功"}
+	c.ServeJSON()
+	return
+
+}
+
+// 获取微信支付订单状态
+func (c *UserController) WxPay_GetOrderState() {
+	OrderNo := c.GetString("OrderNo")
+	payOrder, err := Company.Get_CompanyPayOrder_ByT_order_no(OrderNo)
+	if err != nil {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
+		c.ServeJSON()
+		return
+	}
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "成功", Data: payOrder}
+	c.ServeJSON()
+	return
+}

+ 26 - 4
controllers/lib/Aes.go

@@ -44,16 +44,38 @@ func AesDecryptCBC(cryted string, key string) string {
 	orig = PKCS7UnPadding(orig)
 	return string(orig)
 }
-//补码
-//AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。
+
+// 补码
+// AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。
 func PKCS7Padding(ciphertext []byte, blocksize int) []byte {
 	padding := blocksize - len(ciphertext)%blocksize
 	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
 	return append(ciphertext, padtext...)
 }
-//去码
+
+// 去码
 func PKCS7UnPadding(origData []byte) []byte {
 	length := len(origData)
 	unpadding := int(origData[length-1])
 	return origData[:(length - unpadding)]
-}
+}
+
+// 实现解密
+func AesDeCrypt(cypted []byte, key []byte) ([]byte, error) {
+	//创建加密算法实例
+	block, err := aes.NewCipher(key)
+	if err != nil {
+		return nil, err
+	}
+	//获取块大小
+	blockSize := block.BlockSize()
+	//创建加密客户端实例
+	blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
+	origData := make([]byte, len(cypted))
+	//这个函数也可以用来解密
+	blockMode.CryptBlocks(origData, cypted)
+	//去除填充字符串
+	origData = PKCS7UnPadding(origData)
+
+	return origData, nil
+}

+ 2 - 2
controllers/lib/Qiniu.go

@@ -82,8 +82,8 @@ func UploadToken(T_suffix string) string {
 		//{"key":"` + conf.Oss + `/$(key)","hash":"$(etag)","fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}
 		ForceSaveKey: true,
 		SaveKey:      "UpImage/" + Tokey + "." + T_suffix,
-		//FsizeLimit:   1024 * 1024 * 1,
-		MimeLimit: "image/*;application/pdf;application/octet-stream",
+		FsizeLimit:   1024 * 1024 * 100,
+		MimeLimit:    "image/*;application/pdf;application/octet-stream;application/zip",
 	}
 
 	upToken := putPolicy.UploadToken(Qiniu)

+ 49 - 0
controllers/lib/wxpay.go

@@ -0,0 +1,49 @@
+package lib
+
+import (
+	"Cold_Api/conf"
+	"Cold_Api/logs"
+	"encoding/json"
+	"fmt"
+	"github.com/go-resty/resty/v2"
+)
+
+// {"Code".200,"CodeUrl":"weixin://wxpay/bizpayurl?pr=NtLrWvBzz","Message":"成功"}
+type WeixinRes struct {
+	Code    int    `json:"Code"`
+	CodeUrl string `json:"CodeUrl"`
+	Message string `json:"Message"`
+	OrderNo string `json:"OrderNo"`
+}
+
+func PayTransactionNative(title string, total float64) (WeixinRes, error) {
+
+	type Vars struct {
+		PwdKey string
+		Title  string
+		Total  float32
+		Notify string
+	}
+
+	client := resty.New()
+	resp, err := client.R().
+		SetHeader("Content-Type", "application/x-www-form-urlencoded").
+		SetFormData(map[string]string{
+			"PwdKey": conf.Weixin_PwdKey,
+			"Notify": conf.Weixin_Notify,
+			"Title":  title,
+			"Total":  fmt.Sprintf("%f", total),
+		}).
+		Post("https://cold.coldbaozhida.com/wxpay_wxb5b2c9147ae0b9db/PayTransactionNative")
+
+	if err != nil {
+		return WeixinRes{}, err
+	}
+
+	temp := WeixinRes{}
+	if err = json.Unmarshal(resp.Body(), &temp); err != nil {
+		logs.Error(FuncName(), err)
+		return WeixinRes{}, err
+	}
+	return temp, nil
+}

+ 1 - 0
go.mod

@@ -18,6 +18,7 @@ require (
 require (
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cespare/xxhash/v2 v2.1.2 // indirect
+	github.com/go-resty/resty/v2 v2.7.0 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
 	github.com/gomodule/redigo v2.0.0+incompatible // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect

+ 3 - 0
go.sum

@@ -99,6 +99,8 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
 github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
 github.com/go-playground/validator/v10 v10.8.0/go.mod h1:9JhgTzTaE31GZDpH/HSvHiRJrJ3iKAgqqH0Bl/Ocjdk=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
+github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
@@ -403,6 +405,7 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R
 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=

+ 64 - 0
models/Company/CompanyPayOrder.go

@@ -0,0 +1,64 @@
+package Company
+
+import (
+	"Cold_Api/controllers/lib"
+	"Cold_Api/logs"
+	"fmt"
+	"github.com/beego/beego/v2/adapter/orm"
+	"time"
+)
+
+// 用户支付订单
+type CompanyPayOrder struct {
+	Id         int       `orm:"column(ID);size(11);auto;pk"`
+	T_pid      int       `orm:"index;size(256);"`                                      // 公司id
+	T_type     string    `orm:"size(256)"`                                             // 微信 支付宝 等等
+	T_title    string    `orm:"type(text)"`                                            // 标题
+	T_total    float64   `orm:"digits(12);decimals(2)"`                                // 金额
+	T_order_no string    `orm:"size(256)"`                                             // 支付订单
+	T_status   string    `orm:"size(256)"`                                             // 支付状态
+	T_remark   string    `orm:"size(256)"`                                             // 备注
+	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
+}
+
+func (t *CompanyPayOrder) TableName() string {
+	return "company_pay_order" // 数据库名称   // ************** 替换 DesignDeviceNotice **************
+}
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(CompanyPayOrder))
+}
+
+func Add_CompanyPayOrder(r CompanyPayOrder) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return
+	}
+	return
+}
+
+// 修改
+func Update_CompanyPayOrder(m CompanyPayOrder, cols ...string) error {
+	o := orm.NewOrm()
+	num, err := o.Update(&m, cols...)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+		return err
+	}
+	fmt.Println("Number of records updated in database:", num)
+	return nil
+}
+
+// 获取 ByT_order_no
+func Get_CompanyPayOrder_ByT_order_no(T_order_no string) (r CompanyPayOrder, err error) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(CompanyPayOrder))
+	err = qs.Filter("T_order_no", T_order_no).One(&r)
+	if err != nil {
+		logs.Error(lib.FuncName(), err)
+	}
+	return
+}

+ 1 - 0
routers/Data.go

@@ -11,6 +11,7 @@ func init() {
 		beego.NSNamespace("/Data",
 			beego.NSBefore(T_pidFilter),
 			beego.NSRouter("/Device_Sensor", &controllers.DataController{}, "*:Device_Sensor_Get"),                       // 获取传感器
+			beego.NSRouter("/Device_Sensor_Data_Real", &controllers.DataController{}, "*:Device_Sensor_Data_Real"),       // 获取传感器
 			beego.NSRouter("/Device_Sensor_List", &controllers.DataController{}, "*:Device_Sensor_List"),                 // 传感器列表
 			beego.NSRouter("/Device_Sensor_Data", &controllers.DataController{}, "*:Device_Sensor_Data"),                 // 传感器数据
 			beego.NSRouter("/Device_Sensor_Data_Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel"),     // 导出传感器数据

+ 4 - 0
routers/User.go

@@ -61,6 +61,10 @@ func init() {
 		beego.NSRouter("/Company/Pay", &controllers.UserController{}, "*:Company_Pay"),                 // 充值
 		beego.NSRouter("/Company/Warning", &controllers.UserController{}, "*:Company_Warning"),         // 报警统计
 
+		beego.NSRouter("/WxPay/Get_QRCode", &controllers.UserController{}, "*:WxPay_QRCode"),           // 获取微信支付二维码
+		beego.NSRouter("/WxPay/Notify", &controllers.UserController{}, "*:WxPay_Notify"),               // 获取微信支付二维码
+		beego.NSRouter("/WxPay/GetOrderState", &controllers.UserController{}, "*:WxPay_GetOrderState"), // 获取微信支付状态
+
 	)
 
 	beego.AddNamespace(ns)