15 Commits

Author SHA1 Message Date
  guzeng 357bf1c377 支付调用方法 2 years ago
  guzeng 3d93dcc397 增加订单支付写入 2 years ago
  guzeng 99a1ea238c 增加查询限购公共调用方法 2 years ago
  guzeng a477ea1dd3 修改查询用户订单统计 2 years ago
  guzeng b67bc66cfd 增加查询用户订单统计 2 years ago
  guzeng 0f4871a490 修改订单创建成功参数 2 years ago
  guzeng 9d598a9833 增加查询方法 2 years ago
  guzeng aee06f252a 增加状态查询方法 2 years ago
  guzeng 812e76b02d 修改引入 2 years ago
  guzeng aaffebd0b0 增加查询订单内容调用方法 2 years ago
  guzeng c93d3b84b1 增加请求结构 2 years ago
  guzeng 0889260abf 增加查询订单接口 2 years ago
  guzeng 9a0eabaa50 修改方法参数 2 years ago
  guzeng 0c6708ba7f 增加调用方法 2 years ago
  guzeng 9c89edd1aa 增加签名方法 2 years ago
19 changed files with 825 additions and 0 deletions
Split View
  1. +55
    -0
      cancel.go
  2. +13
    -0
      cancel_test.go
  3. +110
    -0
      client.getinfo.go
  4. +21
    -0
      client.getinfo_test.go
  5. +102
    -0
      client.go
  6. +44
    -0
      client_test.go
  7. +23
    -0
      conn.go
  8. +106
    -0
      data.go
  9. +8
    -0
      go.mod
  10. +20
    -0
      go.sum
  11. +16
    -0
      order.pb.go
  12. +4
    -0
      order.proto
  13. +53
    -0
      payed.go
  14. +25
    -0
      payed_test.go
  15. +37
    -0
      sign.go
  16. +121
    -0
      statistics.go
  17. +33
    -0
      statistics_test.go
  18. +22
    -0
      status..go
  19. +12
    -0
      variable.go

+ 55
- 0
cancel.go View File

@ -0,0 +1,55 @@
package orderrpcv2
import (
"encoding/json"
"errors"
)
func Cancel(site_id, dbname string, order_id string, url ...string) (*OrderCancelRes, error) {
if dbname == "" || order_id == "" {
return nil, errors.New("参数错误")
}
conn, err := rpc_server_conn(url...)
if err != nil {
return nil, err
}
defer conn.Close()
data := make(map[string]string)
data["dbname"] = dbname
data["site_id"] = site_id
req, err := SetReqData(data)
if err != nil {
return nil, err
}
res := &Response{}
err = conn.Cancel(req, res)
if err != nil {
return nil, err
}
res_data_de, err := GetResData(res)
if err != nil {
return nil, err
}
if res_data_de == "" {
return nil, nil
}
var res_arr OrderCancelRes
err = json.Unmarshal([]byte(res_data_de), &res_arr)
if err != nil {
return nil, err
}
return &res_arr, nil
}

+ 13
- 0
cancel_test.go View File

@ -0,0 +1,13 @@
package orderrpcv2
import (
"testing"
)
func Test_Cancel(t *testing.T) {
ret, err := Cancel("jianfan", "100064", "2")
t.Log(ret)
t.Log(err)
}

+ 110
- 0
client.getinfo.go View File

