微信小程序,开通腾讯云短信服务与使用(基于python)

准备工作

1.注册腾讯云,开通腾讯云短信服务(1>租一个域名 2>买/租一个服务器 3>服务器上放你的代码 4>你的域名跟服务器公网的地址进行解析 5>访问域名进入程序里面)

https://cloud.tencent.com/product/sms

 

2.创建应用

 

SDK AppID = 1400449667

 

 

3.申请签名

 需要注意的是,申请签名,用公众号(我是用的个人订阅号,换一个邮箱注册就行)

 

ID = 325617     内容:喜欢土豆的马铃薯

 

4.申请模板

 

ID = 776071     名称:登录验证


5.申请腾讯云API https://console.cloud.tencent.com/cam/capi
  保存记录 
   
SecretId 和 SecretKey


-----------------------------------------------------------------------------------------------------------------------------------------
上述步骤完成后,调用相关接口,完成短信发送(SDK,腾讯帮你写好的工具)
安装SDK python: pip3 install tencentcloud-sdk-python
相关代码 https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/sms/v20190711/SendSms.py
class MessageView(APIView):
    def get(self,request,*args,**kwargs):
        # 1.获取微信小程序,发过来的手机号
        phone = request.query_params
        print(phone)

        # 2.第二次手机格式校验(防止网页传输过来的数据,不经过微信小程序的校验 http://127.0.0.1:8000/api/message/?phone=123)
        # # 第一种校验:正则匹配
        # import re
        # if not re.match(r"^(1[3|4|5|6|7|8|9])\d{9}$",phone):
        #     # 当手机格式不匹配,返回错误信息,后续操作不再进行
        #     return Response("手机号格式错误...")
        # # 第二种校验:序列化器serializers
        ser = MessageSerializer(data=phone)     # 当前获取到的手机号传到序列化器
        if not ser.is_valid():
            # 序列化器内部会进行校验,当不符合规则时
            print("手机号验证未通过,格式错误...")
            return Response({"status":False,"message":"手机号格式错误"})
        # 验证通过,保存手机号
        phone = ser.validated_data.get("phone")
        print("手机号验证通过:",phone)

        # 3.生成随机验证码
        import random
        random_code = random.randint(1000,9999)

        # 4.验证码发送到手机上,购买服务器进行发送短信:腾讯云
        # tencent.send_message(phone,random_code)
        """
        准备工作
        4.1 注册腾讯云,开通腾讯云短信服务(1>租一个域名 2>买/租一个服务器 3>服务器上放你的代码 4>你的域名跟服务器公网的地址进行解析 5>访问域名进入程序里面)
        4.2 创建应用
            SDK AppID = 1400449667
        4.3 申请签名
            个人:公众号    ID = 325617     内容:喜欢土豆的马铃薯
        4.4 申请模板
            ID = 776071     名称:登录验证
        4.5 申请腾讯云API    https://console.cloud.tencent.com/cam/capi
            SecretId = AKIDzlk9qGmSAblmoa8Olsra9SUG8aqqLGhM           SecretKey = Z4K8gybz7zggRt6244nFRjlX7SWKsSnJ
        """
        # 上述步骤完成后,调用相关接口,完成短信发送(SDK,腾讯帮你写好的工具)
        # 安装SDK python: pip3 install tencentcloud-sdk-python
        # 相关代码 https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/sms/v20190711/SendSms.py
        from tencentcloud.common import credential
        from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
        from tencentcloud.sms.v20190711 import sms_client, models
        from tencentcloud.common.profile.client_profile import ClientProfile
        from tencentcloud.common.profile.http_profile import HttpProfile
        try:
            # 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。
            # 这里我没有传我自己的,需要自己输入
            cred = credential.Credential("secretId", "secretKey")
            # 实例化要请求产品(以sms为例)的client对象
            client = sms_client.SmsClient(cred, "ap-guangzhou")
            # 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
            req = models.SendSmsRequest()
            # 短信应用ID: 短信SdkAppid在 [短信控制台] 添加应用后生成的实际SdkAppid
            req.SmsSdkAppid = "1400449667"
            # 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看
            req.Sign = "喜欢土豆的马铃薯"
            # 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
            # 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号
            req.PhoneNumberSet = ["+8615798017910"]
            # 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看
            req.TemplateID = "776071"
            # 模板参数: 若无模板参数,则设置为空
            req.TemplateParamSet = [str(random_code)]
            # 通过client对象调用DescribeInstances方法发起请求。注意请求方法名与请求对象是对应的。返回的resp是一个DescribeInstancesResponse类的实例,与请求对象对应。
            resp = client.SendSms(req)
            # 输出json格式的字符串回包
            print(resp.to_json_string(indent=2))
        except TencentCloudSDKException as err:
            print(err)
        except Exception as e:
            print(e)


        # 5.把验证码和手机号保留(30秒过期)
        # # # 5.1 搭建redis服务器(腾讯云Redis)这里选择自己搭建
        # import redis
        # # redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。
        # # 默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
        # pool = redis.ConnectionPool(host='127.0.0.1', port=8000)
        # conn = redis.Redis(connection_pool=pool)
        # conn.set(phone, random_code,ex=30)
        # conn.get('foo')
        # # 5.2 django中方便使用redis的模块 django-redis(cmd pip3 install django-redis)
        from django_redis import get_redis_connection
        conn = get_redis_connection()
        conn.set(phone,random_code,ex=30)

        print("正在发送验证码...")
        return Response({"status":True,"message":"验证码发送成功"})
    

需要注意:
搭建redis服务器(腾讯云Redis)这里选择自己搭建
# 配置,Redis缓存(依赖:pip3 install django-redis)
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:8000",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "密码",
        }
    }
}

 


 



 

posted @ 2020-11-13 14:24  马铃薯1  阅读(1233)  评论(0编辑  收藏  举报