WechatService.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  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. 'source': item.source
  59. }
  60. @staticmethod
  61. @transaction.atomic
  62. def updateUserInfo(request):
  63. openid = request.POST.get("openid")
  64. wechatUser = WechatUser.objects.filter(openid=openid).exclude(status=4).first()
  65. if not wechatUser:
  66. return fail("未登录小程序")
  67. id_card = request.POST.get("id_card")
  68. if WechatService.is_valid_id(id_card):
  69. wechatUser.id_card = id_card
  70. else:
  71. return fail("身份证格式错误")
  72. wechatUser.name = request.POST.get("name")
  73. wechatUser.nikeName = request.POST.get("nikeName")
  74. wechatUser.age = request.POST.get("age")
  75. wechatUser.mini_url = request.POST.get("mini_url")
  76. wechatUser.phone = request.POST.get("purePhoneNumber")
  77. wechatUser.examine = request.POST.get("examine")
  78. wechatUser.save()
  79. return success("提交审核成功")
  80. @staticmethod
  81. @transaction.atomic
  82. def updateNikeName(request):
  83. openid = request.POST.get("openid")
  84. wechatUser = WechatUser.objects.filter(openid=openid).exclude(status=4).first()
  85. if not wechatUser:
  86. return fail("未登录小程序")
  87. wechatUser.nikeName = request.POST.get("nikeName")
  88. wechatUser.save()
  89. return success("提交审核成功")
  90. @staticmethod
  91. @transaction.atomic
  92. def to_examine(request):
  93. id = request.POST.get("id")
  94. if not id:
  95. return fail("id为空")
  96. wechatUser = WechatUser.objects.filter(id=id).exclude(status=4).first()
  97. if not wechatUser:
  98. return fail("无此小程序用户信息")
  99. level = request.POST.get("level")
  100. wechatUser.level = level
  101. wechatUser.examine = 1
  102. wechatUser.save()
  103. return success("审核完成")
  104. @staticmethod
  105. def is_valid_id(id_card):
  106. 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])$'
  107. return bool(re.match(pattern, id_card))
  108. @staticmethod
  109. def deleteUserInfo(request):
  110. id = request.POST.get("id")
  111. wechatUser = WechatUser.objects.filter(id=id).first()
  112. if wechatUser:
  113. wechatUser.status = 4
  114. wechatUser.save()
  115. return success("删除成功")
  116. else:
  117. return fail("删除失败")
  118. @staticmethod
  119. def get_access_token(request):
  120. try:
  121. # 首先尝试从缓存中获取 access_token
  122. access_token = cache.get('wechat_access_token')
  123. if access_token:
  124. return access_token
  125. # return success("m没有获取到")
  126. # 如果缓存中没有,则从微信服务器获取新的 access_token
  127. appid = settings.WECHAT_APPID
  128. secret = settings.WECHAT_SECRET
  129. url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}"
  130. response = requests.get(url)
  131. result = response.json()
  132. if 'access_token' in result:
  133. access_token = result['access_token']
  134. expires_in = result.get('expires_in', 7200) # 默认7200秒
  135. # 将 access_token 存入缓存,有效期设置比微信给的稍短一些
  136. cache.set('wechat_access_token', access_token, expires_in - 200)
  137. return access_token
  138. else:
  139. error_msg = result.get('errmsg', '未知错误')
  140. return fail(f"获取access_token失败: {error_msg}")
  141. except Exception as e:
  142. return fail(f"获取access_token时发生错误: {str(e)}")
  143. @staticmethod
  144. @transaction.atomic
  145. def wechatLogin(request):
  146. try:
  147. js_code = request.POST.get("code")
  148. if not js_code:
  149. return fail(f"缺少code参数,{js_code}")
  150. appid = settings.WECHAT_APPID
  151. secret = settings.WECHAT_SECRET
  152. url = "https://api.weixin.qq.com/sns/jscode2session"
  153. params = {
  154. "appid": appid,
  155. "secret": secret,
  156. "js_code": js_code,
  157. "grant_type": "authorization_code"
  158. }
  159. response = requests.get(url, params=params)
  160. result = response.json()
  161. if 'openid' in result:
  162. # 创建新的WechatUser对象
  163. wechat_user, created = WechatUser.objects.get_or_create(
  164. openid=result['openid'],
  165. source="mini",
  166. defaults={
  167. 'level': 1,
  168. 'status': 5 # 假设1表示活跃状态
  169. }
  170. )
  171. return success({
  172. "openid": result['openid'],
  173. "session_key": result.get('session_key'),
  174. "unionid": result.get('unionid'),
  175. "user_id": wechat_user.id,
  176. "is_new_user": created
  177. }, "微信登录成功")
  178. else:
  179. error_msg = result.get('errmsg', '未知错误')
  180. return fail(f"微信登录失败: {error_msg}")
  181. except Exception as e:
  182. return fail(f"微信登录过程中发生错误: {str(e)}")
  183. @staticmethod
  184. @transaction.atomic
  185. def getUserPhoneNumber(request):
  186. try:
  187. access_token = WechatService.get_access_token(request)
  188. if not access_token:
  189. return fail("access_token为空")
  190. code = request.POST.get("code")
  191. if not code:
  192. return fail("缺少code参数")
  193. openid = request.POST.get("openid")
  194. if not openid:
  195. return fail("缺少openid")
  196. url = f"https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={access_token}"
  197. data = {
  198. "code": code
  199. }
  200. response = requests.post(url, json=data)
  201. result = response.json()
  202. if result.get('errcode') == 0:
  203. phone_info = result.get('phone_info', {})
  204. purePhoneNumber = phone_info.get('purePhoneNumber')
  205. WechatUser.objects.filter(openid=openid,source="mini").update(phone=purePhoneNumber)
  206. return success({
  207. "phoneNumber": phone_info.get('phoneNumber'),
  208. "purePhoneNumber": purePhoneNumber,
  209. "countryCode": phone_info.get('countryCode'),
  210. }, "获取用户手机号成功")
  211. else:
  212. error_msg = result.get('errmsg', '未知错误')
  213. return fail(f"获取用户手机号失败: {error_msg}")
  214. except Exception as e:
  215. return fail(f"获取用户手机号过程中发生错误: {str(e)}")
  216. @staticmethod
  217. def getOpenPid(request):
  218. try:
  219. access_token_result = WechatService.get_access_token(request)
  220. if not access_token_result:
  221. return fail("获取access_token失败")
  222. access_token = access_token_result
  223. code = request.POST.get("code")
  224. if not code:
  225. return fail("缺少code参数")
  226. url = f"https://api.weixin.qq.com/wxa/getpluginopenpid?access_token={access_token}"
  227. data = {
  228. "code": code
  229. }
  230. response = requests.post(url, json=data)
  231. result = response.json()
  232. if result.get('errcode') == 0:
  233. openpid = result.get('openpid')
  234. return success(openpid, "获取插件用户openPid成功")
  235. else:
  236. error_msg = result.get('errmsg', '未知错误')
  237. return fail(f"获取插件用户openPid失败: {error_msg}")
  238. except Exception as e:
  239. return fail(f"获取插件用户openPid过程中发生错误: {str(e)}")
  240. @staticmethod
  241. def getUserInfo(request):
  242. openid = request.POST.get("openid")
  243. if not openid:
  244. return fail("缺少 openid 参数")
  245. try:
  246. user = WechatUser.objects.filter(openid=openid).exclude(status=4).first()
  247. if not user:
  248. return fail("未找到用户信息")
  249. user_info = {
  250. "id": user.id,
  251. "name": user.name,
  252. "nikeName": user.nikeName,
  253. "phone": user.phone,
  254. "openid": user.openid,
  255. "age": user.age,
  256. "level": user.level,
  257. "user_id": user.user_id,
  258. "id_card": user.id_card,
  259. "mini_url": user.mini_url,
  260. "examine": user.examine,
  261. "status": user.status,
  262. "source": user.source,
  263. }
  264. return success(user_info)
  265. except WechatUser.DoesNotExist:
  266. return fail("用户不存在")
  267. @staticmethod
  268. def getKbmUrl(request):
  269. openid = request.POST.get("openid")
  270. info = WechatUser.objects.filter(openid=openid).exclude(status=4).first()
  271. waibu = {}
  272. waibuurl = "http://58.246.234.210:7860/api/v1/run/2f1faff2-99df-4821-87d6-43d693084c4b?stream=false"
  273. waibutweaks = {
  274. "ChatInput-oWzMj": {
  275. "sender": info.openid,
  276. "sender_name": info.openid
  277. },
  278. "Prompt-DGa3i": {},
  279. "ChatOutput-J0jqF": {},
  280. "OllamaModel-Nu41g": {},
  281. "OllamaEmbeddings-0AfK4": {},
  282. "Milvus-48gF7": {},
  283. "Memory-KtRT7": {
  284. "session_id": info.openid
  285. },
  286. "ParseData-c9DYu": {}
  287. }
  288. waibu["url"] = waibuurl
  289. waibu["tweaks"] = waibutweaks
  290. neibu = {}
  291. neibuurl = "http://58.246.234.210:7860/api/v1/run/2f1faff2-99df-4821-87d6-43d693084c4b?stream=false"
  292. neibutweaks = {
  293. "ChatInput-dDbhW": {
  294. "sender": info.openid,
  295. "sender_name": info.openid
  296. },
  297. "Prompt-DGa3i": {},
  298. "ChatOutput-J0jqF": {},
  299. "OllamaModel-Nu41g": {},
  300. "OllamaEmbeddings-0AfK4": {},
  301. "Milvus-48gF7": {},
  302. "Memory-KtRT7": {
  303. "session_id": info.openid
  304. },
  305. "ParseData-c9DYu": {}
  306. }
  307. neibu["url"] = neibuurl
  308. neibu["tweaks"] = neibutweaks
  309. if not openid:
  310. return success(waibu, "普通用户返回外部知识库链接")
  311. if not info:
  312. return success(waibu,"普通用户返回外部知识库链接")
  313. if info.level == 1:
  314. return success(waibu, "普通用户返回外部知识库链接")
  315. return success(neibu,"内部人员返回内部知识库链接")
  316. @staticmethod
  317. @transaction.atomic
  318. def updateBackground(request):
  319. id = request.POST.get("id")
  320. wechatUser = WechatUser.objects.filter(id=id).first()
  321. if wechatUser:
  322. wechatUser.name = request.POST.get("name")
  323. wechatUser.nikeName =request.POST.get("nikeName")
  324. wechatUser.phone =request.POST.get("phone")
  325. wechatUser.openid =request.POST.get("openid")
  326. wechatUser.age =request.POST.get("age")
  327. wechatUser.level =request.POST.get("level")
  328. wechatUser.user_id =request.POST.get("user_id")
  329. wechatUser.id_card =request.POST.get("id_card")
  330. wechatUser.mini_url =request.POST.get("mini_url")
  331. wechatUser.status =request.POST.get("status")
  332. wechatUser.save()
  333. return success("修改成功")
  334. else:
  335. return fail("修改失败")