Add multi openid for UserInfo & Change create order support miniapp

Brightcells 7 anni fa
parent
commit
d38cc6ceb2
11 ha cambiato i file con 185 aggiunte e 293 eliminazioni
  1. 2 7
      account/admin.py
  2. 49 0
      account/migrations/0023_auto_20170709_1923.py
  3. 15 7
      account/models.py
  4. 12 18
      account/tourguide_views.py
  5. 24 177
      account/views.py
  6. 0 6
      api/urls.py
  7. 14 41
      group/lensman_views.py
  8. 30 31
      miniapp/views.py
  9. 13 6
      pay/views.py
  10. 13 0
      utils/openid_utils.py
  11. 13 0
      utils/wechat_utils.py

+ 2 - 7
account/admin.py

@@ -2,7 +2,6 @@
2 2
 
3 3
 from curtail_uuid import CurtailUUID
4 4
 from django.contrib import admin
5
-from django.contrib.auth.hashers import make_password
6 5
 from django.db import transaction
7 6
 
8 7
 from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLoginLogInfo, TourGuideInfo,
@@ -10,7 +9,8 @@ from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLogin
10 9
 
11 10
 
12 11
 class LensmanInfoAdmin(admin.ModelAdmin):
13
-    readonly_fields = ('lensman_id', 'encryption', )
12
+    exclude = ('username', 'password', 'encryption')
13
+    readonly_fields = ('lensman_id', )
14 14
     list_display = ('lensman_id', 'unionid', 'username', 'name', 'sex', 'phone', 'location', 'proportion', 'nomark', 'origin', 'balance', 'user_status', 'status', 'created_at', 'updated_at')
15 15
     search_fields = ('name', 'phone', 'location')
16 16
     list_filter = ('sex', 'user_status', 'status')
@@ -41,11 +41,6 @@ class LensmanInfoAdmin(admin.ModelAdmin):
41 41
                 setattr(user, key, value)
42 42
             user.save()
43 43
 
44
-        if obj.password:
45
-            obj.encryption = make_password(obj.password, None, 'pbkdf2_sha256')
46
-            obj.password = None
47
-        obj.save()
48
-
49 44
 
50 45
 class LensmanLoginLogInfoAdmin(admin.ModelAdmin):
51 46
     list_display = ('lensman_id', 'login_ip', 'login_result', 'status', 'created_at', 'updated_at')

+ 49 - 0
account/migrations/0023_auto_20170709_1923.py

