短信
功能介绍#
短信插件抽象处理认证过程中如手机验证码/通知等短信发送需求过程,以便于开发者通过重载函数方式接入各大厂商提供的短信服务
实现思路#
开发者在开发短信插件时,仅需继承短信插件基类并重载send_sms函数即可,处理流程如下:
sequenceDiagram
    participant C as 平台核心
    participant B as 短信插件
    C->>B: 加载插件
    B->>C: 注册监听短信事件
    rect rgb(191, 223, 255)
    C->>B: 发出发送短信事件(SEND_SMS)
    B->>C: 相应事件并根据自身配置发送短信,返回结果(成功/失败)
    end
抽象函数#
基类定义#
        
arkid.core.extension.sms.SmsExtension            (Extension)
        
#
    Source code in arkid/core/extension/sms.py
          class SmsExtension(Extension):
    TYPE = "sms"
    @property
    def type(self):
        return SmsExtension.TYPE
    def load(self):
        self.listen_event(SEND_SMS, self.event_send_sms)
        super().load()
    def event_send_sms(self,event,**kwargs):
        """ 发送短信时间
        Args:
            event (Event): 事件
        事件数据(event.data)结构说明:
            ``` json
            {
                "config_id": "xxxx", # 必传,插件运行时配置ID
                "mobile": "xxxx", # 必传,电话号码
                "code": "xxxx", # 非必传,验证码
                "areacode": "xxxx", # 非必传,区号
                "username": "xxxx" # 非必传,用户名
                ...
            }
            ```
        Returns:
            发送短信结果
        """
        if event.packages == self.package or self.package in event.packages:
            return self.send_sms(event,**kwargs)
    @abstractmethod   
    def send_sms(self, event:Event, **kwargs):
        """ 发送短信
        Args:
            event (Event): 事件
        """
        pass
event_send_sms(self, event, **kwargs)
#
    发送短信时间
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| event | Event | 事件 | required | 
事件数据(event.data)结构说明:
{
    "config_id": "xxxx", # 必传,插件运行时配置ID
    "mobile": "xxxx", # 必传,电话号码
    "code": "xxxx", # 非必传,验证码
    "areacode": "xxxx", # 非必传,区号
    "username": "xxxx" # 非必传,用户名
    ...
}
Returns:
| Type | Description | 
|---|---|
| 发送短信结果 | 
Source code in arkid/core/extension/sms.py
          def event_send_sms(self,event,**kwargs):
    """ 发送短信时间
    Args:
        event (Event): 事件
    事件数据(event.data)结构说明:
        ``` json
        {
            "config_id": "xxxx", # 必传,插件运行时配置ID
            "mobile": "xxxx", # 必传,电话号码
            "code": "xxxx", # 非必传,验证码
            "areacode": "xxxx", # 非必传,区号
            "username": "xxxx" # 非必传,用户名
            ...
        }
        ```
    Returns:
        发送短信结果
    """
    if event.packages == self.package or self.package in event.packages:
        return self.send_sms(event,**kwargs)
load(self)
#
    
  
send_sms(self, event, **kwargs)
#
    
  示例#
        
extension_root.com_longgui_sms_aliyun.AliyunSMSExtension            (SmsExtension)
        
#
    Source code in extension_root/com_longgui_sms_aliyun/__init__.py
          class AliyunSMSExtension(SmsExtension):
    def load(self):
        self.register_settings_schema(SettingsSchema)
        self.register_config_schema(ConfigSchema)
        super().load()
    def send_sms(self, event, **kwargs):
        tenant = event.tenant
        config_id = event.data.pop("config_id")
        mobile = event.data.pop("mobile")
        template_params = {}
        settings = self.get_settings(tenant)
        settings = SimpleNamespace(**settings.settings)
        config = self.get_config_by_id(config_id).config
        for key in config.get("template_params",["code"]):
            template_params[key] = event.data.get(key,"")
        template_params = json.dumps(template_params)
        config = SimpleNamespace(**config)
        aliyun_config = models.Config(
            # 您的AccessKey ID,
            access_key_id=settings.access_key_id,
            # 您的AccessKey Secret,
            access_key_secret=settings.access_key_secret,
            # 地域ID
            region_id=settings.region_id or None,
            # 访问的域名
            endpoint=settings.endpoint or None,
        )
        client = Client(aliyun_config)
        send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
            phone_numbers=mobile,
            sign_name=config.sign_name,
            template_code=config.template_code,
            template_param=template_params,
            sms_up_extend_code=config.sms_up_extend_code or None,
            out_id=config.out_id or None,
        )
        res = client.send_sms(send_sms_request)
        return res.body.to_map()
load(self)
#
    
  
send_sms(self, event, **kwargs)
#
    发送短信
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| event | Event | 事件 | required | 
Source code in extension_root/com_longgui_sms_aliyun/__init__.py
          def send_sms(self, event, **kwargs):
    tenant = event.tenant
    config_id = event.data.pop("config_id")
    mobile = event.data.pop("mobile")
    template_params = {}
    settings = self.get_settings(tenant)
    settings = SimpleNamespace(**settings.settings)
    config = self.get_config_by_id(config_id).config
    for key in config.get("template_params",["code"]):
        template_params[key] = event.data.get(key,"")
    template_params = json.dumps(template_params)
    config = SimpleNamespace(**config)
    aliyun_config = models.Config(
        # 您的AccessKey ID,
        access_key_id=settings.access_key_id,
        # 您的AccessKey Secret,
        access_key_secret=settings.access_key_secret,
        # 地域ID
        region_id=settings.region_id or None,
        # 访问的域名
        endpoint=settings.endpoint or None,
    )
    client = Client(aliyun_config)
    send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
        phone_numbers=mobile,
        sign_name=config.sign_name,
        template_code=config.template_code,
        template_param=template_params,
        sms_up_extend_code=config.sms_up_extend_code or None,
        out_id=config.out_id or None,
    )
    res = client.send_sms(send_sms_request)
    return res.body.to_map()