views.py 3.6 KB

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