123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- # coding=utf-8
- import requests
- from django.db import transaction
- from django.db import models
- from django.utils import timezone
- from django.conf import settings
- from apps.tenant.models import Tenant
- from apps.WechatApplet.models import WechatApplet
- from apps.account.models import User
- from utils.wx.wechat import WeChat
- from utils.wx.WXBizDataCrypt import WXBizDataCrypt
- from utils.exceptions import CustomError
- from apps.tenant.employee.models import Employee
- class CustomerWechat(models.Model):
- # wechat_app = models.ForeignKey(WechatApplet, verbose_name=u'小程序', on_delete=models.PROTECT, editable=False)
- customer = models.ForeignKey(Employee, verbose_name=u'用户', on_delete=models.PROTECT, editable=False, null=True)
- openid = models.CharField(max_length=512, verbose_name=u"openid")
- session_key = models.CharField(max_length=512, verbose_name=u'session_key',null=True)
- class Meta:
- db_table = 'customer_wechat'
- verbose_name = u'微信客户'
- unique_together = [
- ('openid')
- ]
- default_permissions = ()
- @staticmethod
- def login(code, appid):
- # wechat_applet = WechatApplet.getByAppid(appid)
- secret = settings.WEAPP['secret']
- res = WeChat.code2Session(appid, secret, code)
- instance = CustomerWechat.objects.filter(openid=res['openid']).first()
- if not instance:
- instance = CustomerWechat.objects.create(
- # wechat_app=wechat_applet,
- openid=res['openid'],
- session_key=res['session_key']
- )
- else:
- instance.session_key = res['session_key']
- instance.save()
- return instance
- @staticmethod
- def bindWechat(appid, openid, phoneEncryptedData, phoneIv):
- customer_wechat = CustomerWechat.objects.filter(openid=openid).first()
- if not customer_wechat:
- raise CustomError(u'未找到相应的微信客户!')
- pc = WXBizDataCrypt(appid, customer_wechat.session_key)
- phon_data = pc.decrypt(phoneEncryptedData, phoneIv)
- tel = phon_data['purePhoneNumber']
- if customer_wechat.customer:
- if customer_wechat.customer.user.username != tel:
- raise CustomError(u'微信绑定的手机号与系统记录的不符!')
- else:
- return customer_wechat.customer
- user = User.objects.filter(username=tel).first()
- if not user:
- user = User.objects.create_customer(tel, password=tel[5:])
- try:
- with transaction.atomic():
- customer = Employee.getOrRegister(user=user)
- except:
- raise CustomError(u'用户注册失败!')
- customer_wechat.customer = customer
- customer_wechat.save()
- return customer
- @staticmethod
- def sendFinishMsg(user, name, address, fault_des, no):
- """
- :param user: 接收人
- :param name: 接收人姓名
- :param address: 地址
- :param fault_des: 描述
- :param no: 单号
- """
- wechat_customer = CustomerWechat.objects.filter(customer__user=user).first()
- if wechat_customer:
- applet= WechatApplet.objects.filter(authorizer_appid=settings.WEAPP['appid']).first()
- applet.sendFinishMsg(wechat_customer.openid, name, address, fault_des, no)
- @staticmethod
- def sendWaitCheckMsg(user, name, address, fault_des, no):
- """
- :param user: 接收人
- :param name: 下单人姓名
- :param address: 地址
- :param fault_des: 描述
- :param no: 单号
- """
- wechat_customer = CustomerWechat.objects.filter(customer__user=user).first()
- if wechat_customer:
- applet= WechatApplet.objects.filter(authorizer_appid=settings.WEAPP['appid']).first()
- applet.sendWaitCheckMsg(wechat_customer.openid, name, address, fault_des, no)
- @staticmethod
- def sendDispatchMsg(user, name, address, fault_des, time, no):
- """
- :param user: 接收人
- :param name: 下单人姓名
- :param address: 地址
- :param fault_des: 描述
- :param no: 单号
- :param time: 报修时间
- """
- wechat_customer = CustomerWechat.objects.filter(customer__user=user).first()
- if wechat_customer:
- applet= WechatApplet.objects.filter(authorizer_appid=settings.WEAPP['appid']).first()
- applet.sendDispatchMsg(wechat_customer.openid, name, address, fault_des, time, no)
|