接口引擎实战:发送阿里云短信
前言
前篇文章刚介绍了【接口引擎实战:发送第三方短信】,为什么还要介绍【发送阿里云短信】?
实际情况是有些短信发送可能需要用到第三方的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吾码 - 系列文档
- 平台介绍:https://microi.blog.csdn.net/article/details/143414349
- 一键安装使用:https://microi.blog.csdn.net/article/details/143832680
- 快速开始使用:https://microi.blog.csdn.net/article/details/143607068
- 源码本地运行-后端:https://microi.blog.csdn.net/article/details/143567676
- 源码本地运行-前端:https://microi.blog.csdn.net/article/details/143581687
- Docker部署:https://microi.blog.csdn.net/article/details/143576299
- 表单引擎:https://microi.blog.csdn.net/article/details/143671179
- 模块引擎:https://microi.blog.csdn.net/article/details/143775484
- 接口引擎:https://microi.blog.csdn.net/article/details/143968454
- 工作流引擎:https://microi.blog.csdn.net/article/details/143742635
- 界面引擎:https://microi.blog.csdn.net/article/details/143972924
- 打印引擎:https://microi.blog.csdn.net/article/details/143973593
- V8函数列表-前端:https://microi.blog.csdn.net/article/details/143623205
- V8函数列表-后端:https://microi.blog.csdn.net/article/details/143623433
- V8.FormEngine用法:https://microi.blog.csdn.net/article/details/143623519
- Where条件用法:https://microi.blog.csdn.net/article/details/143582519
- DosResult说明:https://microi.blog.csdn.net/article/details/143870540
- 分布式存储配置:https://microi.blog.csdn.net/article/details/143763937
- 自定义导出Excel:https://microi.blog.csdn.net/article/details/143619083
- 表单引擎-定制组件:https://microi.blog.csdn.net/article/details/143939702
- 表单控件数据源绑定配置:https://microi.blog.csdn.net/article/details/143767223
- 复制表单和模块到其它数据库:https://microi.blog.csdn.net/article/details/143950112
- 论传统定制开发与低代码开发的优缺点:https://microi.blog.csdn.net/article/details/143866006
- 接口引擎实战-发送第三方短信:https://microi.blog.csdn.net/article/details/143990546
- 开源版、个人版、企业版区别:https://microi.blog.csdn.net/article/details/143974752
- 成为合伙人:https://microi.blog.csdn.net/article/details/143974715