社恐晚期 发表于 2024-9-8 14:29:55

第18篇 .net使用RabbitMQ实现短信密码重置

在 C# 中使用 RabbitMQ 通过短信发送重置后的密码到用户的手机号上,你可以按照以下步骤进行

1.安装 RabbitMQ 客户端库

首先,确保你已经安装了 RabbitMQ 客户端库。你可以通过 NuGet 包管理器来安装:
dotnet add package RabbitMQ.Client2.创建 RabbitMQ 连接和通道

创建一个 RabbitMQ 连接和通道,用于发送消息。
using RabbitMQ.Client;
using System;
using System.Text;

public class RabbitMQHelper
{
    private readonly string _hostName;
    private readonly string _userName;
    private readonly string _password;
    private readonly string _queueName;

public RabbitMQHelper(string hostName, string userName, string password, string queueName)
{
    _hostName = hostName;
    _userName = userName;
    _password = password;
    _queueName = queueName;
}

public void SendMessage(string message)
{
    var factory = new ConnectionFactory()
    {
      HostName = _hostName,
      UserName = _userName,
      Password = _password
    };

    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
      channel.QueueDeclare(queue: _queueName,
                           durable: false,
                           exclusive: false,
                           autoDelete: false,
                           arguments: null);

      var body = Encoding.UTF8.GetBytes(message);

      channel.BasicPublish(exchange: "",
                           routingKey: _queueName,
                           basicProperties: null,
                           body: body);

      Console.WriteLine($" Sent {message}");
    }
}
}3.创建短信发送服务

创建一个短信发送服务,用于处理从 RabbitMQ 接收到的消息并发送短信。
public class SmsService
{
    public void SendSms(string phoneNumber, string message)
    {
      // 在这里实现短信发送逻辑
      Console.WriteLine($"Sending SMS to {phoneNumber}: {message}");
    }
}4.创建 RabbitMQ 消费者

创建一个 RabbitMQ 消费者,用于从队列中接收消息并调用短信发送服务。
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

public class RabbitMQConsumer
{
private readonly string _hostName;
private readonly string _userName;
private readonly string _password;
private readonly string _queueName;
private readonly SmsService _smsService;

public RabbitMQConsumer(string hostName, string userName, string password, string queueName, SmsService smsService)
{
    _hostName = hostName;
    _userName = userName;
    _password = password;
    _queueName = queueName;
    _smsService = smsService;
}

public void StartConsuming()
{
    var factory = new ConnectionFactory()
    {
      HostName = _hostName,
      UserName = _userName,
      Password = _password
    };

    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
      channel.QueueDeclare(queue: _queueName,
                           durable: false,
                           exclusive: false,
                           autoDelete: false,
                           arguments: null);

      var consumer = new EventingBasicConsumer(channel);
      consumer.Received += (model, ea) =>
      {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            var phoneNumber = "user_phone_number"; // 从消息中解析出手机号
            _smsService.SendSms(phoneNumber, message);
      };

      channel.BasicConsume(queue: _queueName,
                           autoAck: true,
                           consumer: consumer);

      Console.WriteLine(" Press to exit.");
      Console.ReadLine();
    }
}
}5.集成到用户密码重置流程

在你的用户密码重置流程中,生成新的密码并将其发送到 RabbitMQ 队列。
public class UserService
{
private readonly RabbitMQHelper _rabbitMQHelper;

public UserService(RabbitMQHelper rabbitMQHelper)
{
    _rabbitMQHelper = rabbitMQHelper;
}

public void ResetPassword(Guid userId)
{
    // 生成新的密码
    string newPassword = GeneratePassword();

    // 将新密码发送到 RabbitMQ 队列
    string message = $"Your new password is: {newPassword}";
    _rabbitMQHelper.SendMessage(message);

    // 其他逻辑,例如更新数据库中的密码
}

private string GeneratePassword()
{
    // 生成随机密码的逻辑
    return "random_password";
}
}6.启动 RabbitMQ 消费者

