models.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. # coding=utf-8
  2. import time
  3. import os
  4. from django.conf import settings
  5. from django.db import models
  6. from django.utils import timezone
  7. from utils.wx.wechat import WeChat
  8. from utils.exceptions import CustomError
  9. class WechatApplet(models.Model):
  10. authorizer_appid = models.CharField(max_length=512, verbose_name=u'小程序appid')
  11. secret = models.CharField(max_length=512, verbose_name=u'小程序秘钥', null=True)
  12. authorizer_refresh_token = models.CharField(max_length=512, verbose_name=u'刷新令牌', null=True)
  13. authorizer_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. agent_num = models.CharField(max_length=512, verbose_name=u'商户号', default="")
  17. agent_key = models.CharField(max_length=512, verbose_name=u'商户密钥', default="")
  18. cert_serial_no = models.CharField(max_length=512, verbose_name=u'商户证书序列号', default="")
  19. apiv3_key = models.CharField(max_length=512, verbose_name=u'商户APIv3密钥', default="")
  20. create_ip = models.CharField(max_length=100, verbose_name=u'服务器IP地址', default="")
  21. callback_api = models.CharField(max_length=100, verbose_name=u'微信支付回调API', default="")
  22. class Meta:
  23. db_table = "wechat_applet"
  24. ordering = ['-id']
  25. verbose_name = u'小程序'
  26. default_permissions = ()
  27. permissions = []
  28. @staticmethod
  29. def getByAppid(appid):
  30. instance = WechatApplet.objects.filter(authorizer_appid=appid).first()
  31. if not instance:
  32. raise CustomError(u'未找到相应的小程序!')
  33. return instance
  34. def getAccessToken(self):
  35. if self.authorizer_access_token:
  36. last_time = time.mktime(self.access_token_gtime.timetuple()) + self.expires_in
  37. now = time.mktime(timezone.now().timetuple())
  38. if last_time > now:
  39. return self.authorizer_access_token
  40. gtime = timezone.now()
  41. res = WeChat.getAccessToken(self.authorizer_appid, self.secret)
  42. self.refreshAccessToken(gtime, res['access_token'], res['expires_in'])
  43. return self.authorizer_access_token
  44. def refreshAccessToken(self, gtime, access_token, expires_in, refresh_token=''):
  45. self.authorizer_access_token = access_token
  46. self.access_token_gtime = gtime
  47. self.expires_in = expires_in
  48. self.authorizer_refresh_token = refresh_token
  49. self.save()