开源低代码平台-Microi吾码-接口引擎实战:发送阿里云短信

前言

前篇文章刚介绍了【接口引擎实战:发送第三方短信】,为什么还要介绍【发送阿里云短信】?

实际情况是有些短信发送可能需要用到第三方的SDK包,这时候您可能需要定制开发并且封装V8函数,此文就是博主封装了一个V8.Sms.Send()函数用于发送阿里云短信(接口引擎支持任意二次开发封装扩展)

在这里插入图片描述

接口引擎V8代码

var needCaptcha = false;
//var apiAddress = 'https://dysmsapi.aliyuncs.com/';
if(!V8.Param.Phone || V8.Param.Phone.length != 11){
  V8.Result = { Code : 0, Msg : '手机号错误!' }; return;
}
if(needCaptcha && !V8.Param._CaptchaId){
  V8.Result = { Code : 0, Msg : '未获取图形验证码!' }; return;
}
if(needCaptcha && !V8.Param._CaptchaValue){
  V8.Result = { Code : 0, Msg : '未填写图形验证码!' }; return;
}
if(needCaptcha){
  //暂时通过直接操作Cache判断验证码是否正确
  //_CaptchaId格式:DefaultRedis:jsnzk:Captcha:b3b9b9e0-00be-483c-a3da-f3b23699c9e7
  var captchaRedisValue = V8.Cache.HashGet(`DefaultRedis:${V8.Param._CaptchaId}`, 'data');
  if(captchaRedisValue == null){
    V8.Result = { Code : 0, Msg : '不存在的图形验证码或图形验证码已失效!' }; return;
  }
  if(captchaRedisValue != V8.Param._CaptchaValue){
    V8.Result = { Code : 1004, Msg : '图形验证码错误!' }; return;
  }
}

//生成短信验证码。5分钟内没必要重新生成,直接发送之前的。
var smsCode = V8.Cache.Get('SmsCaptcha:' + V8.Param.Phone);
if(!smsCode){
  smsCode = Math.floor(Math.random() * 10000).toString();
  if(smsCode.length == 3){
    smsCode = smsCode + '0';
  }
}
//判断30秒内不能重复发送短信
var smsCodeTime = parseInt(V8.Cache.Get('SmsCaptcha:' + V8.Param.Phone + 'time'));
var timeChang = (parseInt(new Date().getTime() / 1000) - smsCodeTime);
if(smsCodeTime && timeChang < 30){
  V8.Result = { Code : 0, Msg : `请[${30 - timeChang}]秒后重试!` };
  return;
}
var postParam = {
  SignName : '注册验证',
  AccessKeyId : V8.SysConfig.SmsKey,
  AccessKeySecret : V8.SysConfig.SmsSecret,
  TemplateCode : 'SMS_7870004',//验证码${code},您正在注册成为${product}用户,感谢您的支持!
  PhoneNumbers : V8.Param.Phone,//发信发送的目的号码.多个号码之间用半角逗号隔开 
  TemplateParam : `{ "code" : "${smsCode}", "product" : "[乐磊商行]" }`,
};
var result = V8.Sms.Send(postParam);
//如果发送成功:将验证码缓存起来
if(result.Code){
  V8.Cache.Set('SmsCaptcha:' + V8.Param.Phone, smsCode, '00:10:00');
  V8.Cache.Set('SmsCaptcha:' + V8.Param.Phone + 'time', (new Date().getTime() / 1000).toString(), '00:10:00');
}
//清除图形验证码缓存
//V8.Cache.HashRemove(`DefaultRedis:${V8.Param._CaptchaId}`);
V8.Result = result;

封装扩展V8函数代码

using System;
using System.Collections.Generic;
using AlibabaCloud.TeaUtil.Models;
using Dos.Common;
using Tea;

namespace Microi.net
{
    /// <summary>
    /// 
    /// </summary>
    public class SmsAliyun : ISms
	{
      
        /// <summary>
        /// 使用AK&SK初始化账号Client
        /// </summary>
        /// <param name="accessKeyId"></param>
        /// <param name="accessKeySecret"></param>
        /// <returns></returns>
        public static AlibabaCloud.SDK.Dysmsapi20170525.Client CreateClient(string accessKeyId, string accessKeySecret)
        {
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
            {
                // 必填,您的 AccessKey ID
                AccessKeyId = accessKeyId,
                // 必填,您的 AccessKey Secret
                AccessKeySecret = accessKeySecret,
            };
            // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
            config.Endpoint = "dysmsapi.aliyuncs.com";
            return new AlibabaCloud.SDK.Dysmsapi20170525.Client(config);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public DosResult Send(SmsParam param)
        {
            // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378671.html
            AlibabaCloud.SDK.Dysmsapi20170525.Client client = CreateClient(param.AccessKeyId, param.AccessKeySecret);
            AlibabaCloud.SDK.Dysmsapi20170525.Models.SendSmsRequest sendSmsRequest = new AlibabaCloud.SDK.Dysmsapi20170525.Models.SendSmsRequest();
            RuntimeOptions runtime = new RuntimeOptions();
            // 忽略证书校验
            runtime.IgnoreSSL = true;
            sendSmsRequest.PhoneNumbers = param.PhoneNumbers;
            sendSmsRequest.SignName = param.SignName;
            sendSmsRequest.TemplateCode = param.TemplateCode;
            sendSmsRequest.TemplateParam = param.TemplateParam;
            sendSmsRequest.OutId = param.OutId;
            sendSmsRequest.SmsUpExtendCode = param.SmsUpExtendCode;
            sendSmsRequest.PhoneNumbers = param.PhoneNumbers;
            try
            {
                // 复制代码运行请自行打印 API 的返回值
                var result = client.SendSmsWithOptions(sendSmsRequest, runtime);
                return new DosResult(1, result);
            }
            catch (TeaException error)
            {
                // 如有需要,请打印 error
                var errorResult = AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
                return new DosResult(0, null, errorResult);
            }
            catch (Exception _error)
            {
                TeaException error = new TeaException(new Dictionary<string, object>
                {
                    { "message", _error.Message }
                });
                // 如有需要,请打印 error
                var errorResult = AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
                return new DosResult(0, null, errorResult);
            }
        }
    }
}

Microi吾码 - 系列文档

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值