models.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # coding=utf-8
  2. from django.db import models
  3. from django.conf import settings
  4. from django.contrib.auth import get_user_model
  5. from apps.wechat.models import Wechat
  6. from utils.wx.wechat import WeChat
  7. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  8. from utils.exceptions import CustomError
  9. User = get_user_model()
  10. class Customer(models.Model):
  11. app = models.ForeignKey(Wechat, verbose_name=u'小程序', on_delete=models.PROTECT, editable=False)
  12. user = models.ForeignKey(settings.AUTH_USER_MODEL, editable=False, related_name='customer_ref_user_id', on_delete=models.PROTECT, verbose_name=u'用户', null=True)
  13. openid = models.CharField(max_length=512, verbose_name=u"openid")
  14. session_key = models.CharField(max_length=512, verbose_name=u'session_key', null=True)
  15. class Meta:
  16. db_table = "customer"
  17. verbose_name = u"客户管理"
  18. ordering = ['-id']
  19. unique_together = [
  20. ('openid')
  21. ]
  22. index_together = ()
  23. default_permissions = ()
  24. @staticmethod
  25. def login(code, appid):
  26. app = Wechat.getByAppid(appid)
  27. res = WeChat.code2Session(appid, app.secret, code)
  28. instance = Customer.objects.filter(openid=res['openid'], app__appid=appid).first()
  29. if not instance:
  30. instance = Customer.objects.create(
  31. app=app,
  32. openid=res['openid'],
  33. session_key=res['session_key']
  34. )
  35. else:
  36. instance.session_key = res['session_key']
  37. instance.save()
  38. return instance
  39. @staticmethod
  40. def bindWechat(appid, openid, phoneEncryptedData, phoneIv):
  41. customer = Customer.objects.filter(openid=openid, app__appid=appid).first()
  42. if not customer:
  43. raise CustomError(u'未找到相应的微信客户!')
  44. pc = WXBizDataCrypt(appid, customer.session_key)
  45. phon_data = pc.decrypt(phoneEncryptedData, phoneIv)
  46. tel = phon_data['purePhoneNumber']
  47. if customer.user:
  48. if customer.user.username != tel:
  49. raise CustomError(u'微信绑定的手机号与系统记录的不符!')
  50. else:
  51. return customer
  52. user = User.objects.filter(username=tel).first()
  53. if not user:
  54. user = User.objects.create_customer(tel, password='', **{'tel': tel, 'name': tel, })
  55. customer.user = user
  56. customer.save()
  57. return customer