def send_sms_code(mobile, sms_num, expires, temp_id): try: result = CCP().send_template_sms(mobile, [sms_num, expires], temp_id) except Exception as e: logger.error('发送验证码短信异常[mobile:%s message: %s]' % (mobile, e)) else: if result == 0: logger.info("发送验证码短信[正常][ mobile: %s sms_code: %s]" % (mobile, sms_num)) else: logger.warning("发送验证码短信[失败][ mobile: %s ]" % mobile)
def send_sms_code(mobile, sms_num, expires, temp_id): try: result = CCP().send_template_sms(mobile, [sms_num, expires], temp_id) except Exception as e: logger.error('发送短信异常[mobile : %s message: %s]' % (mobile, e)) else: if result == 0: logger.info('发送短信验证码成功[mobile : %s sms_code: %s]' % (mobile, sms_num)) else: logger.warning('发送短信失败 mobile: {}'.format(mobile))
def send_sms_code(mobile, sms_num, expires, temp_id): try: result = CCP().send_template_sms(mobile, [sms_num, expires], temp_id) except Exception as e: logger.error('发送短信异常[mobile:%s message:%s]' % (mobile, e)) # return to_json_data(errno=Code.SMSERROR, errmsg=error_map[Code.SMSERROR]) else: if result == 0: logging.info('发送短信验证码成功[mobile:%s,sms_num:%s]' % (mobile, sms_num)) # return to_json_data(errmsg='短信验证码发送成功') else: logging.info('发送短信验证码失败')
def get(self, request, mobile): redis = get_redis_connection("sms_codes") # 获取短信发送间隔 try: interval = redis.get("%s_interval" % mobile) if interval: print(interval) return JsonResponse({'result': '-1'}) except: pass ccp = CCP() sms_codes = "%04d" % random.randint(1, 9999) result = ccp.send_template_sms(mobile, [sms_codes, 5], 1) if not result: """发送成功""" redis.setex("%s_sms_codes" % mobile, 5 * 60, sms_codes) # 这里的值不重要,重要的是这个变量是否在redis被查找到 redis.setex("%s_interval" % mobile, 60, 1) return JsonResponse({"result": result})
def sms_captcha(request): """ 生成短信验证码 :param request: :return: """ telephone = request.GET.get('telephone') sms_code = "%06d" % random.randint(0,999999) print('短信验证码: %s' % sms_code) cache.set(telephone, sms_code, 5*60) print(cache.get(telephone)) ccp = CCP() # result = ccp.send_template_sms(telephone, [sms_code, 5*60], 1) return restful.ok(message='短信验证码发送成功!')
def send_sms_code(mobile, sms_num, expires, temp_id): """ 发送短信验证码 :param mobile: 手机号 :param sms_num: 验证码 :param expires: 有效期 :return: None """ try: result = CCP().send_template_sms(mobile, [sms_num, expires], temp_id) except Exception as e: logger.error("发送验证码短信[异常][ mobile: %s, message: %s ]" % (mobile, e)) else: if result == 0: logger.info("发送验证码短信[正常][ mobile: %s sms_code: %s]" % (mobile, sms_num)) else: logger.warning("发送验证码短信[失败][ mobile: %s ]" % mobile)
def post(self, request): json_str = request.body if not json_str: return to_json_data(errno=Code.PARAMERR, errmsg='参数为空,请重新输入') # json字符串转字典 dict_data = json.loads(json_str.decode('utf8')) #2、校验参数 forms.py form = forms.CheckImgCodeForm(data=dict_data) if form.is_valid(): # 获取手机号 mobile = form.cleaned_data.get('mobile') # 3、 # 创建短信验证码内容 sms_num = "%06d" % random.randint(0, 999999) # 将短信验证码保存到数据库 # 确保settings.py文件中有配置redis CACHE # Redis原生指令参考 http://redisdoc.com/index.html # Redis python客户端 方法参考 http://redis-py.readthedocs.io/en/latest/#indices-and-tables # 4、 conn_redis = get_redis_connection(alias='verify_codes') # 创建一个在60s以内是否有发送短信记录的标记 sms_flag_fmt = "sms_flag_{}".format(mobile).encode('utf8') # 创建保存短信验证码的标记key sms_text_fmt = "sms_{}".format(mobile).encode('utf8') pl = conn_redis.pipeline() # 此处设置为True会出现bug try: pl.setex(sms_flag_fmt, constants.SEND_SMS_CODE_INTERVAL, 1) pl.setex(sms_text_fmt, constants.SMS_CODE_REDIS_EXPIRES, sms_num) # 让管道通知redis执行命令 pl.execute() except Exception as e: logger.debug("redis 执行出现异常:{}".format(e)) return to_json_data(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR]) logger.info("SMS code: {}".format(sms_num)) # 发送短语验证码 try: result = CCP().send_template_sms( mobile, [sms_num, constants.SMS_CODE_REDIS_EXPIRES], constants.SMS_CODE_TEMP_ID) except Exception as e: logger.error("发送验证码短信[异常][ mobile: %s, message: %s ]" % (mobile, e)) return to_json_data(errno=Code.SMSERROR, errmsg=error_map[Code.SMSERROR]) else: if result == 0: logger.info("发送验证码短信[正常][ mobile: %s sms_code: %s]" % (mobile, sms_num)) return to_json_data(errno=Code.OK, errmsg="短信验证码发送成功") else: logger.warning("发送验证码短信[失败][ mobile: %s ]" % mobile) return to_json_data(errno=Code.SMSFAIL, errmsg=error_map[Code.SMSFAIL])
def post(self, request): ''' - 发送短信 - 保存这个短信验证码(保存在哪里?) - 保存发送记录 :param request: :return: ''' form = CheckImageForm(request.POST, request=request) if form.is_valid(): # success # 获取手机号码 mobile = form.cleaned_data.get('mobile') # 生成短信验证码 sms_code = ''.join([ random.choice('0123456789') for _ in range(constants.SMS_CODE_LENGTH) ]) # 发送短信验证码,调用接口 # .......... # 保存发送记录 # logger.info('发送短信验证码[正常][mobile: %s sms_code: %s]' % (mobile,sms_code)) ccp = CCP() try: res = ccp.send_template_sms( mobile, [sms_code, constants.SMS_CODE_EXPIRES], "1") if res == 0: logger.info('发送短信验证码[正常][mobile: %s sms_code: %s]' % (mobile, sms_code)) else: logger.error('发送短信验证码[失败][moblie: %s sms_code: %s]' % (mobile, sms_code)) return json_response(errno=Code.SMSFAIL, errmsg=error_map[Code.SMSFAIL]) except Exception as e: logger.error('发送短信验证码[异常][mobile: %s message: %s]' % (mobile, e)) return json_response(errno=Code.SMSERROR, errmsg=error_map[Code.SMSERROR]) # 保存这个验证码 这里有个时限的问题 # 两种方案:1、session 2、redis (不保存在MySQL是因为MySQL效率太低) # 但session的时限是统一设置的,这里如果重新设置时限,会把前面的session覆盖,因此排除session方案,用redis保存验证码 # request.session['sms_code'] = sms_code # request.session.set_expiry # 60秒记录 # 5分钟有效 # 创建短信验证码发送记录的key sms_flag_key = 'sms_flag_{}'.format(mobile) # 创建短信验证码内容的key sms_text_key = 'sms_text_{}'.format(mobile) redis_coon = get_redis_connection(alias='verify_codes') # 创建一个管道 pl = redis_coon.pipeline() try: pl.setex(sms_flag_key, constants.SMS_CODE_INTERVAL, 1) pl.setex(sms_text_key, constants.SMS_CODE_EXPIRES * 60, sms_code) # 让管道通知redis执行命令 pl.execute() return json_response(errmsg='短信验证码发送成功') except Exception as e: logger.error('redis 执行异常, {}'.format(e)) return json_response(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR]) else: # fail # 将表单的报错信息进行拼接 err_msg_list = [] for item in form.errors.values(): # item是一个列表, err_msg_list.append(item[0]) err_msg_str = '/'.join(err_msg_list) return json_response(errno=Code.PARAMERR, errmsg=err_msg_str)