WechatService.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. import re
  2. import requests
  3. from django.core.paginator import Paginator
  4. from django.db import transaction
  5. from DCbackend import settings
  6. from DCbackend.utils.common import success, fail, pageData
  7. from backend.Form.WechatUserForm import WechatUserForm
  8. from backend.models import WechatUser, Admin
  9. from django.core.cache import cache
  10. #微信模块相关方法
  11. class WechatService:
  12. @staticmethod
  13. @transaction.atomic
  14. def insertInfo(request):
  15. form = WechatUserForm(request.POST)
  16. if form.is_valid():
  17. form.save()
  18. return success("保存成功")
  19. else:
  20. return fail(form.errors)
  21. @staticmethod
  22. def getInfoList(request):
  23. page = request.POST.get("page")
  24. pageSize = request.POST.get("pageSize")
  25. if page is None:
  26. page = 1
  27. if pageSize is None:
  28. pageSize = 10
  29. where = {}
  30. name = request.POST.get("name", '')
  31. if name:
  32. where["name__icontains"] = name
  33. status = request.POST.get("status")
  34. if status:
  35. where['status'] = status
  36. paginator = Paginator(WechatUser.objects.filter(**where).exclude(status=4).order_by("-id"),
  37. pageSize) # 每页显示10条数据
  38. page_obj = paginator.get_page(page)
  39. dataList = []
  40. for item in page_obj:
  41. info = WechatService.getDetail(item)
  42. dataList.append(info)
  43. return success(pageData(page, pageSize, paginator.num_pages, paginator.count, dataList))
  44. @staticmethod
  45. def getDetail(item: WechatUser):
  46. return {
  47. "id": item.id,
  48. 'name': item.name,
  49. 'nikeName': item.nikeName,
  50. 'phone': item.phone,
  51. 'openid': item.openid,
  52. 'age': item.age,
  53. 'level': item.level,
  54. 'user_id': item.user_id,
  55. 'mini_url': item.mini_url,
  56. 'examine': item.examine,
  57. 'status': item.status
  58. }
  59. @staticmethod
  60. @transaction.atomic
  61. def updateUserInfo(request):
  62. openid = request.POST.get("openid")
  63. wechatUser = WechatUser.objects.filter(openid=openid).exclude(status=4).first()
  64. if not wechatUser:
  65. return fail("未登录小程序")
  66. id_card = request.POST.get("id_card")
  67. if WechatService.is_valid_id(id_card):
  68. wechatUser.id_card = id_card
  69. else:
  70. return fail("身份证格式错误")
  71. wechatUser.name = request.POST.get("name")
  72. wechatUser.nikeName = request.POST.get("nikeName")
  73. wechatUser.age = request.POST.get("age")
  74. wechatUser.mini_url = request.POST.get("mini_url")
  75. wechatUser.phone = request.POST.get("purePhoneNumber")
  76. wechatUser.examine = request.POST.get("examine")
  77. wechatUser.save()
  78. return success("提交审核成功")
  79. @staticmethod
  80. @transaction.atomic
  81. def to_examine(request):
  82. id = request.POST.get("id")
  83. if not id:
  84. return fail("id为空")
  85. wechatUser = WechatUser.objects.filter(id=id).exclude(status=4).first()
  86. if not wechatUser:
  87. return fail("无此小程序用户信息")
  88. level = request.POST.get("level")
  89. wechatUser.level = level
  90. wechatUser.examine = 1
  91. wechatUser.save()
  92. return success("审核完成")
  93. @staticmethod
  94. def is_valid_id(id_card):
  95. pattern = r'^[1-9]\d{5}(18|19|20|21|22)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])$'
  96. return bool(re.match(pattern, id_card))
  97. @staticmethod
  98. def deleteUserInfo(request):
  99. id = request.POST.get("id")
  100. wechatUser = WechatUser.objects.filter(id=id).first()
  101. if wechatUser:
  102. wechatUser.status = 4
  103. wechatUser.save()
  104. return success("删除成功")
  105. else:
  106. return fail("删除失败")
  107. @staticmethod
  108. def get_access_token(request):
  109. try:
  110. # 首先尝试从缓存中获取 access_token
  111. access_token = cache.get('wechat_access_token')
  112. if access_token:
  113. return access_token
  114. # return success("m没有获取到")
  115. # 如果缓存中没有,则从微信服务器获取新的 access_token
  116. appid = settings.WECHAT_APPID
  117. secret = settings.WECHAT_SECRET
  118. url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}"
  119. response = requests.get(url)
  120. result = response.json()
  121. if 'access_token' in result:
  122. access_token = result['access_token']
  123. expires_in = result.get('expires_in', 7200) # 默认7200秒
  124. # 将 access_token 存入缓存,有效期设置比微信给的稍短一些
  125. cache.set('wechat_access_token', access_token, expires_in - 200)
  126. return access_token
  127. else:
  128. error_msg = result.get('errmsg', '未知错误')
  129. return fail(f"获取access_token失败: {error_msg}")
  130. except Exception as e:
  131. return fail(f"获取access_token时发生错误: {str(e)}")
  132. @staticmethod
  133. @transaction.atomic
  134. def wechatLogin(request):
  135. try:
  136. js_code = request.POST.get("code")
  137. if not js_code:
  138. return fail(f"缺少code参数,{js_code}")
  139. appid = settings.WECHAT_APPID
  140. secret = settings.WECHAT_SECRET
  141. url = "https://api.weixin.qq.com/sns/jscode2session"
  142. params = {
  143. "appid": appid,
  144. "secret": secret,
  145. "js_code": js_code,
  146. "grant_type": "authorization_code"
  147. }
  148. response = requests.get(url, params=params)
  149. result = response.json()
  150. if 'openid' in result:
  151. # 创建新的WechatUser对象
  152. wechat_user, created = WechatUser.objects.get_or_create(
  153. openid=result['openid'],
  154. defaults={
  155. 'level': 1,
  156. 'status': 5 # 假设1表示活跃状态
  157. }
  158. )
  159. return success({
  160. "openid": result['openid'],
  161. "session_key": result.get('session_key'),
  162. "unionid": result.get('unionid'),
  163. "user_id": wechat_user.id,
  164. "is_new_user": created
  165. }, "微信登录成功")
  166. else:
  167. error_msg = result.get('errmsg', '未知错误')
  168. return fail(f"微信登录失败: {error_msg}")
  169. except Exception as e:
  170. return fail(f"微信登录过程中发生错误: {str(e)}")
  171. @staticmethod
  172. @transaction.atomic
  173. def getUserPhoneNumber(request):
  174. try:
  175. access_token = WechatService.get_access_token(request)
  176. if not access_token:
  177. return fail("access_token为空")
  178. code = request.POST.get("code")
  179. if not code:
  180. return fail("缺少code参数")
  181. openid = request.POST.get("openid")
  182. if not openid:
  183. return fail("缺少openid")
  184. url = f"https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={access_token}"
  185. data = {
  186. "code": code
  187. }
  188. response = requests.post(url, json=data)
  189. result = response.json()
  190. if result.get('errcode') == 0:
  191. phone_info = result.get('phone_info', {})
  192. purePhoneNumber = phone_info.get('purePhoneNumber')
  193. WechatUser.objects.filter(openid=openid).update(phone=purePhoneNumber)
  194. return success({
  195. "phoneNumber": phone_info.get('phoneNumber'),
  196. "purePhoneNumber": purePhoneNumber,
  197. "countryCode": phone_info.get('countryCode'),
  198. }, "获取用户手机号成功")
  199. else:
  200. error_msg = result.get('errmsg', '未知错误')
  201. return fail(f"获取用户手机号失败: {error_msg}")
  202. except Exception as e:
  203. return fail(f"获取用户手机号过程中发生错误: {str(e)}")
  204. @staticmethod
  205. def getOpenPid(request):
  206. try:
  207. access_token_result = WechatService.get_access_token(request)
  208. if not access_token_result:
  209. return fail("获取access_token失败")
  210. access_token = access_token_result
  211. code = request.POST.get("code")
  212. if not code:
  213. return fail("缺少code参数")
  214. url = f"https://api.weixin.qq.com/wxa/getpluginopenpid?access_token={access_token}"
  215. data = {
  216. "code": code
  217. }
  218. response = requests.post(url, json=data)
  219. result = response.json()
  220. if result.get('errcode') == 0:
  221. openpid = result.get('openpid')
  222. return success(openpid, "获取插件用户openPid成功")
  223. else:
  224. error_msg = result.get('errmsg', '未知错误')
  225. return fail(f"获取插件用户openPid失败: {error_msg}")
  226. except Exception as e:
  227. return fail(f"获取插件用户openPid过程中发生错误: {str(e)}")
  228. @staticmethod
  229. def getUserInfo(request):
  230. openid = request.POST.get("openid")
  231. if not openid:
  232. return fail("缺少 openid 参数")
  233. try:
  234. user = WechatUser.objects.filter(openid=openid).exclude(status=4).first()
  235. if not user:
  236. return fail("未找到用户信息")
  237. user_info = {
  238. "id": user.id,
  239. "name": user.name,
  240. "nikeName": user.nikeName,
  241. "phone": user.phone,
  242. "openid": user.openid,
  243. "age": user.age,
  244. "level": user.level,
  245. "user_id": user.user_id,
  246. "id_card": user.id_card,
  247. "mini_url": user.mini_url,
  248. "examine": user.examine,
  249. "status": user.status,
  250. }
  251. return success(user_info)
  252. except WechatUser.DoesNotExist:
  253. return fail("用户不存在")
  254. @staticmethod
  255. def getKbmUrl(request):
  256. openid = request.POST.get("openid")
  257. waibu = "http://58.246.234.210:7860/api/v1/run/c7ea3a2d-f50c-4936-b96c-3fe7c34fa062?stream=false"
  258. neibu = "http://58.246.234.210:7860/api/v1/run/9263c538-2cd2-4c1b-8c9a-3bb986920d6d?stream=false"
  259. if not openid:
  260. return success(waibu, "普通用户返回外部知识库链接")
  261. info = WechatUser.objects.filter(openid=openid).exclude(status=4).first()
  262. if not info:
  263. return success(waibu,"普通用户返回外部知识库链接")
  264. if info.level == 1:
  265. return success(waibu, "普通用户返回外部知识库链接")
  266. return success(neibu,"内部人员返回内部知识库链接")
  267. @staticmethod
  268. @transaction.atomic
  269. def updateBackground(request):
  270. id = request.POST.get("id")
  271. wechatUser = WechatUser.objects.filter(id=id).first()
  272. if wechatUser:
  273. wechatUser.name = request.POST.get("name")
  274. wechatUser.nikeName =request.POST.get("nikeName")
  275. wechatUser.phone =request.POST.get("phone")
  276. wechatUser.openid =request.POST.get("openid")
  277. wechatUser.age =request.POST.get("age")
  278. wechatUser.level =request.POST.get("level")
  279. wechatUser.user_id =request.POST.get("user_id")
  280. wechatUser.id_card =request.POST.get("id_card")
  281. wechatUser.mini_url =request.POST.get("mini_url")
  282. wechatUser.status =request.POST.get("status")
  283. wechatUser.save()
  284. return success("修改成功")
  285. else:
  286. return fail("修改失败")