models.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # coding=utf-8
  2. import time
  3. from django.db import models
  4. from django.utils import timezone
  5. from utils.exceptions import CustomError
  6. from utils.wx.wechat import WeChat
  7. class WechatTp(models.Model):
  8. component_appid = models.CharField(max_length=512, verbose_name=u'第三方平台appid')
  9. component_appsecret = models.CharField(max_length=512, verbose_name=u'第三方平台appsecret')
  10. m_encode_key = models.CharField(max_length=512, verbose_name=u'消息加密key')
  11. m_token = models.CharField(max_length=512, verbose_name=u'消息校验token')
  12. component_verify_ticket = models.CharField(max_length=512, verbose_name=u'验证票据', null=True)
  13. component_access_token = models.CharField(max_length=512, verbose_name=u'令牌', null=True)
  14. access_token_gtime = models.DateTimeField(verbose_name=u"获取令牌时间", null=True)
  15. expires_in = models.IntegerField(verbose_name=u'令牌有效期', null=True)
  16. class Meta:
  17. db_table = "wechat_tp"
  18. ordering = ['-id']
  19. index_together = ()
  20. verbose_name = u"第三方平台"
  21. default_permissions = ()
  22. @staticmethod
  23. def getDefault():
  24. tp = WechatTp.objects.filter().first()
  25. if not tp:
  26. raise CustomError(u'未找到微信第三方平台!')
  27. return tp
  28. @staticmethod
  29. def getByAppid(appid):
  30. component = WechatTp.objects.filter(component_appid=appid).first()
  31. if not component:
  32. raise CustomError(u'未找到相应的第三方平台!')
  33. return component
  34. def getAppid(self):
  35. return self.component_appid
  36. def getToken(self):
  37. return self.m_token
  38. def getEncodeKey(self):
  39. return self.m_encode_key
  40. def getAccessToken(self):
  41. if self.component_access_token:
  42. last_time = time.mktime(self.access_token_gtime.timetuple()) + self.expires_in
  43. now = time.mktime(timezone.now().timetuple())
  44. if last_time > now:
  45. return self.component_access_token
  46. res = WeChat.getComponentAccessToken(self.component_appid, self.component_appsecret, self.component_verify_ticket)
  47. self.refreshAccessToken(timezone.now(), res['component_access_token'], res['expires_in'])
  48. return self.component_access_token
  49. def getPreAuthCode(self):
  50. res = WeChat.getPreAuthCode(self.component_appid, self.getAccessToken())
  51. return res['pre_auth_code']
  52. def refreshVerifyTicket(self, component_verify_ticket):
  53. self.component_verify_ticket = component_verify_ticket
  54. self.save()
  55. def refreshAccessToken(self, gtime, component_access_token, expires_in):
  56. self.access_token_gtime = gtime
  57. self.component_access_token = component_access_token
  58. self.expires_in = expires_in
  59. self.save()
  60. def getAuthUrl(self, tenant_id):
  61. url = 'https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=' + self.getAppid() + '&pre_auth_code=' + self.getPreAuthCode()
  62. url += '&redirect_uri=https://baoxiu360.top/api/redirect_authorize/' + tenant_id + '/&auth_type=2'
  63. return url
  64. def getTemplateList(self):
  65. template_list = WeChat.getCodeTemplateList(self.getAccessToken())
  66. return template_list