@ -0,0 +1,110 @@
package orderrpcv2
import (
"encoding/json"
"errors"
)
func GetInfo(site_id, dbname string, order_id string, field string, url ...string) (map[string]string, error) {
if dbname == "" || order_id == "" {
return nil, errors.New("参数错误")
}
conn, err := rpc_server_conn(url...)
if err != nil {
return nil, err
}
defer conn.Close()
var data map[string]string = make(map[string]string)
data["dbname"] = dbname
data["site_id"] = site_id
data["order_id"] = order_id
data["field"] = field
data["condition"] = "order_id"
req, err := SetReqData(data)
if err != nil {
return nil, err
}
res := &Response{}
err = conn.Get(req, res)
if err != nil {
return nil, err
}
res_data_de, err := GetResData(res)
if err != nil {
return nil, err
}
if res_data_de == "" {
return nil, nil
}
var res_arr map[string]string
err = json.Unmarshal([]byte(res_data_de), &res_arr)
if err != nil {
return nil, err
}
return res_arr, nil
}
func GetInfoByOrderSn(site_id, dbname string, order_sn string, field string, url ...string) (map[string]string, error) {
if dbname == "" || order_sn == "" {
return nil, errors.New("参数错误")
}
conn, err := rpc_server_conn(url...)
if err != nil {
return nil, err
}
defer conn.Close()
var data map[string]string = make(map[string]string)
data["dbname"] = dbname
data["site_id"] = site_id
data["order_sn"] = order_sn
data["field"] = field
data["condition"] = "order_sn"
req, err := SetReqData(data)
if err != nil {
return nil, err
}
res := &Response{}
err = conn.Get(req, res)
if err != nil {
return nil, err
}
res_data_de, err := GetResData(res)
if err != nil {
return nil, err
}
if res_data_de == "" {
return nil, nil
}
var res_arr map[string]string
err = json.Unmarshal([]byte(res_data_de), &res_arr)
if err != nil {
return nil, err
}
return res_arr, nil
}

+ 21
- 0
client.getinfo_test.go View File

@ -0,0 +1,21 @@
package orderrpcv2
import (
"testing"
"git.tetele.net/tgo/crypter"
)
func Test_GetInfo(t *testing.T) {
// ret, err := GetInfoByOrderSn("100064", "shop_v2", "2021000121222", "id,order_sn")
// t.Log(ret)
// t.Log(err)
data := "1DD5556CC3F069F517419E4BAA490CFBE0BB2D0027C59249B641A0D1AF05E2A3076F605D22044171D5552BF856B6448807F7B08063421E0C263CC47B3ECB0763193D704A0B4A30018F980E5D2F8A7196A7B0EAE7D7FF3E6F20BA573EAB2A3A196CC4ECE6095A76B1E2F9660AB4AAC04C0FF7C74C3CEAEF0E82D0357E67C2549AA754B1DFE3F1F195F075CFBCCB59A8A4"
ret := crypter.DesDe(data, DES_KEY)
t.Log(ret)
}

+ 102
- 0
client.go View File

@ -0,0 +1,102 @@
package orderrpcv2
import (
"encoding/json"
"errors"
"log"
)
func Create(site_id, dbname string, data map[string]string, url ...string) (*OrderCreateRes, error) {
if dbname == "" || len(data) < 1 {
return nil, errors.New("参数错误")
}
conn, err := rpc_server_conn(url...)
if err != nil {
return nil, err
}
defer conn.Close()
data["dbname"] = dbname
data["site_id"] = site_id
req, err := SetReqData(data)
if err != nil {
return nil, err
}
res := &Response{}
err = conn.Create(req, res)
if err != nil {
return nil, err
}
res_data_de, err := GetResData(res)
if err != nil {
return nil, err
}
if res_data_de == "" {
return nil, nil
}
log.Println(res_data_de)
var res_arr OrderCreateRes
err = json.Unmarshal([]byte(res_data_de), &res_arr)
if err != nil {
return nil, err
}
return &res_arr, nil
}
func CreateByCart(site_id, dbname string, data map[string]interface{}, url ...string) (*OrderCreateRes, error) {
if dbname == "" || len(data) < 1 {
return nil, errors.New("参数错误")
}
conn, err := rpc_server_conn(url...)
if err != nil {
return nil, err
}
defer conn.Close()
data["dbname"] = dbname
data["site_id"] = site_id
req, err := SetReqData(data)
if err != nil {
return nil, err
}
res := &Response{}
err = conn.CreateByCart(req, res)
if err != nil {
return nil, err
}
res_data_de, err := GetResData(res)
if err != nil {
return nil, err
}
if res_data_de == "" {
return nil, nil
}
var res_arr OrderCreateRes
err = json.Unmarshal([]byte(res_data_de), &res_arr)
if err != nil {
return nil, err
}
return &res_arr, nil
}

+ 44
- 0
client_test.go
File diff suppressed because it is too large
View File


+ 23
- 0
conn.go View File