@@ -0,0 +1,49 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models, migrations
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('account', '0022_auto_20170212_2153'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AddField(
15
+            model_name='userinfo',
16
+            name='openid_lensman',
17
+            field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u6444\u5f71\u5e08\u7aef', unique=True, verbose_name='openid_lensman', db_index=True),
18
+        ),
19
+        migrations.AddField(
20
+            model_name='userinfo',
21
+            name='openid_miniapp',
22
+            field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u5c0f\u7a0b\u5e8f', unique=True, verbose_name='openid_miniapp', db_index=True),
23
+        ),
24
+        migrations.AddField(
25
+            model_name='userinfo',
26
+            name='openid_oauth',
27
+            field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u7528\u6237\u6388\u6743', unique=True, verbose_name='openid_oauth', db_index=True),
28
+        ),
29
+        migrations.AddField(
30
+            model_name='userinfo',
31
+            name='openid_tourguide',
32
+            field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u5bfc\u6e38\u7aef', unique=True, verbose_name='openid_tourguide', db_index=True),
33
+        ),
34
+        migrations.AlterField(
35
+            model_name='userinfo',
36
+            name='openid',
37
+            field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u7528\u6237\u7aef', unique=True, verbose_name='openid', db_index=True),
38
+        ),
39
+        migrations.AlterField(
40
+            model_name='userinfo',
41
+            name='unionid',
42
+            field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Unionid', unique=True, verbose_name='unionid', db_index=True),
43
+        ),
44
+        migrations.AlterField(
45
+            model_name='userinfo',
46
+            name='user_from',
47
+            field=models.IntegerField(default=0, help_text='\u7528\u6237\u6765\u6e90', verbose_name='user_from', choices=[(0, 'APP \u521b\u5efa\u7528\u6237'), (1, '\u5fae\u4fe1\u6388\u6743\u7528\u6237'), (8, '\u7528\u6237\u7aef\u7528\u6237'), (9, '\u6e38\u5ba2\u7528\u6237'), (10, '\u6444\u5f71\u5e08\u7aef\u7528\u6237'), (11, '\u5bfc\u6e38\u7aef\u7528\u6237'), (12, '\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (13, '\u7f51\u9875\u6388\u6743\u7528\u6237')]),
48
+        ),
49
+    ]

+ 15 - 7
account/models.py

@@ -229,18 +229,22 @@ class WechatInfo(CreateUpdateMixin):
229 229
 class UserInfo(CreateUpdateMixin):
230 230
     APP_USER = 0
231 231
     WX_USER = 1
232
+    USER_USER = 8
232 233
     GUEST_USER = 9
233 234
     LENSMAN_USER = 10
234 235
     TOURGUIDE_USER = 11
235
-    WEAPP_USER = 12
236
+    MINIAPP_USER = 12
237
+    OAUTH_USER = 13
236 238
 
237 239
     USER_FROM = (
238 240
         (APP_USER, u'APP 创建用户'),
239 241
         (WX_USER, u'微信授权用户'),
242
+        (USER_USER, u'用户端用户'),
240 243
         (GUEST_USER, u'游客用户'),
241
-        (LENSMAN_USER, u'摄影师用户'),
242
-        (TOURGUIDE_USER, u'导游用户'),
243
-        (WEAPP_USER, u'小程序用户'),
244
+        (LENSMAN_USER, u'摄影师端用户'),
245
+        (TOURGUIDE_USER, u'导游端用户'),
246
+        (MINIAPP_USER, u'小程序端用户'),
247
+        (OAUTH_USER, u'网页授权用户'),
244 248
     )
245 249
 
246 250
     UNVERIFIED = 0
@@ -273,8 +277,12 @@ class UserInfo(CreateUpdateMixin):
273 277
     username = models.CharField(_(u'username'), max_length=255, blank=True, null=True, help_text=u'用户用户名', db_index=True, unique=True)
274 278
     password = models.CharField(_(u'password'), max_length=255, blank=True, null=True, help_text=u'用户密码')
275 279
     # 微信授权用户
276
-    openid = models.CharField(_(u'openid'), max_length=255, blank=True, null=True, help_text=u'微信 Open ID', db_index=True, unique=True)
277
-    unionid = models.CharField(_(u'unionid'), max_length=255, blank=True, null=True, help_text=u'微信 Union ID', db_index=True, unique=True)
280
+    unionid = models.CharField(_(u'unionid'), max_length=255, blank=True, null=True, help_text=u'微信 Unionid', db_index=True, unique=True)
281
+    openid = models.CharField(_(u'openid'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱用户端', db_index=True, unique=True)
282
+    openid_lensman = models.CharField(_(u'openid_lensman'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱摄影师端', db_index=True, unique=True)
283
+    openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱导游端', db_index=True, unique=True)
284
+    openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱小程序', db_index=True, unique=True)
285
+    openid_oauth = models.CharField(_(u'openid_oauth'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱用户授权', db_index=True, unique=True)
278 286
     # 用户基本信息
279 287
     name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名')
280 288
     sex = models.IntegerField(_(u'sex'), choices=SEX_TYPE, default=MALE, help_text=u'用户性别')
@@ -324,7 +332,7 @@ class UserInfo(CreateUpdateMixin):
324 332
             return self.name
325 333
         elif self.user_from == self.TOURGUIDE_USER:
326 334
             return self.name
327
-        elif self.user_from == self.WEAPP_USER:
335
+        elif self.user_from == self.MINIAPP_USER:
328 336
             return self.nickname
329 337
         return self.nickname
330 338
 

+ 12 - 18
account/tourguide_views.py

@@ -3,6 +3,7 @@
3 3
 from __future__ import division
4 4
 
5 5
 from django.conf import settings
6
+from django.db import transaction
6 7
 from logit import logit
7 8
 
8 9
 from account.models import TourGuideInfo, UserInfo
@@ -47,32 +48,25 @@ def tourguide_submit_api(request):
47 48
 
48 49
 
49 50
 @logit
51
+@transaction.atomic
50 52
 def tourguide_wx_authorize_api(request):
51
-    unionid = request.POST.get('unionid', '')
52
-    openid = request.POST.get('openid', '')
53
-
54
-    sex = request.POST.get('sex', 0)
55
-    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
56
-    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
57
-    country = request.POST.get('country', '')
58
-    province = request.POST.get('province', '')
59
-    city = request.POST.get('city', '')
60
-
61 53
     try:
62
-        user = UserInfo.objects.get(unionid=unionid, istourguide=True, status=True)
54
+        user = UserInfo.objects.select_for_update().get(unionid=request.POST.get('unionid', ''), istourguide=True, status=True)
63 55
     except UserInfo.DoesNotExist:
64 56
         return response(TourGuideStatusCode.TOURGUIDE_NOT_FOUND)
65 57
 
58
+    # 用户是否激活
66 59
     if user.user_status != UserInfo.ACTIVATED:
67 60
         return response(TourGuideStatusCode.TOURGUIDE_NOT_ACTIVATED)
68 61
 
69
-    user.openid = openid
70
-    user.sex = sex
71
-    user.nickname = nickname
72
-    user.avatar = avatar
73
-    user.country = country
74
-    user.province = province
75
-    user.city = city
62
+    # Set User Key's Value
63
+    user.openid_tourguide = request.POST.get('openid', '')
64
+    user.sex = request.POST.get('sex', 0)
65
+    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
66
+    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
67
+    user.country = request.POST.get('country', '')
68
+    user.province = request.POST.get('province', '')
69
+    user.city = request.POST.get('city', '')
76 70
     user.save()
77 71
 
78 72
     set_profile_info(user)

+ 24 - 177
account/views.py

@@ -1,7 +1,6 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3 3
 from curtail_uuid import CurtailUUID
4
-from django.contrib.auth.hashers import check_password, make_password
5 4
 from django.contrib.auth.models import Group, User
6 5
 from django.db import transaction
7 6
 from ipaddr import client_ip
@@ -9,195 +8,43 @@ from logit import logit
9 8
 from rest_framework import viewsets
10 9
 from TimeConvert import TimeConvert as tc
11 10
 
12
-from account.models import LensmanInfo, UserInfo, UserLoginLogInfo
11
+from account.models import LensmanInfo, UserInfo
13 12
 from account.serializers import GroupSerializer, LensmanInfoSerializer, UserInfoSerializer, UserSerializer
14 13
 from operation.models import GuestEntranceControlInfo
15
-from utils.error.errno_utils import LensmanStatusCode, UserStatusCode
14
+from utils.error.errno_utils import UserStatusCode
16 15
 from utils.error.response_utils import response
17 16
 from utils.redis.rguest import get_guest_entrance_control
18 17
 from utils.redis.rprofile import set_profile_info
19 18
 from utils.version_utils import is_version_match
20 19
 
21 20
 
22
-# curl -X POST -F username=xxxxxxx -F password=xxxxxxx http://api.pai.ai/login
23
-@logit
24
-def lensman_login_api(request):
25
-    username = request.POST.get('username', '')
26
-    password = request.POST.get('password', '')
27
-
28
-    try:
29
-        lensman = LensmanInfo.objects.get(username=username, status=True)
30
-    except LensmanInfo.DoesNotExist:
31
-        return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
32
-
33
-    if not check_password(password, lensman.encryption):
34
-        return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR)
35
-
36
-    return response(200, 'Login Success', u'登录成功', {
37
-        'user_id': lensman.lensman_id
38
-    })
39
-
40
-
41
-@logit
42
-def user_is_registered_api(request):
43
-    username = request.POST.get('username', '')
44
-
45
-    return response(200, data={
46
-        'registered': UserInfo.objects.filter(username=username).exists(),
47
-    })
48
-
49
-
50
-@logit
51
-@transaction.atomic
52
-def user_signup_api(request):
53
-    user_id = request.POST.get('user_id', '')
54
-    username = request.POST.get('username', '')
55
-    password = request.POST.get('password', '')
56
-
57
-    if UserInfo.objects.filter(username=username).exists():
58
-        return response(UserStatusCode.USERNAME_HAS_REGISTERED)
59
-
60
-    # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户
61
-    signup_ip, signup_at = client_ip(request), tc.utc_datetime()
62
-
63
-    try:
64
-        user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)
65
-    except UserInfo.DoesNotExist:
66
-        user = None
67
-
68
-    if user and user.user_status == UserInfo.ASSIGN:
69
-        user.user_from = UserInfo.APP_USER,
70
-        user.username = username
71
-        user.password = make_password(password, None, 'pbkdf2_sha256')
72
-        user.user_status = UserInfo.ACTIVATED
73
-        user.signup_ip = signup_ip
74
-        user.signup_at = signup_at
75
-        user.save()
76
-    else:
77
-        user = UserInfo.objects.create(
78
-            user_id=CurtailUUID.uuid(UserInfo, 'user_id'),
79
-            user_from=UserInfo.APP_USER,
80
-            username=username,
81
-            password=make_password(password, None, 'pbkdf2_sha256'),
82
-            user_status=UserInfo.ACTIVATED,
83
-            signup_ip=signup_ip,
84
-            signup_at=signup_at,
85
-        )
86
-
87
-    return response(200, 'Signup Success', u'注册成功', user.data)
88
-
89
-
90
-@logit
91
-@transaction.atomic
92
-def user_login_api(request):
93
-    username = request.POST.get('username', '')
94
-    password = request.POST.get('password', '')
95
-
96
-    try:
97
-        user = UserInfo.objects.select_for_update().get(username=username, status=True)
98
-    except UserInfo.DoesNotExist:
99
-        return response(UserStatusCode.USER_NOT_FOUND)
100
-
101
-    login_ip, login_at = client_ip(request), tc.utc_datetime()
102
-
103
-    if not check_password(password, user.password):
104
-        UserLoginLogInfo.objects.create(
105
-            user_id=user.user_id,
106
-            login_ip=login_ip,
107
-            login_result=UserLoginLogInfo.PWD_ERROR
108
-        )
109
-        return response(UserStatusCode.USER_PASSWORD_ERROR)
110
-
111
-    UserLoginLogInfo.objects.create(
112
-        user_id=user.user_id,
113
-        login_ip=login_ip,
114
-        login_result=UserLoginLogInfo.SUCCESS
115
-    )
116
-
117
-    user.login_ip = login_ip
118
-    user.login_at = login_at
119
-    user.save()
120
-
121
-    return response(200, 'Login Success', u'登录成功', user.data)
122
-
123
-
124 21
 @logit
125 22
 @transaction.atomic
126 23
 def user_wx_authorize_api(request):
127
-    user_id = request.POST.get('user_id', '')
128
-
129
-    unionid = request.POST.get('unionid', '')
130
-    openid = request.POST.get('wx_uid', '')
131
-
132
-    sex = request.POST.get('sex', 0)
133
-    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
134
-    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
135
-    country = request.POST.get('country', '')
136
-    province = request.POST.get('province', '')
137
-    city = request.POST.get('city', '')
138
-
139
-    try:
140
-        user = UserInfo.objects.select_for_update().get(unionid=unionid)
141
-    except UserInfo.DoesNotExist:
142
-        user = None
143
-
144
-    if user:
145
-        user.openid = openid
146
-        user.sex = sex
147
-        user.nickname = nickname
148
-        user.avatar = avatar
149
-        user.country = country
150
-        user.province = province
151
-        user.city = city
152
-        user.save()
153
-
154
-        set_profile_info(user)
155
-
156
-        return response(200, 'Login Success', u'登录成功', user.data)
157
-
158
-    # unionid 不存在
159
-    # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户
160
-
161
-    signup_ip, signup_at = client_ip(request), tc.utc_datetime()
162
-
163
-    try:
164
-        user = UserInfo.objects.select_for_update().get(user_id=user_id)
165
-    except UserInfo.DoesNotExist:
166
-        user = None
167
-
168
-    if user and user.user_status == UserInfo.ASSIGN:
169
-        user.user_from = UserInfo.WX_USER
170
-        user.openid = openid
171
-        user.unionid = unionid
172
-        user.sex = sex
173
-        user.nickname = nickname
174
-        user.avatar = avatar
175
-        user.country = country
176
-        user.province = province
177
-        user.city = city
178
-        user.signup_ip = signup_ip
179
-        user.signup_at = signup_at
180
-        user.save()
181
-    else:
182
-        user = UserInfo.objects.create(
183
-            user_id=CurtailUUID.uuid(UserInfo, 'user_id'),
184
-            user_from=UserInfo.WX_USER,
185
-            openid=openid,
186
-            unionid=unionid,
187
-            sex=sex,
188
-            nickname=nickname,
189
-            avatar=avatar,
190
-            country=country,
191
-            province=province,
192
-            city=city,
193
-            user_status=UserInfo.ACTIVATED,
194
-            signup_ip=signup_ip,
195
-            signup_at=signup_at,
196
-        )
24
+    # Get or Create User
25
+    user, created = UserInfo.objects.select_for_update().get_or_create(unionid=request.POST.get('unionid', ''))
26
+
27
+    # Set User_id
28
+    if created:
29
+        user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')
30
+
31
+    # Set User Key's Value
32
+    user.user_from = UserInfo.USER_USER
33
+    user.openid = request.POST.get('wx_uid', '')
34
+    user.sex = request.POST.get('sex', 0)
35
+    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
36
+    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
37
+    user.country = request.POST.get('country', '')
38
+    user.province = request.POST.get('province', '')
39
+    user.city = request.POST.get('city', '')
40
+    user.user_status = UserInfo.ACTIVATED
41
+    user.signup_ip = client_ip(request)
42
+    user.signup_at = tc.utc_datetime()
43
+    user.save()
197 44
 
198
-        set_profile_info(user)
45
+    set_profile_info(user)
199 46
 
200
-    return response(200, 'Login Success', u'登录成功', user.data)
47
+    return response(200, 'User Login Success', u'用户端登录成功', user.data)
201 48
 
202 49
 
203 50
 @logit

+ 0 - 6
api/urls.py

@@ -20,11 +20,6 @@ from wechat import views as wechat_views
20 20
 
21 21
 # 帐户相关
22 22
 urlpatterns = [
23
-    url(r'^login$', account_views.lensman_login_api, name='lensman_login_api'),  # 摄影师登录
24
-    url(r'^u/is_registered$', account_views.user_is_registered_api, name='user_is_registered_api'),  # 用户是否已经注册
25
-    url(r'^u/signup$', account_views.user_signup_api, name='user_signup_api'),  # 用户注册
26
-    url(r'^u/login$', account_views.user_login_api, name='user_login_api'),  # 用户登录
27
-
28 23
     url(r'^u/wx/authorize$', account_views.user_wx_authorize_api, name='user_wx_authorize_api'),  # 用户端 - 微信用户授权
29 24
 
30 25
     url(r'^u/guest/status$', op_views.guest_api, name='user_guest_status_api'),  # 用户端 - 微游客状态(是否开启)
@@ -34,7 +29,6 @@ urlpatterns = [
34 29
 # 摄影师相关
35 30
 urlpatterns += [
36 31
     url(r'^l/submit$', lensman_views.lensman_submit_api, name='lensman_submit_api'),  # 摄影师信息提交
37
-    url(r'^l/login$', lensman_views.lensman_login_api, name='lensman_login_api'),  # 摄影师登录
38 32
 
39 33
     url(r'^l/wx/authorize$', lensman_views.lensman_wx_authorize_api, name='lensman_wx_authorize_api'),  # 摄影师端 - 微信用户授权
40 34
 

+ 14 - 41
group/lensman_views.py

@@ -3,8 +3,8 @@
3 3
 from __future__ import division
4 4
 
5 5
 from curtail_uuid import CurtailUUID
6
-from django.contrib.auth.hashers import check_password
7 6
 from django.db import transaction
7
+from ipaddr import client_ip
8 8
 from isoweek import Week
9 9
 from logit import logit
10 10
 from paginator import pagination
@@ -60,54 +60,27 @@ def lensman_submit_api(request):
60 60
 
61 61
 
62 62
 @logit
63
-def lensman_login_api(request):
64
-    """ 摄影师登录 """
65
-    username = request.POST.get('username', '')
66
-    password = request.POST.get('password', '')
67
-
68
-    try:
69
-        lensman = LensmanInfo.objects.get(username=username, status=True)
70
-    except LensmanInfo.DoesNotExist:
71
-        return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
72
-
73
-    if not check_password(password, lensman.encryption):
74
-        return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR)
75
-
76
-    try:
77
-        user = UserInfo.objects.get(user_id=lensman.lensman_id, status=True)
78
-    except UserInfo.DoesNotExist:
79
-        return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
80
-
81
-    return response(200, 'Login Success', u'登录成功', user.data)
82
-
83
-
84
-@logit
63
+@transaction.atomic
85 64
 def lensman_wx_authorize_api(request):
86
-    unionid = request.POST.get('unionid', '')
87
-    openid = request.POST.get('openid', '')
88
-
89
-    sex = request.POST.get('sex', 0)
90
-    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
91
-    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
92
-    country = request.POST.get('country', '')
93
-    province = request.POST.get('province', '')
94
-    city = request.POST.get('city', '')
95
-
96 65
     try:
97
-        user = UserInfo.objects.get(unionid=unionid, islensman=True, status=True)
66
+        user = UserInfo.objects.select_for_update().get(unionid=request.POST.get('unionid', ''), islensman=True, status=True)
98 67
     except UserInfo.DoesNotExist:
99 68
         return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
100 69
 
70
+    # 用户是否激活
101 71
     if user.user_status != UserInfo.ACTIVATED:
102 72
         return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED)
103 73
 
104
-    user.openid = openid
105
-    user.sex = sex
106
-    user.nickname = nickname
107
-    user.avatar = avatar
108
-    user.country = country
109
-    user.province = province
110
-    user.city = city
74
+    # Set User Key's Value
75
+    user.openid_lensman = request.POST.get('openid', '')
76
+    user.sex = request.POST.get('sex', 0)
77
+    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
78
+    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
79
+    user.country = request.POST.get('country', '')
80
+    user.province = request.POST.get('province', '')
81
+    user.city = request.POST.get('city', '')
82
+    user.signup_ip = client_ip(request)
83
+    user.signup_at = tc.utc_datetime()
111 84
     user.save()
112 85
 
113 86
     set_profile_info(user)

+ 30 - 31
miniapp/views.py

@@ -28,40 +28,39 @@ def get_userinfo_api(request):
28 28
     encryptedData = request.POST.get('encryptedData', '')
29 29
     iv = request.POST.get('iv', '')
30 30
 
31
+    # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
32
+    #  u'city': u'Guangzhou',
33
+    #  u'country': u'CN',
34
+    #  u'gender': 1,
35
+    #  u'language': u'zh_CN',
36
+    #  u'nickName': u'Band',
37
+    #  u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',
38
+    #  u'province': u'Guangdong',
39
+    #  u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',
40
+    #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
31 41
     userinfo = get_userinfo(appid=appid, secret=secret, code=code, encryptedData=encryptedData, iv=iv)
32 42
 
33
-    try:
34
-        user = UserInfo.objects.select_for_update().get(unionid=userinfo.get('unionId', ''))
35
-    except UserInfo.DoesNotExist:
36
-        user = None
43
+    # Get or Create User
44
+    user, created = UserInfo.objects.select_for_update().get_or_create(unionid=userinfo.get('unionId', ''))
37 45
 
38
-    if not user:
39
-        # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
40
-        #  u'city': u'Guangzhou',
41
-        #  u'country': u'CN',
42
-        #  u'gender': 1,
43
-        #  u'language': u'zh_CN',
44
-        #  u'nickName': u'Band',
45
-        #  u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',
46
-        #  u'province': u'Guangdong',
47
-        #  u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',
48
-        #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
49
-        user = UserInfo.objects.create(
50
-            user_id=CurtailUUID.uuid(UserInfo, 'user_id'),
51
-            user_from=UserInfo.WX_USER,
52
-            openid=userinfo.get('openId', ''),
53
-            unionid=userinfo.get('unionId', ''),
54
-            sex=userinfo.get('gender', 0),
55
-            nickname=userinfo.get('nickName', ''),
56
-            avatar=userinfo.get('avatarUrl', ''),
57
-            country=userinfo.get('country', ''),
58
-            province=userinfo.get('province', ''),
59
-            city=userinfo.get('city', ''),
60
-            user_status=UserInfo.ACTIVATED,
61
-            signup_ip=client_ip(request),
62
-            signup_at=tc.utc_datetime(),
63
-        )
46
+    # Set User_id
47
+    if created:
48
+        user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')
64 49
 
65
-        set_profile_info(user)
50
+    # Set User Key's Value
51
+    user.user_from = UserInfo.MINIAPP_USER
52
+    user.openid_miniapp = userinfo.get('openId', '')
53
+    user.sex = userinfo.get('gender', '')
54
+    user.nickname = userinfo.get('nickName', '')
55
+    user.avatar = userinfo.get('avatarUrl', '')
56
+    user.country = userinfo.get('country', '')
57
+    user.province = userinfo.get('province', '')
58
+    user.city = userinfo.get('city', '')
59
+    user.user_status = UserInfo.ACTIVATED
60
+    user.signup_ip = client_ip(request)
61
+    user.signup_at = tc.utc_datetime()
62
+    user.save()
63
+
64
+    set_profile_info(user)
66 65
 
67 66
     return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.data)

+ 13 - 6
pay/views.py

@@ -19,6 +19,7 @@ from utils.error.errno_utils import (GroupPhotoStatusCode, OrderStatusCode, User
19 19
 from utils.error.response_utils import response
20 20
 from utils.redis.rbrief import set_brief_info
21 21
 from utils.redis.rorder import set_lensman_order_record
22
+from utils.wechat_utils import get_user_openid
22 23
 
23 24
 
24 25
 WECHAT = settings.WECHAT
@@ -33,7 +34,13 @@ def wx_order_create_api(request):
33 34
     photo_id = request.POST.get('photo_id', '')
34 35
     photo_type = request.POST.get('photo_type', 'nomark')  # nomark for 去除水印, origin for 获取高清图
35 36
 
36
-    photo_type_ = OrderInfo.ORIGIN if photo_type == 'origin' else OrderInfo.NOMARK
37
+    photo_type_int = OrderInfo.ORIGIN if photo_type == 'origin' else OrderInfo.NOMARK
38
+
39
+    # 用户校验
40
+    try:
41
+        user = UserInfo.objects.get(user_id=user_id)
42
+    except UserInfo.DoesNotExist:
43
+        return response(UserStatusCode.USER_NOT_FOUND)
37 44
 
38 45
     # 群组照片校验
39 46
     try:
@@ -42,7 +49,7 @@ def wx_order_create_api(request):
42 49
         return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
43 50
 
44 51
     # 判断是否重复购买
45
-    if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_, from_uid=user_id, pay_status=OrderInfo.PAID).exists():
52
+    if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_int, from_uid=user_id, pay_status=OrderInfo.PAID).exists():
46 53
         return response(OrderStatusCode.WX_ORDER_PAID_ALREADY_EXISTS)
47 54
 
48 55
     body = request.POST.get('body', '')  # 商品描述
@@ -69,7 +76,7 @@ def wx_order_create_api(request):
69 76
         group_id=group_id,
70 77
         photo_id=photo_id,
71 78
         lensman_photo_id=group_photo.lensman_photo_id,
72
-        photo_type=1 if photo_type == 'origin' else 0,
79
+        photo_type=photo_type_int,
73 80
         from_uid=from_uid,
74 81
         to_uid=to_uid,
75 82
         session_id=group_photo.session_id,
@@ -83,14 +90,14 @@ def wx_order_create_api(request):
83 90
             notify_url=settings.API_DOMAIN + '/wx/notify_url',
84 91
             out_trade_no=order.order_id,
85 92
             total_fee=total_fee,
86
-            trade_type=trade_type,
87
-            # user_id=None,  # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传
93
+            trade_type=trade_type if trade_type != 'MINIAPP' else 'JSAPI',
94
+            user_id=get_user_openid(user, trade_type),  # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传
88 95
         )
89 96
     except WeChatPayException:
90 97
         return response(OrderStatusCode.WX_UNIFIED_ORDER_FAIL)
91 98
 
92 99
     prepay_id = prepay_data.get('prepay_id', '')
93
-    if trade_type == 'JSAPI':
100
+    if trade_type == 'JSAPI' or trade_type == 'MINIAPP':
94 101
         wxpay_params = wxpay.jsapi.get_jsapi_params(prepay_id)
95 102
     elif trade_type == 'APP':
96 103
         wxpay_params = wxpay.order.get_appapi_params(prepay_id)

+ 13 - 0
utils/openid_utils.py

@@ -0,0 +1,13 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+
4
+def get_user_openid(user, trade_type):
5
+    if trade_type == 'MINIAPP':
6
+        openid = user.openid_miniapp
7
+    elif trade_type == 'JSAPI':
8
+        openid = user.openid_oauth
9
+    elif trade_type == 'APP':
10
+        openid = None
11
+    else:
12
+        openid = None
13
+    return openid

+ 13 - 0
utils/wechat_utils.py

@@ -0,0 +1,13 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+
4
+def get_user_openid(user, trade_type):
5
+    if trade_type == 'MINIAPP':
6
+        openid = user.openid_miniapp
7
+    elif trade_type == 'JSAPI':
8
+        openid = user.openid_oauth
9
+    elif trade_type == 'APP':
10
+        openid = None
11
+    else:
12
+        openid = None
13
+    return openid