暂无描述

encrypt_views.py 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import random
  4. from django.conf import settings
  5. from django.db import transaction
  6. from django_logit import logit
  7. from django_response import response
  8. from pywe_marketcode import tickettocode
  9. from pywe_storage import RedisStorage
  10. from account.models import UserInfo
  11. from logs.models import MchInfoDecryptLogInfo, MchInfoEncryptLogInfo
  12. from marketcode.models import MarketCodeInfo
  13. from mch.models import ActivityInfo, BrandInfo, ModelInfo
  14. from utils.algorithm.b64 import b64_decrypt, b64_encrypt
  15. from utils.algorithm.caesar import caesar_decrypt, caesar_encrypt
  16. from utils.algorithm.rsalg import rsa_decrypt, rsa_encrypt
  17. from utils.error.errno_utils import MarketCodeStatusCode, UserStatusCode
  18. from utils.redis.connect import r
  19. WECHAT = settings.WECHAT
  20. # CIPHER_ALGORITHM = ('CAESAR', 'B64', 'RSA')
  21. CIPHER_ALGORITHM = ('CAESAR', )
  22. CIPHER_PREFIX = {
  23. 'CAESAR': '0',
  24. 'B64': '1',
  25. 'RSA': '2',
  26. }
  27. @logit(res=True)
  28. def encrypt(request):
  29. plaintext = request.POST.get('plaintext', '')
  30. optor_id = request.POST.get('optor_id', '')
  31. marketcode = request.POST.get('marketcode', '')
  32. # brand_id#model_id#distributor_id#sn#time
  33. # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224
  34. brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#')
  35. mieli, created_at = MchInfoEncryptLogInfo.objects.get_or_create(plaintext=plaintext)
  36. if marketcode:
  37. if created_at or not mieli.code:
  38. with transaction.atomic():
  39. marketcode = MarketCodeInfo.objects.select_for_update().filter(has_used=False).first()
  40. if not marketcode:
  41. return response(MarketCodeStatusCode.MARKET_CODE_NOT_FOUND)
  42. marketcode.has_used = True
  43. marketcode.save()
  44. mieli.application_id = marketcode.application_id
  45. mieli.code = marketcode.code
  46. mieli.code_url = marketcode.code_url
  47. mieli.brand_pk = brand_pk
  48. mieli.model_pk = model_pk
  49. mieli.distributor_pk = distributor_pk
  50. mieli.sn = sn
  51. mieli.operator_id = optor_id
  52. mieli.save()
  53. return response(200, data={
  54. 'ciphertext': mieli.code_url,
  55. })
  56. if created_at:
  57. alg = random.choice(CIPHER_ALGORITHM)
  58. if alg == 'CAESAR':
  59. ciphertext = caesar_encrypt(plaintext)
  60. elif alg == 'B64':
  61. ciphertext = b64_encrypt(plaintext)
  62. elif alg == 'RSA':
  63. ciphertext = rsa_encrypt(plaintext)
  64. else:
  65. ciphertext = plaintext
  66. mieli.alg = alg
  67. mieli.ciphertext = ciphertext
  68. mieli.brand_pk = brand_pk
  69. mieli.model_pk = model_pk
  70. mieli.distributor_pk = distributor_pk
  71. mieli.sn = sn
  72. mieli.operator_id = optor_id
  73. mieli.save()
  74. return response(200, data={
  75. 'ciphertext': u'{prefix}+{cipherlen}+{ciphertext}'.format(
  76. prefix=CIPHER_PREFIX.get(mieli.alg, ''),
  77. cipherlen=len(mieli.ciphertext),
  78. ciphertext=mieli.ciphertext,
  79. ),
  80. })
  81. @logit(res=True)
  82. def decrypt(request):
  83. ciphertext = request.POST.get('ciphertext', '')
  84. prefix, cipherlen, ciphertext = ciphertext.split('+', 2)
  85. ciphertext = ciphertext[:int(cipherlen)]
  86. if prefix == CIPHER_PREFIX['CAESAR']:
  87. plaintext = caesar_decrypt(ciphertext)
  88. elif prefix == CIPHER_PREFIX['B64']:
  89. plaintext = b64_decrypt(ciphertext)
  90. elif prefix == CIPHER_PREFIX['RSA']:
  91. plaintext = rsa_decrypt(ciphertext)
  92. else:
  93. plaintext = ciphertext
  94. # brand_id#model_id#distributor_id#sn#time
  95. # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224
  96. brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#')
  97. try:
  98. brand = BrandInfo.objects.get(pk=brand_pk)
  99. except BrandInfo.DoesNotExist:
  100. brand = None
  101. try:
  102. model = ModelInfo.objects.get(pk=model_pk)
  103. except ModelInfo.DoesNotExist:
  104. model = None
  105. mdli, created_at = MchInfoDecryptLogInfo.objects.get_or_create(ciphertext=ciphertext, defaults={
  106. 'brand_pk': brand_pk,
  107. 'model_pk': model_pk,
  108. 'distributor_pk': distributor_pk,
  109. 'sn': sn,
  110. 'decrypt_count': 1,
  111. })
  112. if not created_at:
  113. mdli.decrypt_count += 1
  114. mdli.save()
  115. act = ActivityInfo.objects.filter(status=True).order_by('-pk').first()
  116. has_unexpired_activity = True if act and act.has_unexpired_activity(model.model_uni_name) else False
  117. coupon_info = {
  118. 'coupon_expire_at': act.final_coupon_expire_at(created_at=None),
  119. 'coupon_value': act.coupon_value,
  120. } if has_unexpired_activity else {
  121. 'coupon_expire_at': '',
  122. 'coupon_value': 0,
  123. }
  124. return response(200, data={
  125. 'plaintext': plaintext,
  126. 'logo_url': brand.brand_logo_url if brand else '',
  127. 'model_imgs': model.images if model else [],
  128. 'goodsInfo': {
  129. 'BrandID': brand_pk,
  130. 'Brand': brand.brand_name if brand else '',
  131. 'ModelID': model_pk,
  132. 'Model': (model.model_full_name or model.model_name) if model else '',
  133. 'DistributorID': distributor_pk,
  134. 'SerialNo': sn,
  135. 'img': model.imgdata1,
  136. 'img2': model.imgdata
  137. },
  138. 'has_unexpired_activity': has_unexpired_activity,
  139. 'coupon_info': coupon_info,
  140. })
  141. @logit(res=True)
  142. def decrypt2(request):
  143. code_ticket = request.POST.get('code_ticket', '')
  144. code = request.POST.get('code', '')
  145. user_id = request.POST.get('user_id', '')
  146. try:
  147. user = UserInfo.objects.get(user_id=user_id)
  148. except UserInfo.DoesNotExist:
  149. user = NULL
  150. wxcfg = WECHAT.get('JSAPI', {})
  151. appid = wxcfg.get('appID')
  152. secret = wxcfg.get('appsecret')
  153. if code_ticket && user:
  154. code_info = tickettocode(code_ticket=code_ticket, openid=user.openid_miniapp, appid=appid, secret=secret, token=None, storage=RedisStorage(r))
  155. code = code_info.get('code', '')
  156. try:
  157. mieli = MchInfoEncryptLogInfo.objects.get(code=code)
  158. except MchInfoEncryptLogInfo.DoesNotExist:
  159. return response()
  160. else:
  161. try:
  162. mieli = MchInfoEncryptLogInfo.objects.get(code_url=code)
  163. except MchInfoEncryptLogInfo.DoesNotExist:
  164. return response()
  165. plaintext = mieli.plaintext
  166. # brand_id#model_id#distributor_id#sn#time
  167. # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224
  168. brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#')
  169. try:
  170. brand = BrandInfo.objects.get(pk=brand_pk)
  171. except BrandInfo.DoesNotExist:
  172. brand = None
  173. try:
  174. model = ModelInfo.objects.get(pk=model_pk)
  175. except ModelInfo.DoesNotExist:
  176. model = None
  177. mdli, created_at = MchInfoDecryptLogInfo.objects.get_or_create(
  178. application_id=mieli.application_id,
  179. code=mieli.code,
  180. code_url=mieli.code_url,
  181. defaults={
  182. 'brand_pk': brand_pk,
  183. 'model_pk': model_pk,
  184. 'distributor_pk': distributor_pk,
  185. 'sn': sn,
  186. 'decrypt_count': 1,
  187. }
  188. )
  189. if not created_at:
  190. mdli.decrypt_count += 1
  191. mdli.save()
  192. act = ActivityInfo.objects.filter(status=True).order_by('-pk').first()
  193. has_unexpired_activity = True if act and act.has_unexpired_activity(model.model_uni_name) else False
  194. coupon_info = {
  195. 'coupon_expire_at': act.final_coupon_expire_at(created_at=None),
  196. 'coupon_value': act.coupon_value,
  197. } if has_unexpired_activity else {
  198. 'coupon_expire_at': '',
  199. 'coupon_value': 0,
  200. }
  201. return response(200, data={
  202. 'plaintext': plaintext,
  203. 'logo_url': brand.brand_logo_url if brand else '',
  204. 'model_imgs': model.images if model else [],
  205. 'goodsInfo': {
  206. 'BrandID': brand_pk,
  207. 'Brand': brand.brand_name if brand else '',
  208. 'ModelID': model_pk,
  209. 'Model': (model.model_full_name or model.model_name) if model else '',
  210. 'DistributorID': distributor_pk,
  211. 'SerialNo': sn,
  212. 'img': model.imgdata1,
  213. 'img2': model.imgdata
  214. },
  215. 'has_unexpired_activity': has_unexpired_activity,
  216. 'coupon_info': coupon_info,
  217. })