No Description

encrypt_views.py 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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. },
  137. 'has_unexpired_activity': has_unexpired_activity,
  138. 'coupon_info': coupon_info,
  139. })
  140. @logit(res=True)
  141. def decrypt2(request):
  142. code_ticket = request.POST.get('code_ticket', '')
  143. code = request.POST.get('code', '')
  144. user_id = request.POST.get('user_id', '')
  145. try:
  146. user = UserInfo.objects.get(user_id=user_id)
  147. except UserInfo.DoesNotExist:
  148. return response(UserStatusCode.USER_NOT_FOUND)
  149. wxcfg = WECHAT.get('JSAPI', {})
  150. appid = wxcfg.get('appID')
  151. secret = wxcfg.get('appsecret')
  152. if code_ticket:
  153. code_info = tickettocode(code_ticket=code_ticket, openid=user.openid_miniapp, appid=appid, secret=secret, token=None, storage=RedisStorage(r))
  154. code = code_info.get('code', '')
  155. try:
  156. mieli = MchInfoEncryptLogInfo.objects.get(code=code)
  157. except MchInfoEncryptLogInfo.DoesNotExist:
  158. return response()
  159. plaintext = mieli.plaintext
  160. # brand_id#model_id#distributor_id#sn#time
  161. # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224
  162. brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#')
  163. try:
  164. brand = BrandInfo.objects.get(pk=brand_pk)
  165. except BrandInfo.DoesNotExist:
  166. brand = None
  167. try:
  168. model = ModelInfo.objects.get(pk=model_pk)
  169. except ModelInfo.DoesNotExist:
  170. model = None
  171. mdli, created_at = MchInfoDecryptLogInfo.objects.get_or_create(
  172. application_id=mieli.application_id,
  173. code=mieli.code,
  174. code_url=mieli.code_url,
  175. defaults={
  176. 'brand_pk': brand_pk,
  177. 'model_pk': model_pk,
  178. 'distributor_pk': distributor_pk,
  179. 'sn': sn,
  180. 'decrypt_count': 1,
  181. }
  182. )
  183. if not created_at:
  184. mdli.decrypt_count += 1
  185. mdli.save()
  186. act = ActivityInfo.objects.filter(status=True).order_by('-pk').first()
  187. has_unexpired_activity = True if act and act.has_unexpired_activity(model.model_uni_name) else False
  188. coupon_info = {
  189. 'coupon_expire_at': act.final_coupon_expire_at(created_at=None),
  190. 'coupon_value': act.coupon_value,
  191. } if has_unexpired_activity else {
  192. 'coupon_expire_at': '',
  193. 'coupon_value': 0,
  194. }
  195. return response(200, data={
  196. 'plaintext': plaintext,
  197. 'logo_url': brand.brand_logo_url if brand else '',
  198. 'model_imgs': model.images if model else [],
  199. 'goodsInfo': {
  200. 'BrandID': brand_pk,
  201. 'Brand': brand.brand_name if brand else '',
  202. 'ModelID': model_pk,
  203. 'Model': (model.model_full_name or model.model_name) if model else '',
  204. 'DistributorID': distributor_pk,
  205. 'SerialNo': sn,
  206. 'img': model.imgdata1,
  207. },
  208. 'has_unexpired_activity': has_unexpired_activity,
  209. 'coupon_info': coupon_info,
  210. })