import logging import json from django.conf import settings from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest from .base import BaseSmsBackend logger = logging.getLogger(__name__) DOMESTIC_VERIFICATION_TEMPLATE_ID = 'SMS_205132276' HK_MACAO_VERIFICATION_TEMPLATE_ID = 'SMS_226416620' HK_MACAO_PHONE_PREFIXES = ('+852', '+853') def get_verification_template_id(phone): if str(phone).startswith(HK_MACAO_PHONE_PREFIXES): return HK_MACAO_VERIFICATION_TEMPLATE_ID return DOMESTIC_VERIFICATION_TEMPLATE_ID def get_aliyun_phone_number(phone): """Convert the stored E.164 number to Aliyun's country-code format.""" return str(phone).removeprefix('+') class SmsBackend(BaseSmsBackend): def __init__(self, *args, **kwargs): self.client = AcsClient( getattr(settings, 'ALIYUN_SMS_ACCESS_KEY', None), getattr(settings, 'ALIYUN_SMS_ACCESS_SECRET', None), 'cn-hangzhou' ) super(SmsBackend, self).__init__(*args, **kwargs) def send_message(self, phone, params, template_id=None): if template_id is None: template_id = get_verification_template_id(phone) try: request = CommonRequest() request.set_accept_format('json') request.set_domain('dysmsapi.aliyuncs.com') request.set_method('POST') request.set_protocol_type('https') request.set_version('2017-05-25') request.set_action_name('SendSms') request.add_query_param('RegionId', "cn-hangzhou") request.add_query_param('PhoneNumbers', get_aliyun_phone_number(phone)) request.add_query_param('SignName', "平凯星辰") request.add_query_param('TemplateCode', template_id) request.add_query_param('TemplateParam', json.dumps(params)) response = self.client.do_action(request) print(str(response, encoding='utf-8')) except Exception as e: logger.error('Aliyun Send SMS failed, {}'.format(e))