views.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # coding=utf-8
  2. from django.db import transaction
  3. from django.conf import settings
  4. from rest_framework.views import APIView
  5. from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
  6. from rest_framework.serializers import ValidationError
  7. from utils import response_ok, response_error
  8. from utils.exceptions import CustomError
  9. from utils.permission import IsCustomerUser
  10. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  11. from apps.customer.serializers import WechatLoginSerializer, WechatBindSerializer
  12. from apps.customer.models import Customer
  13. class CustomerRefreshTokenView(RefreshJSONWebToken):
  14. def post(self, request, *args, **kwargs):
  15. try:
  16. ser = self.serializer_class(data=request.data)
  17. if ser.is_valid(raise_exception=True):
  18. return response_ok({'token': ser.validated_data['token']})
  19. except ValidationError as e:
  20. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  21. class CustomerVerifyTokenView(VerifyJSONWebToken):
  22. def post(self, request, *args, **kwargs):
  23. try:
  24. ser = self.serializer_class(data=request.data)
  25. if ser.is_valid(raise_exception=True):
  26. return response_ok({'token': ser.validated_data['token']})
  27. except ValidationError as e:
  28. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  29. class WxLoginView(APIView):
  30. serializer_class = WechatLoginSerializer
  31. def post(self, request, *args, **kwargs):
  32. ser = self.serializer_class(data=request.data)
  33. if ser.is_valid():
  34. return response_ok(ser.validated_data)
  35. else:
  36. return response_error('参数错误')
  37. class WxBindView(APIView):
  38. serializer_class = WechatBindSerializer
  39. def post(self, request, *args, **kwargs):
  40. ser = self.serializer_class(data=request.data)
  41. if ser.is_valid():
  42. return response_ok(ser.validated_data)
  43. else:
  44. return response_error('参数错误')
  45. class SetUserInfoView(APIView):
  46. permission_classes = [IsCustomerUser, ]
  47. def post(self, request, *args, **kwargs):
  48. appid = request.POST.get('appid')
  49. openid = request.POST.get('openid')
  50. encryptedData = request.POST.get('encryptedData')
  51. iv = request.POST.get('iv')
  52. customer = Customer.objects.filter(openid=openid, app__appid=appid).first()
  53. if not customer:
  54. raise CustomError(u'未找到相应的微信客户!')
  55. user = request.user
  56. if customer.user and customer.user.id != user.id:
  57. raise CustomError(u'该微信已同步其他客户!')
  58. if not customer.user:
  59. customer.user = user
  60. customer.save()
  61. pc = WXBizDataCrypt(appid, customer.session_key)
  62. result = pc.decrypt(encryptedData, iv)
  63. with transaction.atomic():
  64. if result['gender'] == 1:
  65. user.gender = settings.MALE
  66. elif result['gender'] == 2:
  67. user.gender = settings.FEMALE
  68. else:
  69. user.gender = settings.UNKNOW
  70. user.name = result['nickName']
  71. user.face = result['avatarUrl']
  72. user.save()
  73. return response_ok()