阿里雲平臺發送短信

1.獲取阿里雲訪問密鑰

爲了使用短信發送API-Python SDK,您必須申請阿里雲的訪問密鑰。html

阿里雲訪問祕鑰是阿里云爲用戶使用 API(非控制檯)來訪問其雲資源設計的「安全口令」。您能夠用它來簽名 API 請求內容以經過服務端的安全驗證。python

該訪問祕鑰成對(AccessKeyId 與 AccessKeySecret)生成和使用。每一個阿里雲用戶能夠建立多對訪問祕鑰,且可隨時啓用(Active)、禁用(Inactive)或者刪除已經生成的訪問祕鑰對。json

您能夠經過阿里雲控制檯的 祕鑰管理頁面 建立、管理全部的訪問祕鑰對,且保證它處於「啓用」狀態。因爲訪問祕鑰是阿里雲對 API 請求進行安全驗證的關鍵因子,請妥善保管你的訪問祕鑰。若是某些祕鑰對出現泄漏風險,建議及時刪除該祕鑰對並生成新的替代祕鑰對。api

2.在控制檯完成模板與簽名的申請,得到調用接口必備的參數

短信簽名安全

根據用戶屬性來建立符合自身屬性的簽名信息。企業用戶須要上傳相關企業資質證實,我的用戶須要上傳證實我的身份的證實。dom

短信簽名須要審覈經過後才能夠使用。ide

短信模板ui

短信模板,即具體發送的短信內容。阿里雲

短信模板能夠支持驗證碼、短信通知、推廣短信、國際/港澳臺消息四種模式。驗證碼和短信通知,經過變量替換實現個性短信定製。推廣短信不支持在模板中添加變量。國際/港澳臺消息只能使用國際/港澳臺短信模版發送短信。編碼

短信模板須要審覈經過後才能夠使用。

3.參數列表

入參列表

參數名稱 參數類型 必填與否 樣例取值 參數說明
PhoneNumbers String 必須 15000000000 短信接收號碼。支持以逗號分隔的形式進行批量調用,批量上限爲1000個手機號碼,批量調用相對於單條調用及時性稍有延遲,驗證碼類型的短信推薦使用單條調用的方式,發送國際/港澳臺消息時,接收號碼格式爲00+國際區號+號碼,如「0085200000000」
SignName String 必須 雲通訊 短信簽名
TemplateCode String 必須 SMS_0000 短信模板ID,發送國際/港澳臺消息時,請使用國際/港澳臺短信模版
TemplateParam String 可選 {「code」:」1234」,」product」:」ytx」} 短信模板變量替換JSON串,友情提示:若是JSON中須要帶換行符,請參照標準的JSON協議對換行符的要求,好比短信內容中包含rn的狀況在JSON中須要表示成rn,不然會致使JSON在服務端解析失敗
OutId String 可選 abcdefgh 外部流水擴展字段

出參列表

出參名稱 出參類型 樣例取值 參數說明
RequestId String 8906582E-6722 請求ID
Code String OK 狀態碼-返回OK表明請求成功,其餘錯誤碼詳見錯誤碼列表
Message String 請求成功 狀態碼的描述
BizId String 134523^4351232 發送回執ID,可根據該ID查詢具體的發送狀態

3.接口的下載

  1. SDK下載
  2. 執行:

    • 安裝依賴:進入根目錄執行命令: python setup.py install #若是爲python3,請執行:python3 setup.py install
    • 修改信息:從阿里雲控制檯上獲取ACCESS_KEY_ID與ACCESS_KEY_SECRET,並填入文件const.py中
    • 運行程序:python demo_sms_send.py #若是爲python3,請執行python3 demo_sms_send.py
      pip install aliyun-python-sdk-core-v3==2.8.6,2.9版本的region_provider沒有add_endpoint屬性
    • 注意:您還須要在控制檯上申請短信模板,並將相關信息填入至文件demo_sms_send.py中

錯誤碼列表

Code 描述
OK 請求成功
isp.RAM_PERMISSION_DENY RAM權限DENY
isv.OUT_OF_SERVICE 業務停機
isv.PRODUCT_UN_SUBSCRIPT 未開通雲通訊產品的阿里雲客戶
isv.PRODUCT_UNSUBSCRIBE 產品未開通
isv.ACCOUNT_NOT_EXISTS 帳戶不存在
isv.ACCOUNT_ABNORMAL 帳戶異常
isv.SMS_TEMPLATE_ILLEGAL 短信模板不合法
isv.SMS_SIGNATURE_ILLEGAL 短信簽名不合法
isv.INVALID_PARAMETERS 參數異常
isp.SYSTEM_ERROR 系統錯誤
isv.MOBILE_NUMBER_ILLEGAL 非法手機號
isv.MOBILE_COUNT_OVER_LIMIT 手機號碼數量超過限制
isv.TEMPLATE_MISSING_PARAMETERS 模板缺乏變量
isv.BUSINESS_LIMIT_CONTROL 業務限流
isv.INVALID_JSON_PARAM JSON參數不合法,只接受字符串值
isv.BLACK_KEY_CONTROL_LIMIT 黑名單管控
isv.PARAM_LENGTH_LIMIT 參數超出長度限制
isv.PARAM_NOT_SUPPORT_URL 不支持URL
isv.AMOUNT_NOT_ENOUGH 帳戶餘額不足