@ -0,0 +1,23 @@
package orderrpcv2
import (
"git.tetele.net/tgo/conf"
)
func rpc_server_conn(url ...string) (*OrderServiceClient, error) {
var rpc_url string
if len(url) > 0 && url[0] != "" {
rpc_url = url[0]
} else if conf.ORDER_RPC_V2_URL != "" {
rpc_url = conf.ORDER_RPC_V2_URL
} else {
rpc_url = "127.0.0.1:" + conf.ORDER_RPC_V2_PORT
}
conn, _, err := DialOrderService("tcp", rpc_url)
if err != nil {
return nil, err
}
return conn, nil
}

+ 106
- 0
data.go View File

@ -0,0 +1,106 @@
package orderrpcv2
import (
"encoding/json"
"errors"
"strconv"
"time"
"git.tetele.net/tgo/crypter"
"github.com/golang/protobuf/proto"
)
func SetResData(data interface{}, res *Response) {
res_data_json, err := json.Marshal(data)
if err == nil {
encryData := crypter.DesEn(string(res_data_json), DES_KEY)
now_str := strconv.FormatInt(time.Now().Unix(), 10)
res_sign := Sign(encryData, now_str)
res.Data = proto.String(encryData)
res.Time = proto.String(now_str)
res.Sign = proto.String(res_sign)
}
}
func SetReqData(arg interface{}) (*Request, error) {
data_json, err := json.Marshal(arg)
if err != nil {
return nil, err
}
now_int64 := time.Now().Unix()
encryData := crypter.DesEn(string(data_json), DES_KEY)
now := strconv.FormatInt(now_int64, 10)
sign := Sign(encryData, now)
return &Request{proto.String(encryData), proto.String(now), proto.String(sign), nil}, nil
}
func GetReqData(req *Request) (string, error) {
res_data := req.GetData()
if res_data != "" {
time_int64, err := strconv.ParseInt(req.GetTime(), 10, 64)
if err != nil {
return "", err
}
now_int64 := time.Now().Unix()
if now_int64-time_int64 > 10 || time_int64-now_int64 > 10 {
//时间误差前后10秒,返回
return "", errors.New("返回时间错误")
}
check_sign := CheckSign(req.GetSign(), res_data, req.GetTime())
if !check_sign {
return "", errors.New("返回数据签名错误")
}
//解密
return crypter.DesDe(res_data, DES_KEY), nil
}
return "", nil
}
func GetResData(res *Response) (string, error) {
res_data := res.GetData()
if res_data != "" {
time_int64, err := strconv.ParseInt(res.GetTime(), 10, 64)
if err != nil {
return "", err
}
now_int64 := time.Now().Unix()
if now_int64-time_int64 > 10 || time_int64-now_int64 > 10 {
//时间误差前后10秒,返回
return "", errors.New("返回时间错误")
}
check_sign := CheckSign(res.GetSign(), res_data, res.GetTime())
if !check_sign {
return "", errors.New("返回数据签名错误")
}
//解密
return crypter.DesDe(res_data, DES_KEY), nil
}
return "", nil
}

+ 8
- 0
go.mod View File

@ -1,3 +1,11 @@
module git.tetele.net/tgo/orderrpcv2
go 1.14
require (
git.tetele.net/tgo/conf v0.35.1 // indirect
git.tetele.net/tgo/crypter v0.2.2 // indirect
github.com/chai2010/protorpc v1.1.3 // indirect
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
)

+ 20
- 0
go.sum View File

@ -0,0 +1,20 @@
git.tetele.net/tgo/conf v0.35.1 h1:1f/mzITBHCOPzu1SuYnbL4oHpNEIZewSaAwlI3vNoOQ=
git.tetele.net/tgo/conf v0.35.1/go.mod h1:AWVIBEDE5dtotthUgR0SWaR2Qa6/f+O5WQ3s7Tj8q7A=
git.tetele.net/tgo/crypter v0.2.2 h1:YMQJh2Gj5Po4ZfelJUmXBKi01UbmtiSy3bmqRfnYQMo=
git.tetele.net/tgo/crypter v0.2.2/go.mod h1:vfvRLZA8+lHNgNXneOcgvVhDyuv25ZRb+C6xHOmXNx0=
github.com/chai2010/protorpc v1.1.3 h1:VJK5hIoZn0XCGol0GmbxZkUG6FbTI5LP2Lam6RVd15w=
github.com/chai2010/protorpc v1.1.3/go.mod h1:/wO0kiyVdu7ug8dCMrA2yDr2vLfyhsLEuzLa9J2HJ+I=
github.com/golang/protobuf v1.0.0 h1:lsek0oXi8iFE9L+EXARyHIjU5rlWIhhTkjDz3vHhWWQ=
github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

