DeviceController.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # @Author : Rocky
  2. # @File : DeviceController.py.py
  3. # @Time : 2025/2/19 11:22
  4. import requests
  5. from django.views.generic.base import View
  6. from Controller.WeChatMiniProgram.CommonController import CommonObj
  7. from Object.Enums.WeChatEnum import WeChatMiniProgramAPIEnum, WeChatMiniProgramConfigEnum
  8. from Object.RedisObject import RedisObject
  9. from Object.ResponseObject import ResponseObject
  10. class DeviceView(View):
  11. def get(self, request, *args, **kwargs):
  12. request.encoding = 'utf-8'
  13. operation = kwargs.get('operation')
  14. return self.validation(request.GET, request, operation)
  15. def post(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. operation = kwargs.get('operation')
  18. return self.validation(request.POST, request, operation)
  19. def validation(self, request_dict, request, operation):
  20. lang = request_dict.get('lang', 'cn')
  21. response = ResponseObject(lang)
  22. if operation == 'getSnTicket':
  23. return self.get_sn_ticket(request_dict, response)
  24. @staticmethod
  25. def get_sn_ticket(request_dict, response):
  26. """
  27. 获取设备票据
  28. https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/hardware-device/getSnTicket.html
  29. @param request_dict:
  30. @param response:
  31. @return: res
  32. """
  33. uid = request_dict.get('uid', None)
  34. device_type = request_dict.get('device_type', None)
  35. if not all([uid, device_type]):
  36. return response.json(444)
  37. try:
  38. # 根据设备型号确定model_id
  39. model_id = WeChatMiniProgramConfigEnum.ModelIdDict.value['device_type']
  40. # 从缓存中获取票据
  41. redis_obj = RedisObject()
  42. sn_ticket_key = WeChatMiniProgramConfigEnum.SnTicketKey.value
  43. sn_ticket = redis_obj.get_data(sn_ticket_key)
  44. if sn_ticket:
  45. res = {
  46. 'sn_ticket': sn_ticket
  47. }
  48. return response.json(0, res)
  49. access_token = CommonObj.get_access_token()
  50. url = WeChatMiniProgramAPIEnum.getSnTicketAPI.value.format(access_token)
  51. data = {
  52. 'sn': uid,
  53. 'model_id': model_id
  54. }
  55. r = requests.post(url=url, json=data, timeout=5)
  56. result = eval(r.content)
  57. errcode = result.get('errcode')
  58. assert errcode == 0
  59. sn_ticket = result['sn_ticket']
  60. # 保存到Redis,五分钟有效
  61. redis_obj.set_ex_data(key=sn_ticket_key, val=sn_ticket, expire=60*5)
  62. res = {
  63. 'sn_ticket': sn_ticket
  64. }
  65. return response.json(0, res)
  66. except Exception as e:
  67. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))