劲创营---任务项目
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

231 行
6.8 KiB

  1. package cloud_printer
  2. import (
  3. "applet/app/comm/e"
  4. "applet/app/comm/utils"
  5. "applet/app/comm/utils/cache"
  6. "applet/app/printer/md"
  7. "crypto/md5"
  8. "encoding/hex"
  9. "encoding/json"
  10. "fmt"
  11. "github.com/syyongx/php2go"
  12. "github.com/tidwall/gjson"
  13. "math/rand"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. // 添加打印机
  19. func AddPrinter(masterId, clientId, clientSecret string, args md.PrinterReq) error {
  20. token := GetToken(masterId, clientId, clientSecret)
  21. param := map[string]interface{}{
  22. "client_id": clientId,
  23. "machine_code": args.Sn,
  24. "msign": args.Key,
  25. "print_name": args.Remark,
  26. "access_token": token,
  27. "id": GetUUID4(),
  28. }
  29. data, err := Send("printer/addprinter", clientSecret, param, 1)
  30. fmt.Println(data)
  31. fmt.Println(err)
  32. if err != nil || gjson.GetBytes(data, "error").String() != "0" {
  33. if err == nil {
  34. err = e.NewErr(400, gjson.GetBytes(data, "error_description").String())
  35. }
  36. return err
  37. }
  38. return nil
  39. }
  40. // 删除
  41. func DelPrinter(masterId, clientId, clientSecret string, args md.PrinterReq) error {
  42. token := GetToken(masterId, clientId, clientSecret)
  43. param := map[string]interface{}{
  44. "client_id": clientId,
  45. "machine_code": args.Sn,
  46. "access_token": token,
  47. "id": GetUUID4(),
  48. }
  49. data, err := Send("printer/deleteprinter", clientSecret, param, 1)
  50. fmt.Println(data)
  51. fmt.Println(err)
  52. if err != nil || gjson.GetBytes(data, "error").String() != "0" {
  53. if err == nil {
  54. err = e.NewErr(400, gjson.GetBytes(data, "error_description").String())
  55. }
  56. return err
  57. }
  58. return nil
  59. }
  60. // 设置推送链接
  61. func SetSendUrl(masterId, clientId, clientSecret string, args map[string]string) error {
  62. token := GetToken(masterId, clientId, clientSecret)
  63. param := map[string]interface{}{
  64. "client_id": clientId,
  65. "cmd": args["cmd"],
  66. "url": args["url"],
  67. "status": args["status"],
  68. "access_token": token,
  69. "id": GetUUID4(),
  70. }
  71. data, err := Send("oauth/setpushurl", clientSecret, param, 1)
  72. fmt.Println(data)
  73. fmt.Println(err)
  74. if err != nil || gjson.GetBytes(data, "error").String() != "0" {
  75. if err == nil {
  76. err = e.NewErr(400, gjson.GetBytes(data, "error_description").String())
  77. }
  78. return err
  79. }
  80. return nil
  81. }
  82. // 打印
  83. func PrintDoing(masterId, clientId, clientSecret string, args md.PrinterReq) string {
  84. content := args.Content
  85. content1, _ := php2go.Base64Decode(args.Content)
  86. if content1 != "" {
  87. content = content1
  88. }
  89. token := GetToken(masterId, clientId, clientSecret)
  90. param := map[string]interface{}{
  91. "client_id": clientId,
  92. "machine_code": args.Sn,
  93. "content": content,
  94. "origin_id": args.Oid,
  95. "access_token": token,
  96. "id": GetUUID4(),
  97. }
  98. data, err := Send("print/index", clientSecret, param, 1)
  99. fmt.Println(data)
  100. fmt.Println(err)
  101. if err != nil || gjson.GetBytes(data, "error").String() != "0" {
  102. return ""
  103. }
  104. return gjson.GetBytes(data, "body.id").String()
  105. }
  106. // 获取订单状态
  107. func GetOrdStatus(masterId, clientId, clientSecret string, args md.PrinterReq) int {
  108. token := GetToken(masterId, clientId, clientSecret)
  109. param := map[string]interface{}{
  110. "client_id": clientId,
  111. "machine_code": args.Sn,
  112. "order_id": args.Oid,
  113. "access_token": token,
  114. "id": GetUUID4(),
  115. }
  116. data, err := Send("printer/getorderstatus", clientSecret, param, 1)
  117. fmt.Println(data)
  118. fmt.Println(err)
  119. if err != nil || gjson.GetBytes(data, "error").String() != "0" {
  120. return 0
  121. }
  122. return int(gjson.GetBytes(data, "body.status").Int())
  123. }
  124. // 获取终端状态
  125. func GetPrinterStatus(masterId, clientId, clientSecret string, args md.PrinterReq) int {
  126. token := GetToken(masterId, clientId, clientSecret)
  127. param := map[string]interface{}{
  128. "client_id": clientId,
  129. "machine_code": args.Sn,
  130. "access_token": token,
  131. "id": GetUUID4(),
  132. }
  133. data, err := Send("printer/getprintstatus", clientSecret, param, 1)
  134. fmt.Println(data)
  135. fmt.Println(err)
  136. if err != nil || gjson.GetBytes(data, "error").String() != "0" {
  137. return 0
  138. }
  139. return int(gjson.GetBytes(data, "body.state").Int())
  140. }
  141. // 获取token
  142. func GetToken(masterId, clientId, clientSecret string) string {
  143. args := map[string]interface{}{
  144. "client_id": clientId,
  145. "grant_type": "client_credentials",
  146. "scope": "all",
  147. "id": GetUUID4(),
  148. }
  149. key := fmt.Sprintf("%s:cloud_token_%s", masterId, clientId)
  150. redisData, _ := cache.GetString(key)
  151. token := gjson.Get(redisData, "access_token").String()
  152. refreshToken := gjson.Get(redisData, "refresh_token").String()
  153. expiresTime := gjson.Get(redisData, "expires_time").String()
  154. tokens := ""
  155. if refreshToken == "" && token == "" {
  156. tokens = CommSaveToken(key, clientSecret, args)
  157. if tokens != "" {
  158. token = tokens
  159. }
  160. } else if utils.StrToInt64(expiresTime) < time.Now().Unix() { //过期处理
  161. args["grant_type"] = "refresh_token"
  162. args["refresh_token"] = refreshToken
  163. tokens = CommSaveToken(key, clientSecret, args)
  164. }
  165. if tokens != "" {
  166. token = tokens
  167. }
  168. return token
  169. }
  170. func CommSaveToken(key string, clientSecret string, args map[string]interface{}) string {
  171. data, err := Send("oauth/oauth", clientSecret, args, 1)
  172. if err != nil || gjson.GetBytes(data, "error").String() != "0" {
  173. return ""
  174. }
  175. expiresIn := gjson.GetBytes(data, "body.expires_in").Int()
  176. body := gjson.GetBytes(data, "body").String()
  177. var resData map[string]interface{}
  178. json.Unmarshal([]byte(body), &resData)
  179. resData["expires_time"] = utils.Int64ToStr(time.Now().Unix() + expiresIn - 86400)
  180. jsonData, _ := json.Marshal(resData)
  181. cache.SetEx(key, string(jsonData), int(expiresIn+86400))
  182. token := gjson.GetBytes(data, "body.access_token").String()
  183. return token
  184. }
  185. func Send(act string, clientSecret string, args map[string]interface{}, isPost int) ([]byte, error) {
  186. router := "https://open-api.10ss.net/" + act
  187. oldRouter := router
  188. args["timestamp"] = strconv.FormatInt(time.Now().Unix(), 10)
  189. args["sign"] = GetSign(utils.AnyToString(args["client_id"]), utils.AnyToString(args["timestamp"]), clientSecret)
  190. for k, v := range args {
  191. if strings.Contains(router, "?") == false {
  192. router += "?" + k + "=" + php2go.URLEncode(utils.AnyToString(v))
  193. } else {
  194. router += "&" + k + "=" + php2go.URLEncode(utils.AnyToString(v))
  195. }
  196. }
  197. if isPost == 1 {
  198. return utils.CurlPost(oldRouter, args, map[string]string{})
  199. }
  200. return utils.CurlGet(router, map[string]string{})
  201. }
  202. func GetSign(clientId, timestamp, clientServer string) string {
  203. pretreatmentData := fmt.Sprintf("%s%s%s", clientId, timestamp, clientServer)
  204. m := md5.New()
  205. m.Write([]byte(pretreatmentData))
  206. return fmt.Sprintf("%s", hex.EncodeToString(m.Sum(nil)))
  207. }
  208. func GetUUID4() string {
  209. return fmt.Sprintf("%04x%04x-%04x-%04x-%04x-%04x%04x%04x",
  210. mtRand(0, 0xffff), mtRand(0, 0xffff),
  211. mtRand(0, 0xffff),
  212. mtRand(0, 0xfff)|0x4000,
  213. mtRand(0, 0x3fff)|0x8000,
  214. mtRand(0, 0xffff), mtRand(0, 0xffff), mtRand(0, 0xffff),
  215. )
  216. }
  217. func mtRand(min, max int) int {
  218. return rand.Intn(max-min) + min
  219. }