zyf 04 短信验证 - nuanxin1111/react GitHub Wiki

封装

短信验证我们用的是畅卓短信接口。文档中给的说明已经很详细了,需要的只是做一下简单的封装。 class_libs/message_api.py

def message_api(urlstr, data):
    ''' 
    短信接口api
    入参:url(字符串)和data(字典)
    '''
    headers={'Content-Type': 'application/x-www-form-urlencoded'}
    r = requests.post(urlstr, data=data, headers=headers)

    return r.text.encode('utf-8')

短信url采用的是post请求,因此在这里做一个函数,每次根据传递的url和data不同,从而返回不同的xml类型字符串。我们需要做的是对这些xml字符串进行dom分析,取出节点值,然后根据文档说明,根据我们的业务进行处理。 class_libs/message.py

import xml.dom.minidom
from message_api import message_api
    
class MessageObj(object):
    def __init__(self):
        super(MessageObj, self).__init__()
        #self.__uerid = ''  #企业id
        self.__account = '' #账号
        self.__password = '' #密码

    def send_message(self, phone_number, verification_code):
        ''' 
        函数功能是向用户发送验证码
        传参:要发送的用户的手机号码和 验证码
        返回值说明:
        return_status 返回状态值,成功返回Success,失败返回Faild
        message 返回信息(返回的是返回信息提示字符串,没有编号)
            返回信息提示    说明
            1.ok  提交成功
            2.用户名或密码不能为空    提交的用户名或密码为空
            3.发送内容包含sql注入字符     包含sql注入字符
            4.用户名或密码错误    表示用户名或密码错误
            5.短信号码不能为空    提交的被叫号码为空
            6.短信内容不能为空    发送内容为空
            7.包含非法字符  表示检查到不允许发送的非法字符
            8.对不起,您当前要发送的量大于您当前余额  当支付方式为预付费是检查到账户余额不足
            9.其他错误    其他数据库操作方面的错误
        remain_point 返回余额
        task_id     返回本次任务的序列ID
        success_count 返回成功短信数
        '''

        url = 'http://sms.chanzor.com:8001/sms.aspx'
        data = {}
        data['account'] = self.__account #用户名
        data['password'] = self.__password #密码
        data['mobile'] = phone_number #要发送的用户手机号
        data['content'] = '欢迎您注册暖心医疗帐号,您的验证码'+verification_code+',请勿泄漏验证码。【暖心医疗】' #发送内容
        data['action'] = 'send'

        return_value = message_api(url, data) #调用接口,content是一个xml格式的字符串


        dom = xml.dom.minidom.parseString(return_value)

        return_status = dom.getElementsByTagName('returnstatus')[0].firstChild.data
        message = dom.getElementsByTagName('message')[0].firstChild.data
        remain_point = dom.getElementsByTagName('remainpoint')[0].firstChild.data
        try:
            task_id = dom.getElementsByTagName('taskID')[0].firstChild.data
        except:
            task_id = ''
            print 'wrong phone number'
        success_counts = dom.getElementsByTagName('successCounts')[0].firstChild.data
        context_dict = {'return_status':return_status, 'message':message, 'remain_point':remain_point, 'task_id':task_id, 'success_counts':success_counts}
        return context_dict

注释已经非常详细了,我们对节点进行解析,把返回值封装好给业务层,供调用。

使用

在患者端注册的时候使用了发送短信


        mes_obj = MessageObj()  #实例化发送短信的对象
        context_dict = mes_obj.send_message(tel, very_code) #发送短信

        if context_dict['return_status'] == 'Success': #发送成功
            try:
                mes_verify = CMsgVerify(tel=tel, ip=ip, token=very_code, end=endtime)
                mes_verify.save()
            except:
                logger.info('mes_verify.save() error at patient.views.mes_ajax')
            else:
                return HttpResponse('success')
        else:
            return HttpResponse('你输入的信息有误,请重试')

使用起来非常简单,我们只需要实例化MessageObj对象,然后调用方法就行了,然后根据返回值进行业务逻辑处理。

短信模板使用需要去短信管理后台申请,申请了之后我们可以用自己想要的内容替换掉模板中的变量,这里我们是发送验证码,其他类似。