UserController.py 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # @Author : Rocky
  2. # @File : UserController.py
  3. # @Time : 2024/11/27 16:35
  4. import requests
  5. from Ansjer.config import LOGGER
  6. from django.views.generic.base import View
  7. from Object.Enums.WeChatEnum import WeChatMiniProgramAPIEnum, WeChatMiniProgramConfigEnum
  8. from Object.RedisObject import RedisObject
  9. from Object.ResponseObject import ResponseObject
  10. class EquipmentFamilyView(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. access_token = self.get_access_token()
  23. if operation == 'getPhoneNumber':
  24. return self.get_phone_number(request_dict, response)
  25. else:
  26. return response.json(414)
  27. @staticmethod
  28. def get_access_token():
  29. """
  30. 获取小程序全局唯一后台接口调用凭据,token有效期为7200s
  31. https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
  32. @return: access_token
  33. """
  34. try:
  35. redis_obj = RedisObject()
  36. access_token_key = WeChatMiniProgramConfigEnum.AccessTokenKey.value
  37. expires_time = redis_obj.get_ttl(access_token_key)
  38. # 如果有效时间大于十分钟,返回token,否则刷新token
  39. if expires_time > 10 * 60:
  40. access_token = redis_obj.get_data(access_token_key)
  41. return access_token
  42. else:
  43. params = {
  44. 'grant_type': 'client_credential',
  45. 'appid': WeChatMiniProgramConfigEnum.AppID.value,
  46. 'secret': WeChatMiniProgramConfigEnum.AppSecret.value
  47. }
  48. r = requests.get(url=WeChatMiniProgramAPIEnum.getAccessTokenAPI.value, params=params, timeout=5)
  49. result = eval(r.content)
  50. access_token = result.get('access_token')
  51. assert access_token
  52. expires_in = result.get('expires_in')
  53. # 保存到Redis
  54. redis_obj.set_ex_data(key=access_token_key, val=access_token, expire=expires_in)
  55. return access_token
  56. except Exception as e:
  57. LOGGER.info('微信小程序获取token异常:error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  58. return None
  59. @classmethod
  60. def get_phone_number(cls, request_dict, response):
  61. """
  62. 获取手机号码
  63. @param request_dict:
  64. @param response:
  65. @return: phone_number
  66. """
  67. code = request_dict.get('code', None)
  68. if not code:
  69. return response.json(444)
  70. try:
  71. access_token = cls.get_access_token()
  72. url = WeChatMiniProgramAPIEnum.getPhoneNumberAPI.value.format(access_token)
  73. data = {
  74. 'code': code
  75. }
  76. r = requests.post(url=url, data=data, timeout=5)
  77. result = eval(r.content)
  78. errcode = result.get('errcode')
  79. assert errcode == 0
  80. pure_phone_number = result['phone_info']['purePhoneNumber']
  81. res = {
  82. 'purePhoneNumber': pure_phone_number
  83. }
  84. return response.json(0, res)
  85. except Exception as e:
  86. LOGGER.info('微信小程序获取手机号码异常:error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  87. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))