注:查詢全部錯誤碼及解決辦法請點擊短信接口調用錯誤碼

4.短信發送demo

# -*- coding: utf-8 -*-
# import sys
from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
from aliyunsdkdysmsapi.request.v20170525 import QuerySendDetailsRequest
from aliyunsdkcore.client import AcsClient
import uuid
from aliyunsdkcore.profile import region_provider
from aliyunsdkcore.http import method_type as MT
from aliyunsdkcore.http import format_type as FT
import const

"""
短信業務調用接口示例,版本號:v20170525

Created on 2017-06-12

"""
# 這裏setdefaultencoding爲utf8設置默認編碼爲utf-8,可是如今可能因爲版本緣由會出錯
# try:
#     reload(sys)
#     sys.setdefaultencoding('utf8')
# except NameError:
#     pass
# except Exception as err:
#     raise err

# 注意:不要更改
REGION = "cn-hangzhou"
PRODUCT_NAME = "Dysmsapi"
DOMAIN = "dysmsapi.aliyuncs.com"

#ACCESS_KEY_ID 和ACCESS_KEY_SECRET要傳入
acs_client = AcsClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, REGION)
region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)

#這裏寫入本身的簽名和模板,後面調用就不用寫了
def send_sms(business_id, phone_numbers,template_param=None,sign_name='***',template_code='***'):
    smsRequest = SendSmsRequest.SendSmsRequest()
    # 申請的短信模板編碼,必填
    smsRequest.set_TemplateCode(template_code)

    # 短信模板變量參數
    if template_param is not None:
        smsRequest.set_TemplateParam(template_param)

    # 設置業務請求流水號,必填。
    smsRequest.set_OutId(business_id)

    # 短信簽名
    smsRequest.set_SignName(sign_name)
    
    # 數據提交方式
    # smsRequest.set_method(MT.POST)
    
    # 數據提交格式
    # smsRequest.set_accept_format(FT.JSON)
    
    # 短信發送的號碼列表,必填。
    smsRequest.set_PhoneNumbers(phone_numbers)

    # 調用短信發送接口,返回json
    smsResponse = acs_client.do_action_with_exception(smsRequest)

    # TODO 業務處理

    return smsResponse



if __name__ == '__main__':
    __business_id = uuid.uuid1()
    #print(__business_id)
    params = "{\"code\":\"12345\",\"product\":\"雲通訊\"}"
    #params = u'{"name":"wqb","code":"12345678","address":"bz","phone":"13000000000"}'
    print(send_sms(__business_id, "13000000000", params))

阿里短信發送短信時返回這個信息,以前是能夠發送的,如今阿里應該是作了限制的。若是你的短信模板類型爲「驗證碼」,發送的短信內容只能是包含字母和數字

因此當你的短信內容包含特殊符號和中文時,請把短信模板類型修改成「通知」,這裏只能新增一個模板了,由於短信模板目前沒有修改。

5.接口的調用

class SmsCodeViewset(mixins.CreateModelMixin,viewsets.GenericViewSet):
    '''
        手機驗證碼
    '''
    serializer_class = SmsSerializer

    def generate_code(self):
        """
        生成四位數字的驗證碼
        """
        str1 = ""
        for i in range(4):
            str1 += str(random.randint(0,9))
        return str1

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        # 驗證合法
        serializer.is_valid(raise_exception=True)

        mobile = serializer.validated_data["mobile"]
        code = self.generate_code()

        params = {"code":code}
        sms_status = demo_sms_send.send_sms(uuid.uuid1(),mobile,params)
        #字節轉字符串
        sms_status = sms_status.decode()
        #字符串轉字典
        sms_status = eval(sms_status)

        if sms_status["Code"] != "OK":
            return Response({
                "mobile": sms_status["Message"]
            }, status=status.HTTP_400_BAD_REQUEST)
        else:
            code_record = VerifyCode(code=code, mobile=mobile)
            code_record.save()
            return Response({
                "mobile": mobile
            }, status=status.HTTP_201_CREATED)
相關文章
相關標籤/搜索