+ 16
- 0
order.pb.go View File

@ -102,6 +102,10 @@ type OrderService interface {
CreateByCart(in *Request, out *Response) error
Cancel(in *Request, out *Response) error
AutoReceive(in *Request, out *Response) error
Get(in *Request, out *Response) error
GetUserBuyTotal(in *Request, out *Response) error
GetUserBuyNum(in *Request, out *Response) error
Payed(in *Request, out *Response) error
}
// AcceptOrderServiceClient accepts connections on the listener and serves requests
@ -185,6 +189,18 @@ func (c *OrderServiceClient) Cancel(in *Request, out *Response) error {
func (c *OrderServiceClient) AutoReceive(in *Request, out *Response) error {
return c.Call("OrderService.AutoReceive", in, out)
}
func (c *OrderServiceClient) Get(in *Request, out *Response) error {
return c.Call("OrderService.Get", in, out)
}
func (c *OrderServiceClient) GetUserBuyTotal(in *Request, out *Response) error {
return c.Call("OrderService.GetUserBuyTotal", in, out)
}
func (c *OrderServiceClient) GetUserBuyNum(in *Request, out *Response) error {
return c.Call("OrderService.GetUserBuyNum", in, out)
}
func (c *OrderServiceClient) Payed(in *Request, out *Response) error {
return c.Call("OrderService.Payed", in, out)
}
// DialOrderService connects to an OrderService at the specified network address.
func DialOrderService(network, addr string) (*OrderServiceClient, *rpc.Client, error) {


+ 4
- 0
order.proto View File

@ -21,4 +21,8 @@ service OrderService {
rpc createByCart (Request) returns (Response); //
rpc cancel (Request) returns (Response); //
rpc autoReceive(Request) returns(Response); //
rpc Get (Request) returns (Response); // 使id查询
rpc GetUserBuyTotal (Request) returns (Response); //
rpc GetUserBuyNum (Request) returns (Response); //
rpc Payed (Request) returns (Response); //
}

+ 53
- 0
payed.go View File

@ -0,0 +1,53 @@
package orderrpcv2
import (
"encoding/json"
"errors"
)
func Payed(dbname, platform string, data map[string]interface{}, url ...string) (*OrderCancelRes, error) {
if dbname == "" || len(data) < 1 {
return nil, errors.New("参数错误")
}
conn, err := rpc_server_conn(url...)
if err != nil {
return nil, err
}
defer conn.Close()
data["dbname"] = dbname
data["platform"] = platform
req, err := SetReqData(data)
if err != nil {
return nil, err
}
res := &Response{}
err = conn.Payed(req, res)
if err != nil {
return nil, err
}
res_data_de, err := GetResData(res)
if err != nil {
return nil, err
}
if res_data_de == "" {
return nil, nil
}
var res_arr OrderCancelRes
err = json.Unmarshal([]byte(res_data_de), &res_arr)
if err != nil {
return nil, err
}
return &res_arr, nil
}

+ 25
- 0
payed_test.go View File

@ -0,0 +1,25 @@
package orderrpcv2
import (
"testing"
)
func Test_Payed(t *testing.T) {
payData := map[string]interface{}{
"pay_type": "wechat",
"pay_method": "jsapi",
"order_sn": "2163040248896658",
"payment_sn": "ddddd",
"payer_total": 17.66,
"total": 33.33, //单位转为元
"user_openid": "adfawrkepoieirpwoer",
"user_id": "55",
"success_time": "2021-10-12 10:20:30",
}
ret, err := Payed("shop_v2", "miniapp", payData)
t.Log(ret)
t.Log(err)
}

+ 37
- 0
sign.go View File

@ -0,0 +1,37 @@
package orderrpcv2
import (
"crypto/md5"
"encoding/hex"
"strings"
)
/**
* 签名
*/
func Sign(data string, salt string) string {
var build strings.Builder
build.WriteString(data)
build.WriteString(salt)
build.WriteString("oO&%$yLtesD")
data_str := build.String()
h := md5.New()
h.Write([]byte(data_str)) // 需要加密的字符串
return hex.EncodeToString(h.Sum(nil)) // 输出加密结果
}
/**
* 验证签名
*/
func CheckSign(sign_str, data, salt string) bool {
sign := Sign(data, salt)
if strings.Compare(sign_str, sign) > -1 {
return true
}
return false
}

+ 121
- 0
statistics.go View File

@ -0,0 +1,121 @@
package orderrpcv2
import (
"encoding/json"
"errors"
"strconv"
)
func GetUserBuyNum(site_id, dbname string, product_id string, user_id string, url ...string) (int64, error) {
if dbname == "" || product_id == "" || user_id == "" {
return 0, errors.New("参数错误")
}
conn, err := rpc_server_conn(url...)
if err != nil {
return 0, err
}
defer conn.Close()
var data map[string]string = make(map[string]string)
data["dbname"] = dbname
data["site_id"] = site_id
data["product_id"] = product_id
data["user_id"] = user_id
req, err := SetReqData(data)
if err != nil {
return 0, err
}
res := &Response{}
err = conn.GetUserBuyNum(req, res)
if err != nil {
return 0, err
}
res_data_de, err := GetResData(res)
if err != nil {
return 0, err
}
if res_data_de == "" {
return 0, errors.New("no data")
}
var res_arr map[string]string
err = json.Unmarshal([]byte(res_data_de), &res_arr)
if err != nil {
return 0, err
}
if _, ok := res_arr["Quantity"]; ok {
return strconv.ParseInt(res_arr["Quantity"], 10, 64)
}
return 0, errors.New("failed")
}
func GetUserBuyTotal(site_id, dbname string, product_id string, user_id string, url ...string) (int64, error) {
if dbname == "" || product_id == "" || user_id == "" {
return 0, errors.New("参数错误")
}
conn, err := rpc_server_conn(url...)
if err != nil {
return 0, err
}
defer conn.Close()
var data map[string]string = make(map[string]string)
data["dbname"] = dbname
data["site_id"] = site_id
data["product_id"] = product_id
data["user_id"] = user_id
req, err := SetReqData(data)
if err != nil {
return 0, err
}
res := &Response{}
err = conn.GetUserBuyTotal(req, res)
if err != nil {
return 0, err
}
res_data_de, err := GetResData(res)
if err != nil {
return 0, err
}
if res_data_de == "" {
return 0, errors.New("no data")
}
var res_arr map[string]string
err = json.Unmarshal([]byte(res_data_de), &res_arr)
if err != nil {
return 0, err
}
if _, ok := res_arr["Total"]; ok {
return strconv.ParseInt(res_arr["Total"], 10, 64)
}
return 0, errors.New("failed")
}

+ 33
- 0
statistics_test.go View File

@ -0,0 +1,33 @@
package orderrpcv2
import (
"testing"
)
func Test_GetUserBuyNum(t *testing.T) {
site_id := "10110"
dbname := "shop_v2"
product_id := "51"
user_id := "2"
ret, err := GetUserBuyNum(site_id, dbname, product_id, user_id)
t.Log(ret)
t.Log(err)
}
func Test_GetUserBuyTotal(t *testing.T) {
site_id := "10110"
dbname := "shop_v2"
product_id := "51"
user_id := "2"
ret, err := GetUserBuyTotal(site_id, dbname, product_id, user_id)
t.Log(ret)
t.Log(err)
}

+ 22
- 0
status..go View File

@ -0,0 +1,22 @@
package orderrpcv2
func GetStatus(key string) string {
statusList := StatusList()
if _, ok := statusList[key]; ok {
return statusList[key]
}
return ""
}
func StatusList() map[string]string {
return map[string]string{
"created": "已创建",
"payed": "已支付",
"finished": "已完成",
"autofinished": "自动完成",
"cancel": "取消",
"autocancel": "自动取消",
"closed": "关闭",
"shipped": "已发货",
}
}

+ 12
- 0
variable.go View File

@ -0,0 +1,12 @@
package orderrpcv2
const DES_KEY = "ordernew"
type OrderCreateRes struct {
OrderSn string
OrderId string
}
type OrderCancelRes struct {
Success bool
}

Loading…
Cancel
Save