@@ -110,6 +110,12 @@ def decrypt(request): |
||
110 | 110 |
|
111 | 111 |
act = ActivityInfo.objects.filter(brand_id=brand.brand_id, status=True).order_by('-pk').first() |
112 | 112 |
|
113 |
+ # 红包 |
|
114 |
+ try: |
|
115 |
+ elog = MchInfoEncryptLogInfo.objects.get(sn=sn) |
|
116 |
+ except MchInfoEncryptLogInfo.DoesNotExist: |
|
117 |
+ elog = None |
|
118 |
+ |
|
113 | 119 |
return response(200, data={ |
114 | 120 |
'plaintext': plaintext, |
115 | 121 |
'logo_url': brand.brand_logo_url if brand else '', |
@@ -123,4 +129,5 @@ def decrypt(request): |
||
123 | 129 |
'SerialNo': sn, |
124 | 130 |
}, |
125 | 131 |
'has_unexpired_activity': True if act and act.has_unexpired_activity else False, |
132 |
+ 'redpack_info': elog.redpack_info if elog else {}, |
|
126 | 133 |
}) |
@@ -12,13 +12,15 @@ from pywe_storage import RedisStorage |
||
12 | 12 |
from TimeConvert import TimeConvert as tc |
13 | 13 |
|
14 | 14 |
from account.models import UserInfo |
15 |
+from logs.models import MchInfoEncryptLogInfo |
|
15 | 16 |
from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, |
16 | 17 |
LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo) |
18 |
+from miniapp.redpack_views import send_jsapi_hb |
|
17 | 19 |
from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo |
18 | 20 |
from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode, |
19 | 21 |
ProductModelStatusCode, UserStatusCode) |
20 | 22 |
from utils.redis.connect import r |
21 |
-from utils.redis.rkeys import MINI_PROGRAM_GIS_LIST |
|
23 |
+from utils.redis.rkeys import MINI_PROGRAM_GIS_LIST, REDPACK_WAITING_SEND_LIST |
|
22 | 24 |
|
23 | 25 |
|
24 | 26 |
WECHAT = settings.WECHAT |
@@ -374,6 +376,25 @@ def consumer_info_api(request): |
||
374 | 376 |
'ymd': ymd, |
375 | 377 |
}) |
376 | 378 |
|
379 |
+ try: |
|
380 |
+ elog = MchInfoEncryptLogInfo.objects.select_for_update().get(sn=serialNo) |
|
381 |
+ except MchInfoEncryptLogInfo.DoesNotExist: |
|
382 |
+ elog = None |
|
383 |
+ |
|
384 |
+ if elog and not dupload: |
|
385 |
+ amount = 100 |
|
386 |
+ if user.openid: |
|
387 |
+ send_jsapi_hb(user.openid, amount, transfer=False) |
|
388 |
+ elog.has_send_redpack = True |
|
389 |
+ elog.user_id = user.user_id |
|
390 |
+ elog.nickname = user.nickname |
|
391 |
+ elog.save() |
|
392 |
+ else: |
|
393 |
+ r.rpushjson(REDPACK_WAITING_SEND_LIST, { |
|
394 |
+ 'user_id': user.user_id, |
|
395 |
+ 'amount': amount, |
|
396 |
+ }) |
|
397 |
+ |
|
377 | 398 |
return response(200, 'Submit Consumer Info Success', u'提交消费者信息成功') |
378 | 399 |
|
379 | 400 |
|
@@ -12,7 +12,8 @@ from group import (groupuser_views, lensman_views, tourguidegroup_views, tourgui |
||
12 | 12 |
tourguidegroupuser_views) |
13 | 13 |
from group import views as group_views |
14 | 14 |
from message import views as message_views |
15 |
-from miniapp import views as mini_views, redpack_views |
|
15 |
+from miniapp import redpack_views |
|
16 |
+from miniapp import views as mini_views |
|
16 | 17 |
from operation import views as op_views |
17 | 18 |
from page import oauth_views, sale_views, screen_views |
18 | 19 |
from pay import views as pay_views |
@@ -7,8 +7,8 @@ from logs.models import MchInfoDecryptLogInfo, MchInfoEncryptLogInfo, MchLogInfo |
||
7 | 7 |
|
8 | 8 |
|
9 | 9 |
class MchInfoEncryptLogInfoAdmin(ReadOnlyModelAdmin, admin.ModelAdmin): |
10 |
- list_display = ('plaintext', 'alg', 'ciphertext', 'brand_pk', 'model_pk', 'distributor_pk', 'sn', 'operator_id', 'status', 'created_at', 'updated_at') |
|
11 |
- list_filter = ('alg', 'brand_pk', 'model_pk', 'distributor_pk', 'operator_id', 'status') |
|
10 |
+ list_display = ('plaintext', 'alg', 'ciphertext', 'brand_pk', 'model_pk', 'distributor_pk', 'sn', 'operator_id', 'has_send_redpack', 'user_id', 'nickname', 'status', 'created_at', 'updated_at') |
|
11 |
+ list_filter = ('alg', 'brand_pk', 'model_pk', 'distributor_pk', 'operator_id', 'has_send_redpack', 'status') |
|
12 | 12 |
|
13 | 13 |
|
14 | 14 |
class MchInfoDecryptLogInfoAdmin(ReadOnlyModelAdmin, admin.ModelAdmin): |
@@ -2,7 +2,7 @@ |
||
2 | 2 |
|
3 | 3 |
from django.db import models |
4 | 4 |
from django.utils.translation import ugettext_lazy as _ |
5 |
-from django_models_ext import BaseModelMixin, upload_file_url, upload_path |
|
5 |
+from django_models_ext import BaseModelMixin, upload_path |
|
6 | 6 |
from shortuuidfield import ShortUUIDField |
7 | 7 |
|
8 | 8 |
|
@@ -20,6 +20,10 @@ class MchInfoEncryptLogInfo(BaseModelMixin): |
||
20 | 20 |
|
21 | 21 |
operator_id = models.CharField(_(u'operator_id'), max_length=32, blank=True, null=True, help_text=u'操作员唯一标识', db_index=True) |
22 | 22 |
|
23 |
+ has_send_redpack = models.BooleanField(_(u'has_send_redpack'), default=True, help_text=u'是否已发放红包', db_index=True) |
|
24 |
+ user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识(红包)', db_index=True) |
|
25 |
+ nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户昵称') |
|
26 |
+ |
|
23 | 27 |
class Meta: |
24 | 28 |
verbose_name = _(u'mchinfoencryptloginfo') |
25 | 29 |
verbose_name_plural = _(u'mchinfoencryptloginfo') |
@@ -27,6 +31,14 @@ class MchInfoEncryptLogInfo(BaseModelMixin): |
||
27 | 31 |
def __unicode__(self): |
28 | 32 |
return unicode(self.pk) |
29 | 33 |
|
34 |
+ @property |
|
35 |
+ def redpack_info(self): |
|
36 |
+ return { |
|
37 |
+ 'has_send_redpack': self.has_send_redpack, |
|
38 |
+ 'user_id': self.user_id, |
|
39 |
+ 'nickname': self.nickname, |
|
40 |
+ } |
|
41 |
+ |
|
30 | 42 |
|
31 | 43 |
class MchInfoDecryptLogInfo(BaseModelMixin): |
32 | 44 |
ciphertext = models.CharField(_(u'ciphertext'), max_length=64, blank=True, null=True, help_text=u'待解密字符串', db_index=True) |
@@ -10,19 +10,7 @@ from account.models import UserInfo |
||
10 | 10 |
WECHAT = settings.WECHAT |
11 | 11 |
|
12 | 12 |
|
13 |
-def jsapi_hb_api(request): |
|
14 |
- brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) |
|
15 |
- user_id = request.POST.get('user_id', '') |
|
16 |
- transfer = request.POST.get('transfer', '') |
|
17 |
- |
|
18 |
- try: |
|
19 |
- user = UserInfo.objects.get(user_id=user_id) |
|
20 |
- except UserInfo.DoesNotExist: |
|
21 |
- return response() |
|
22 |
- |
|
23 |
- openid = user.openid |
|
24 |
- amount = 100 |
|
25 |
- |
|
13 |
+def send_jsapi_hb(openid, amount, transfer=True): |
|
26 | 14 |
trade_type = 'JSAPI' |
27 | 15 |
# 根据 trade_type 获取 wechat 配置 |
28 | 16 |
wxcfg = WECHAT.get(trade_type, {}) |
@@ -42,6 +30,23 @@ def jsapi_hb_api(request): |
||
42 | 30 |
remark=wxrpk.get('REMARK'), |
43 | 31 |
miniprogram=False, |
44 | 32 |
) |
33 |
+ return ret_data |
|
34 |
+ |
|
35 |
+ |
|
36 |
+def jsapi_hb_api(request): |
|
37 |
+ brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) |
|
38 |
+ user_id = request.POST.get('user_id', '') |
|
39 |
+ transfer = request.POST.get('transfer', '') |
|
40 |
+ |
|
41 |
+ try: |
|
42 |
+ user = UserInfo.objects.get(user_id=user_id) |
|
43 |
+ except UserInfo.DoesNotExist: |
|
44 |
+ return response() |
|
45 |
+ |
|
46 |
+ openid = user.openid |
|
47 |
+ amount = 100 |
|
48 |
+ |
|
49 |
+ ret_data = send_jsapi_hb(openid, amount, transfer=True) |
|
45 | 50 |
|
46 | 51 |
return response(200, data=ret_data) |
47 | 52 |
|
@@ -71,3 +71,5 @@ BOX_PROGRAM_VERSION_INFO = 'box:program:version:info' # STRING,BOX 程序版 |
||
71 | 71 |
MINI_PROGRAM_GIS_LIST = 'tamron:miniprogram:gis:list' |
72 | 72 |
|
73 | 73 |
SCREEN_ADMIN_LOGIN = 'tamron:screen:admin:login:%s:%s' # brand_id, token |
74 |
+ |
|
75 |
+REDPACK_WAITING_SEND_LIST = 'tamron:redpack:waiting:send' # |
@@ -26,4 +26,4 @@ def test_pay(openid, amount=100, trade_type='JSAPI', pay_type='PACKET'): |
||
26 | 26 |
remark=wxrpk.get('REMARK'), |
27 | 27 |
) |
28 | 28 |
|
29 |
- print ret_data |
|
29 |
+ print ret_data |