SMSService.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import json
  2. import ssl
  3. from aliyunsdkcore.client import AcsClient
  4. from aliyunsdkcore.request import CommonRequest
  5. import random
  6. from DCbackend import settings
  7. from DCbackend.utils.common import success, fail
  8. # 在你的视图函数中使用这个方法
  9. from django.http import JsonResponse
  10. from DCbackend.utils.token import encrypt
  11. from backend.models import Admin
  12. class SMSService:
  13. # 发送短信
  14. @staticmethod
  15. def send_sms(phone_number, code):
  16. client = AcsClient(settings.oss_key_id, settings.oss_key_secret, settings.region_id)
  17. request = CommonRequest()
  18. request.set_accept_format('json')
  19. request.set_domain('dysmsapi.aliyuncs.com')
  20. request.set_method('POST')
  21. request.set_protocol_type('https')
  22. request.set_version('2017-05-25') # 更正版本号
  23. request.set_action_name('SendSms')
  24. request.add_query_param('RegionId', settings.region_id)
  25. request.add_query_param('PhoneNumbers', phone_number)
  26. request.add_query_param('SignName', settings.SignName)
  27. request.add_query_param('TemplateCode', "SMS_270860270")
  28. request.add_query_param('TemplateParam', json.dumps({"code": code}))
  29. response = client.do_action_with_exception(request)
  30. print(str(response, encoding='utf-8'))
  31. return json.loads(response)
  32. #发送验证码
  33. @staticmethod
  34. def tailPhone(request):
  35. phone = request.POST.get("phone")
  36. verification_code = ''.join(random.choices('0123456789', k=6))
  37. result = SMSService.send_sms(phone, verification_code)
  38. if result and result.get('Code') == 'OK':
  39. adminInfo = Admin.objects.filter(mobile=phone).first()
  40. if adminInfo:
  41. # 如果查询到了数据
  42. adminInfo.verification_code = verification_code
  43. adminInfo.save()
  44. return success("验证码发送成功")
  45. else:
  46. return fail("查无此人")
  47. else:
  48. return fail("验证码发送失败")
  49. #校验验证码
  50. @staticmethod
  51. def codeCheckout(request):
  52. phone = request.POST.get("phone")
  53. verification_code = request.POST.get("verification_code")
  54. admin_exists = Admin.objects.filter(mobile=phone,verification_code = verification_code).exists()
  55. if admin_exists:
  56. return success("验证成功")
  57. else:
  58. return fail("验证失败,请检查验证码和手机号")
  59. #修改密码
  60. @staticmethod
  61. def updatePassword(request):
  62. newPassword1 = request.POST.get("new_password1")
  63. newPassword2 = request.POST.get("new_password2")
  64. phone = request.POST.get("phone")
  65. if newPassword1 == newPassword2:
  66. newPassword = newPassword1
  67. adminInfo = Admin.objects.filter(mobile=phone).first()
  68. if adminInfo:
  69. adminInfo.password = encrypt(newPassword)
  70. adminInfo.verification_code = ""
  71. adminInfo.save()
  72. return success("修改成功")
  73. else:
  74. return fail("修改失败")
  75. else:
  76. return fail("两次密码不相同")
  77. #获取模版列表
  78. @staticmethod
  79. def get_aliyun_sms_templates(access_key_id, access_key_secret, region_id=settings.region_id, page_size=10, page_index=1):
  80. """
  81. 获取阿里云短信模板列表
  82. :param access_key_id: 阿里云访问密钥ID
  83. :param access_key_secret: 阿里云访问密钥密码
  84. :param region_id: 地域ID,默认为上海
  85. :param page_size: 每页显示的模板数量
  86. :param page_index: 页码
  87. :return: 短信模板列表
  88. """
  89. client = AcsClient(access_key_id, access_key_secret, region_id)
  90. request = CommonRequest()
  91. request.set_accept_format('json')
  92. request.set_domain('dysmsapi.aliyuncs.com')
  93. request.set_method('POST')
  94. request.set_protocol_type('https')
  95. request.set_version('2017-05-25')
  96. request.set_action_name('QuerySmsTemplateList') # 修改为正确的Action名称
  97. request.add_query_param('PageSize', page_size)
  98. request.add_query_param('PageIndex', page_index)
  99. response = client.do_action_with_exception(request)
  100. response_json = json.loads(response)
  101. return response_json
  102. @staticmethod
  103. def getTemplates(request):
  104. page_size = int(request.GET.get('page_size', 10))
  105. page_index = int(request.GET.get('page_index', 1))
  106. templates = SMSService.get_aliyun_sms_templates(
  107. settings.oss_key_id,
  108. settings.oss_key_secret,
  109. page_size=page_size,
  110. page_index=page_index
  111. )
  112. return JsonResponse(templates)
  113. @staticmethod
  114. def getSMScount(request):
  115. return success(SMSService.get_aliyun_sms_remaining())
  116. @staticmethod
  117. def get_aliyun_sms_remaining():
  118. # 创建AcsClient实例
  119. client = AcsClient(settings.oss_key_id, settings.oss_key_secret, settings.region_id)
  120. # 创建request,并设置参数
  121. request = CommonRequest()
  122. request.set_accept_format('json')
  123. request.set_domain('dysmsapi.aliyuncs.com')
  124. request.set_method('POST')
  125. request.set_protocol_type('https')
  126. request.set_version('2017-05-25')
  127. request.set_action_name('QuerySendDetails')
  128. # 设置业务参数
  129. request.add_query_param('PhoneNumber', '1234567890') # 示例手机号
  130. request.add_query_param('SendDate', '20230101') # 示例日期
  131. request.add_query_param('PageSize', '1')
  132. request.add_query_param('CurrentPage', '1')
  133. # 发起请求并获取响应
  134. response = client.do_action_with_exception(request)
  135. # 解析响应
  136. import json
  137. result = json.loads(response)
  138. # 获取剩余短信数量
  139. remaining_count = result.get('TotalCount', 0)
  140. return result