@@ -374,6 +374,10 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 374 | 374 |
} |
| 375 | 375 |
|
| 376 | 376 |
def brandata(self, brand_id=None): |
| 377 |
+ if self.unionid: |
|
| 378 |
+ saleclerk = SaleclerkInfo.objects.filter(brand_id=brand_id, unionid=self.unionid, status=True).exists() |
|
| 379 |
+ else: |
|
| 380 |
+ saleclerk = False |
|
| 377 | 381 |
return {
|
| 378 | 382 |
'user_id': self.user_id, |
| 379 | 383 |
'name': self.name, |
@@ -383,7 +387,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 383 | 387 |
'phone': self.phone, |
| 384 | 388 |
# TODO: Diff for Brands |
| 385 | 389 |
'has_membercard': self.has_membercard, |
| 386 |
- 'saleclerk': SaleclerkInfo.objects.filter(brand_id=brand_id, unionid=self.unionid, status=True).exists(), |
|
| 390 |
+ 'saleclerk': saleclerk, |
|
| 387 | 391 |
} |
| 388 | 392 |
|
| 389 | 393 |
|
@@ -180,6 +180,8 @@ urlpatterns += [ |
||
| 180 | 180 |
# Mini App |
| 181 | 181 |
urlpatterns += [ |
| 182 | 182 |
url(r'^mini/userinfo$', mini_views.get_userinfo_api, name='get_userinfo_api'), # 获取用户信息 |
| 183 |
+ url(r'^mini/login$', mini_views.mini_login_api, name='mini_login_api'), # 小程序登录 |
|
| 184 |
+ url(r'^mini/userinfo2$', mini_views.get_userinfo_api2, name='get_userinfo_api2'), # 获取用户信息 |
|
| 183 | 185 |
] |
| 184 | 186 |
|
| 185 | 187 |
urlpatterns += [ |
@@ -7,13 +7,13 @@ from django_logit import logit |
||
| 7 | 7 |
from django_response import response |
| 8 | 8 |
from ipaddr import client_ip |
| 9 | 9 |
from pywe_membercard import get_miniapp_extraData |
| 10 |
-from pywe_miniapp import get_session_key, get_userinfo, store_session_key |
|
| 10 |
+from pywe_miniapp import get_session_info, get_session_key, get_userinfo, store_session_key |
|
| 11 | 11 |
from pywe_storage import RedisStorage |
| 12 | 12 |
from TimeConvert import TimeConvert as tc |
| 13 | 13 |
|
| 14 | 14 |
from account.models import UserInfo |
| 15 | 15 |
from statistic.models import RegisterStatisticInfo |
| 16 |
-from utils.error.errno_utils import ProductBrandStatusCode |
|
| 16 |
+from utils.error.errno_utils import ProductBrandStatusCode, UserStatusCode |
|
| 17 | 17 |
from utils.redis.connect import r |
| 18 | 18 |
from utils.redis.rprofile import set_profile_info |
| 19 | 19 |
|
@@ -83,6 +83,75 @@ def get_userinfo_api(request): |
||
| 83 | 83 |
|
| 84 | 84 |
# Store Userinfo |
| 85 | 85 |
set_profile_info(user) |
| 86 |
+ |
|
| 87 |
+ # Store SessionKey |
|
| 88 |
+ store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r)) |
|
| 89 |
+ |
|
| 90 |
+ return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id)) |
|
| 91 |
+ |
|
| 92 |
+ |
|
| 93 |
+@logit |
|
| 94 |
+@transaction.atomic |
|
| 95 |
+def mini_login_api(request): |
|
| 96 |
+ brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
|
|
| 97 |
+ |
|
| 98 |
+ if brand_id != settings.KODO_DEFAULT_BRAND_ID: |
|
| 99 |
+ return response(ProductBrandStatusCode.BRAND_NOT_MATCH) |
|
| 100 |
+ |
|
| 101 |
+ wxcfg = WECHAT.get('MINIAPP', {})
|
|
| 102 |
+ |
|
| 103 |
+ appid = wxcfg.get('appID')
|
|
| 104 |
+ secret = wxcfg.get('appsecret')
|
|
| 105 |
+ |
|
| 106 |
+ code = request.POST.get('code', '')
|
|
| 107 |
+ |
|
| 108 |
+ # // 正常返回的JSON数据包 |
|
| 109 |
+ # {
|
|
| 110 |
+ # "openid": "OPENID", |
|
| 111 |
+ # "session_key": "SESSIONKEY", |
|
| 112 |
+ # } |
|
| 113 |
+ # |
|
| 114 |
+ # // 满足UnionID返回条件时,返回的JSON数据包 |
|
| 115 |
+ # {
|
|
| 116 |
+ # "openid": "OPENID", |
|
| 117 |
+ # "session_key": "SESSIONKEY", |
|
| 118 |
+ # "unionid": "UNIONID" |
|
| 119 |
+ # } |
|
| 120 |
+ # // 错误时返回JSON数据包(示例为Code无效) |
|
| 121 |
+ # {
|
|
| 122 |
+ # "errcode": 40029, |
|
| 123 |
+ # "errmsg": "invalid code" |
|
| 124 |
+ # } |
|
| 125 |
+ session_info = get_session_info(appid=appid, secret=secret, code=code) |
|
| 126 |
+ session_key = session_info.get('session_key', '')
|
|
| 127 |
+ unionid = session_info.get('unionid', '')
|
|
| 128 |
+ openid = session_info.get('openid', '')
|
|
| 129 |
+ |
|
| 130 |
+ # Get or Create User |
|
| 131 |
+ user, created = UserInfo.objects.select_for_update().get_or_create(openid_miniapp=openid) |
|
| 132 |
+ |
|
| 133 |
+ # Set User_id |
|
| 134 |
+ if created: |
|
| 135 |
+ user.user_id = CurtailUUID.uuid(UserInfo, 'user_id') |
|
| 136 |
+ # 注册用户统计 |
|
| 137 |
+ rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create( |
|
| 138 |
+ brand_id=brand_id, |
|
| 139 |
+ ymd=int(tc.local_string(format='%Y%m%d')), |
|
| 140 |
+ ) |
|
| 141 |
+ rsi.num += 1 |
|
| 142 |
+ rsi.save() |
|
| 143 |
+ |
|
| 144 |
+ # Set User Key's Value |
|
| 145 |
+ user.user_from = UserInfo.MINIAPP_USER |
|
| 146 |
+ user.unionid = unionid |
|
| 147 |
+ user.user_status = UserInfo.ACTIVATED |
|
| 148 |
+ user.signup_ip = client_ip(request) |
|
| 149 |
+ user.signup_at = tc.utc_datetime() |
|
| 150 |
+ user.save() |
|
| 151 |
+ |
|
| 152 |
+ # Store Userinfo |
|
| 153 |
+ set_profile_info(user) |
|
| 154 |
+ |
|
| 86 | 155 |
# Store SessionKey |
| 87 | 156 |
store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r)) |
| 88 | 157 |
|
@@ -91,6 +160,60 @@ def get_userinfo_api(request): |
||
| 91 | 160 |
|
| 92 | 161 |
@logit |
| 93 | 162 |
@transaction.atomic |
| 163 |
+def get_userinfo_api2(request): |
|
| 164 |
+ brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
|
|
| 165 |
+ user_id = request.POST.get('user_id', '')
|
|
| 166 |
+ |
|
| 167 |
+ if brand_id != settings.KODO_DEFAULT_BRAND_ID: |
|
| 168 |
+ return response(ProductBrandStatusCode.BRAND_NOT_MATCH) |
|
| 169 |
+ |
|
| 170 |
+ wxcfg = WECHAT.get('MINIAPP', {})
|
|
| 171 |
+ |
|
| 172 |
+ appid = wxcfg.get('appID')
|
|
| 173 |
+ secret = wxcfg.get('appsecret')
|
|
| 174 |
+ |
|
| 175 |
+ code = request.POST.get('code', '')
|
|
| 176 |
+ encryptedData = request.POST.get('encryptedData', '')
|
|
| 177 |
+ iv = request.POST.get('iv', '')
|
|
| 178 |
+ |
|
| 179 |
+ try: |
|
| 180 |
+ user = UserInfo.objects.get(user_id=user_id, status=True) |
|
| 181 |
+ except UserInfo.DoesNotExist: |
|
| 182 |
+ return response(UserStatusCode.USER_NOT_FOUND) |
|
| 183 |
+ |
|
| 184 |
+ # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
|
|
| 185 |
+ # u'city': u'Guangzhou', |
|
| 186 |
+ # u'country': u'CN', |
|
| 187 |
+ # u'gender': 1, |
|
| 188 |
+ # u'language': u'zh_CN', |
|
| 189 |
+ # u'nickName': u'Band', |
|
| 190 |
+ # u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE', |
|
| 191 |
+ # u'province': u'Guangdong', |
|
| 192 |
+ # u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA', |
|
| 193 |
+ # u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
|
|
| 194 |
+ session_key = get_session_key(appid=appid, secret=secret, code=code, unid=user_id, storage=RedisStorage(r)) |
|
| 195 |
+ # Get Userinfo |
|
| 196 |
+ userinfo = get_userinfo(appid=appid, secret=secret, code=code, session_key=session_key, encryptedData=encryptedData, iv=iv) |
|
| 197 |
+ |
|
| 198 |
+ # Set User Key's Value |
|
| 199 |
+ user.unionid = userinfo.get('unionId', '')
|
|
| 200 |
+ user.openid_miniapp = userinfo.get('openId', '')
|
|
| 201 |
+ user.sex = userinfo.get('gender', '')
|
|
| 202 |
+ user.nickname = userinfo.get('nickName', '')
|
|
| 203 |
+ user.avatar = userinfo.get('avatarUrl', '')
|
|
| 204 |
+ user.country = userinfo.get('country', '')
|
|
| 205 |
+ user.province = userinfo.get('province', '')
|
|
| 206 |
+ user.city = userinfo.get('city', '')
|
|
| 207 |
+ user.save() |
|
| 208 |
+ |
|
| 209 |
+ # Store Userinfo |
|
| 210 |
+ set_profile_info(user) |
|
| 211 |
+ |
|
| 212 |
+ return response(200, 'Mini App Get Userinfo Success', u'微信小程序获取用户信息成功', user.brandata(brand_id=brand_id)) |
|
| 213 |
+ |
|
| 214 |
+ |
|
| 215 |
+@logit |
|
| 216 |
+@transaction.atomic |
|
| 94 | 217 |
def membercard_extradata(request): |
| 95 | 218 |
wxcfg = WECHAT.get('JSAPI', {})
|
| 96 | 219 |
|
@@ -1,6 +1,6 @@ |
||
| 1 | 1 |
pywe-jssdk==1.1.0 |
| 2 | 2 |
pywe-membercard==1.0.0 |
| 3 |
-pywe-miniapp==1.1.3 |
|
| 3 |
+pywe-miniapp==1.1.4 |
|
| 4 | 4 |
pywe-oauth==1.0.6 |
| 5 | 5 |
pywe-pay==1.0.12 |
| 6 | 6 |
pywe-pay-notify==1.0.4 |