models.py 3.5 KB

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