models.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 util.wx.wechat import WeChat
  8. from util.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. index_together = ()
  26. verbose_name = u"小程序"
  27. default_permissions = ()
  28. permissions = []
  29. @staticmethod
  30. def getByAppid(appid):
  31. instance = WechatApplet.objects.filter(authorizer_appid=appid).first()
  32. if not instance:
  33. raise CustomError(u'未找到相应的小程序!')
  34. return instance
  35. def getAccessToken(self):
  36. if self.authorizer_access_token:
  37. last_time = time.mktime(self.access_token_gtime.timetuple()) + self.expires_in
  38. now = time.mktime(timezone.now().timetuple())
  39. if last_time > now:
  40. return self.authorizer_access_token
  41. gtime = timezone.now()
  42. res = WeChat.getAccessToken(self.authorizer_appid, self.secret)
  43. self.refreshAccessToken(gtime, res['access_token'], res['expires_in'])
  44. return self.authorizer_access_token
  45. def refreshAccessToken(self, gtime, access_token, expires_in, refresh_token=''):
  46. self.authorizer_access_token = access_token
  47. self.access_token_gtime = gtime
  48. self.expires_in = expires_in
  49. self.authorizer_refresh_token = refresh_token
  50. self.save()
  51. def generateActivityCode(self, customer_id, activity_id):
  52. '''生成海报二维码'''
  53. filename = "{}{}_{}.png".format("wxacode/", activity_id, customer_id)
  54. full_filename = "{}/{}".format(settings.MEDIA_ROOT, filename)
  55. if os.path.exists(full_filename):
  56. return filename
  57. page = 'pages/index/index'
  58. filename = WeChat.getActivityCode(self.getAccessToken(), page, customer_id, activity_id)
  59. return filename
  60. def generateActivityWXappCode(self, activity_id):
  61. filename = "{}_{}.png".format("wxacode/", activity_id)
  62. full_filename = "{}/{}".format(settings.MEDIA_ROOT, filename)
  63. if os.path.exists(full_filename):
  64. return filename
  65. page = 'pages/index/index'
  66. filename = WeChat.getActivityWXappCode(self.getAccessToken(), page, activity_id)
  67. return filename
  68. # def getMsgTemplateId(self, title):
  69. # templates = WeChat.getTemplateList(self.getAccessToken())
  70. # for template in templates:
  71. # if template['title'] == title:
  72. # return template['priTmplId']
  73. # return ''
  74. #
  75. # def sendPayOrderMsg(self, openid, msg_data):
  76. # template_id = self.getMsgTemplateId('订单支付成功通知')
  77. # if not template_id:
  78. # return
  79. # data = {
  80. # 'date3':{'value':msg_data['pay_time'].strftime('%Y-%m-%d %H:%M:%S')},
  81. # 'phrase4': {'value': msg_data['payment']},
  82. # 'character_string5': {'value': msg_data['no']},
  83. # 'amount2':{'value': msg_data['pay_amount']},
  84. # 'thing7':{'value': msg_data['tips']},
  85. # }
  86. # page = 'pages/order/order?value=1'
  87. # WeChat.sendSubscribeMessage(self.getAccessToken(), openid, template_id, page, data)