暂无描述

views.py 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. from django.conf import settings
  4. from django.db import transaction
  5. from django_curtail_uuid import CurtailUUID
  6. from django_logit import logit
  7. from django_response import response
  8. from ipaddr import client_ip
  9. from pywe_membercard import get_miniapp_extraData
  10. from pywe_miniapp import get_session_info, get_session_key, get_userinfo, store_session_key
  11. from pywe_storage import RedisStorage
  12. from TimeConvert import TimeConvert as tc
  13. from account.models import UserInfo, UserIntegralIncomeExpensesInfo
  14. from mch.models import SaleclerkInfo
  15. from statistic.models import RegisterStatisticInfo
  16. from utils.error.errno_utils import ProductBrandStatusCode, UserStatusCode
  17. from utils.redis.connect import r
  18. from utils.redis.rprofile import set_profile_info
  19. WECHAT = settings.WECHAT
  20. logger = logging.getLogger('logit')
  21. @logit
  22. @transaction.atomic
  23. def get_userinfo_api(request):
  24. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  25. appId = request.POST.get('appId', 'MINIAPP')
  26. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  27. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  28. wxcfg = WECHAT.get(appId, {})
  29. appid = wxcfg.get('appID')
  30. secret = wxcfg.get('appsecret')
  31. code = request.POST.get('code', '')
  32. encryptedData = request.POST.get('encryptedData', '')
  33. iv = request.POST.get('iv', '')
  34. # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
  35. # u'city': u'Guangzhou',
  36. # u'country': u'CN',
  37. # u'gender': 1,
  38. # u'language': u'zh_CN',
  39. # u'nickName': u'Band',
  40. # u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',
  41. # u'province': u'Guangdong',
  42. # u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',
  43. # u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
  44. session_key = get_session_key(appid=appid, secret=secret, code=code)
  45. # Get Userinfo
  46. userinfo = get_userinfo(appid=appid, secret=secret, code=code, session_key=session_key, encryptedData=encryptedData, iv=iv)
  47. # Get or Create User
  48. user, created = UserInfo.objects.select_for_update().get_or_create(unionid=userinfo.get('unionId', ''))
  49. # Set User_id
  50. if created:
  51. user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')
  52. # 注册用户统计
  53. rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create(
  54. brand_id=brand_id,
  55. ymd=int(tc.local_string(format='%Y%m%d')),
  56. )
  57. rsi.num += 1
  58. rsi.save()
  59. # Set User Key's Value
  60. user.user_from = UserInfo.MINIAPP_USER
  61. user.appid = appId
  62. user.unionid = userinfo.get('unionId', '')
  63. user.openid_miniapp = userinfo.get('openId', '')
  64. user.sex = userinfo.get('gender', '')
  65. user.nickname = userinfo.get('nickName', '')
  66. user.avatar = userinfo.get('avatarUrl', '')
  67. user.country = userinfo.get('country', '')
  68. user.province = userinfo.get('province', '')
  69. user.city = userinfo.get('city', '')
  70. user.user_status = UserInfo.ACTIVATED
  71. user.signup_ip = client_ip(request)
  72. user.signup_at = tc.utc_datetime()
  73. user.save()
  74. # Store Userinfo
  75. set_profile_info(user)
  76. # Store SessionKey
  77. store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r))
  78. # Just for compatible because of store session_key has changed
  79. store_session_key(appid=appid, secret=secret, session_key=session_key, unid='', storage=RedisStorage(r))
  80. return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id))
  81. @logit(res=True)
  82. @transaction.atomic
  83. def mini_login_api(request):
  84. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  85. appId = request.POST.get('appId', 'MINIAPP')
  86. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  87. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  88. wxcfg = WECHAT.get(appId, {})
  89. appid = wxcfg.get('appID')
  90. secret = wxcfg.get('appsecret')
  91. code = request.POST.get('code', '')
  92. # // 正常返回的JSON数据包
  93. # {
  94. # "openid": "OPENID",
  95. # "session_key": "SESSIONKEY",
  96. # }
  97. #
  98. # // 满足UnionID返回条件时,返回的JSON数据包
  99. # {
  100. # "openid": "OPENID",
  101. # "session_key": "SESSIONKEY",
  102. # "unionid": "UNIONID"
  103. # }
  104. # // 错误时返回JSON数据包(示例为Code无效)
  105. # {
  106. # "errcode": 40029,
  107. # "errmsg": "invalid code"
  108. # }
  109. session_info = get_session_info(appid=appid, secret=secret, code=code)
  110. logger.debug(session_info)
  111. session_key = session_info.get('session_key', '')
  112. unionid = session_info.get('unionid', '')
  113. openid = session_info.get('openid', '')
  114. # Get or Create User
  115. user, created = UserInfo.objects.select_for_update().get_or_create(openid_miniapp=openid)
  116. # Set User_id
  117. if created:
  118. user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')
  119. # 注册用户统计
  120. rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create(
  121. brand_id=brand_id,
  122. ymd=int(tc.local_string(format='%Y%m%d')),
  123. )
  124. rsi.num += 1
  125. rsi.save()
  126. # Set User Key's Value
  127. user.user_from = UserInfo.MINIAPP_USER
  128. user.appid = appId
  129. if unionid:
  130. user.unionid = unionid
  131. # 同步销售员手机号
  132. try:
  133. saleclerk = SaleclerkInfo.objects.get(unionid=unionid, is_auth=True, status=True)
  134. except SaleclerkInfo.DoesNotExist:
  135. saleclerk = None
  136. if saleclerk:
  137. user.phone = saleclerk.clerk_phone
  138. user.user_status = UserInfo.ACTIVATED
  139. user.signup_ip = client_ip(request)
  140. user.signup_at = tc.utc_datetime()
  141. user.save()
  142. # Store Userinfo
  143. set_profile_info(user)
  144. # Store SessionKey
  145. store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r))
  146. # Just for compatible because of store session_key has changed
  147. store_session_key(appid=appid, secret=secret, session_key=session_key, unid='', storage=RedisStorage(r))
  148. return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id))
  149. @logit
  150. @transaction.atomic
  151. def get_userinfo_api2(request):
  152. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  153. user_id = request.POST.get('user_id', '')
  154. appId = request.POST.get('appId', 'MINIAPP')
  155. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  156. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  157. wxcfg = WECHAT.get(appId, {})
  158. appid = wxcfg.get('appID')
  159. secret = wxcfg.get('appsecret')
  160. encryptedData = request.POST.get('encryptedData', '')
  161. iv = request.POST.get('iv', '')
  162. try:
  163. user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)
  164. except UserInfo.DoesNotExist:
  165. return response(UserStatusCode.USER_NOT_FOUND)
  166. # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
  167. # u'city': u'Guangzhou',
  168. # u'country': u'CN',
  169. # u'gender': 1,
  170. # u'language': u'zh_CN',
  171. # u'nickName': u'Band',
  172. # u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',
  173. # u'province': u'Guangdong',
  174. # u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',
  175. # u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
  176. session_key = get_session_key(appid=appid, secret=secret, unid=user_id, storage=RedisStorage(r))
  177. # Get Userinfo
  178. userinfo = get_userinfo(appid=appid, secret=secret, session_key=session_key, encryptedData=encryptedData, iv=iv)
  179. # Set User Key's Value
  180. user.appid = appId
  181. user.unionid = userinfo.get('unionId', '')
  182. user.openid_miniapp = userinfo.get('openId', '')
  183. user.sex = userinfo.get('gender', '')
  184. user.nickname = userinfo.get('nickName', '')
  185. user.avatar = userinfo.get('avatarUrl', '')
  186. user.country = userinfo.get('country', '')
  187. user.province = userinfo.get('province', '')
  188. user.city = userinfo.get('city', '')
  189. user.save()
  190. # Store Userinfo
  191. set_profile_info(user)
  192. return response(200, 'Mini App Get Userinfo Success', u'微信小程序获取用户信息成功', user.brandata(brand_id=brand_id))
  193. @logit(res=True)
  194. @transaction.atomic
  195. def membercard_extradata(request):
  196. wxcfg = WECHAT.get('JSAPI', {})
  197. appid = wxcfg.get('appID')
  198. secret = wxcfg.get('appsecret')
  199. extraData = get_miniapp_extraData(settings.MEMBER_CARD_ID, outer_str='miniapp', appid=appid, secret=secret, storage=RedisStorage(r))
  200. return response(200, 'Get extraData Success', u'获取 extraData 成功', extraData)
  201. @logit
  202. @transaction.atomic
  203. def user_integral_add(request):
  204. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  205. user_id = request.POST.get('user_id', '')
  206. integral = int(request.POST.get('integral', 0))
  207. remark = request.POST.get('remark')
  208. if brand_id != settings.KODO_DEFAULT_BRAND_ID:
  209. return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
  210. try:
  211. user = UserInfo.objects.get(user_id=user_id, status=True)
  212. except UserInfo.DoesNotExist:
  213. return response(UserStatusCode.USER_NOT_FOUND)
  214. UserIntegralIncomeExpensesInfo.objects.create(
  215. brand_id=brand_id,
  216. user_id=user_id,
  217. integral_from=UserIntegralIncomeExpensesInfo.CONTRIBUTE,
  218. integral=integral,
  219. remark=remark
  220. )
  221. user.integral += integral
  222. user.save()
  223. return response(200, 'Add User Integral Success', u'添加用户投稿积分成功')