在应用程序启动时,启动 RabbitMQ 消费者以处理消息。
public class Program
{
public static void Main(string[] args)
{
    string hostName = "localhost";
    string userName = "guest";
    string password = "guest";
    string queueName = "sms_queue";

    var smsService = new SmsService();
    var rabbitMQConsumer = new RabbitMQConsumer(hostName, userName, password, queueName, smsService);

    // 启动消费者
    rabbitMQConsumer.StartConsuming();
}
}7.配置 RabbitMQ 连接信息

确保你的 RabbitMQ 连接信息(主机名、用户名、密码、队列名)是正确的,并且 RabbitMQ 服务器正在运行。
示例代码
以下是一个完整的示例代码,展示如何使用 RabbitMQ 通过短信发送重置后的密码到用户的手机号上:
using RabbitMQ.Client;using RabbitMQ.Client.Events;using System;using System.Text;public class RabbitMQHelper{private readonly string _hostName;private readonly string _userName;private readonly string _password;private readonly string _queueName;public RabbitMQHelper(string hostName, string userName, string password, string queueName){    _hostName = hostName;    _userName = userName;    _password = password;    _queueName = queueName;}public void SendMessage(string message){    var factory = new ConnectionFactory()    {      HostName = _hostName,      UserName = _userName,      Password = _password    };    using (var connection = factory.CreateConnection())    using (var channel = connection.CreateModel())    {      channel.QueueDeclare(queue: _queueName,                           durable: false,                           exclusive: false,                           autoDelete: false,                           arguments: null);      var body = Encoding.UTF8.GetBytes(message);      channel.BasicPublish(exchange: "",                           routingKey: _queueName,                           basicProperties: null,                           body: body);      Console.WriteLine($" Sent {message}");    }}}public class SmsService{public void SendSms(string phoneNumber, string message){    // 在这里实现短信发送逻辑    Console.WriteLine($"Sending SMS to {phoneNumber}: {message}");}}public class RabbitMQConsumer{private readonly string _hostName;private readonly string _userName;private readonly string _password;private readonly string _queueName;private readonly SmsService _smsService;public RabbitMQConsumer(string hostName, string userName, string password, string queueName, SmsService smsService){    _hostName = hostName;    _userName = userName;    _password = password;    _queueName = queueName;    _smsService = smsService;}public void StartConsuming(){    var factory = new ConnectionFactory()    {      HostName = _hostName,      UserName = _userName,      Password = _password    };    using (var connection = factory.CreateConnection())    using (var channel = connection.CreateModel())    {      channel.QueueDeclare(queue: _queueName,                           durable: false,                           exclusive: false,                           autoDelete: false,                           arguments: null);      var consumer = new EventingBasicConsumer(channel);      consumer.Received += (model, ea) =>      {            var body = ea.Body.ToArray();            var message = Encoding.UTF8.GetString(body);            var phoneNumber = "user_phone_number"; // 从消息中解析出手机号            _smsService.SendSms(phoneNumber, message);      };      channel.BasicConsume(queue: _queueName,                           autoAck: true,                           consumer: consumer);      Console.WriteLine(" Press to exit.");      Console.ReadLine();    }}}public class UserService
{
private readonly RabbitMQHelper _rabbitMQHelper;

public UserService(RabbitMQHelper rabbitMQHelper)
{
    _rabbitMQHelper = rabbitMQHelper;
}

public void ResetPassword(Guid userId)
{
    // 生成新的密码
    string newPassword = GeneratePassword();

    // 将新密码发送到 RabbitMQ 队列
    string message = $"Your new password is: {newPassword}";
    _rabbitMQHelper.SendMessage(message);

    // 其他逻辑,例如更新数据库中的密码
}

private string GeneratePassword()
{
    // 生成随机密码的逻辑
    return "random_password";
}
}public class Program
{
public static void Main(string[] args)
{
    string hostName = "localhost";
    string userName = "guest";
    string password = "guest";
    string queueName = "sms_queue";

    var smsService = new SmsService();
    var rabbitMQConsumer = new RabbitMQConsumer(hostName, userName, password, queueName, smsService);

    // 启动消费者
    rabbitMQConsumer.StartConsuming();
}
}
来源:https://www.cnblogs.com/chenshibao/p/18402707
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 第18篇 .net使用RabbitMQ实现短信密码重置