如何在.NET API中接收短信?ASP.NET Web API实现问询
Hey,要在ASP.NET Web API里获取发送到你号码的短信内容,核心思路是借助第三方短信服务提供商的Webhook推送——毕竟运营商不会直接把短信推给你的自定义API。我给你拆解下具体步骤,附代码示例:
1. 选择支持Webhook的短信服务商
你需要找一家提供短信接收+Webhook推送的服务商,比如Twilio、Plivo、Vonage(原Nexmo)这类。他们会给你分配一个虚拟接收号码,部分服务商还支持绑定你的真实手机号。当有短信发送到这个号码时,服务商会自动把短信的相关信息(发送方号码、接收号码、短信内容等)POST到你指定的API接口。
2. 编写ASP.NET Web API的短信接收端点
创建一个API控制器,专门处理服务商发来的短信推送请求。下面是一个基础示例(以Twilio的参数格式为例,其他服务商参数名可能略有不同,需要调整):
using System.Web.Http; public class SmsController : ApiController { // 定义接收路由,确保服务商能访问到这个地址 [HttpPost] [Route("api/sms/receive")] public IHttpActionResult ReceiveIncomingSms([FromForm] SmsPayload payload) { // 提取关键信息 string senderNumber = payload.From; string yourReceivingNumber = payload.To; string smsContent = payload.Body; // 这里可以添加你的业务逻辑:比如存数据库、触发通知、调用其他服务等 // Example: _smsRepository.Save(new ReceivedSms(senderNumber, yourReceivingNumber, smsContent)); // 给服务商返回成功响应,部分服务商要求特定格式(比如Twilio可以返回空200,或XML指令) return Ok(); } } // 对应服务商的请求参数模型,根据实际服务商调整字段名 public class SmsPayload { public string From { get; set; } // 发送短信的用户号码 public string To { get; set; } // 你的接收号码 public string Body { get; set; } // 短信内容 }
3. 配置服务商的Webhook地址
把你的API接口的公网可访问地址配置到服务商的后台。比如如果你的API部署在云服务器上,地址可能是https://your-domain.com/api/sms/receive;如果是本地开发测试,可以用ngrok这类工具把本地端口映射到公网(比如运行ngrok http 5000,拿到ngrok提供的https地址后拼接接口路径)。
配置完成后,服务商就会在有新短信时自动向这个地址发送POST请求。
4. 验证请求合法性(关键)
为了防止恶意请求,必须验证收到的请求确实来自你的短信服务商。以Twilio为例,可以用他们的官方SDK做签名验证:
using Twilio.Security; using System.Linq; // 在ReceiveIncomingSms方法开头添加验证逻辑 var request = Request; string twilioAuthToken = "你的Twilio AuthToken"; // 从Twilio后台获取 var validator = new RequestValidator(twilioAuthToken); // 读取请求中的表单数据和签名头 var formData = await request.Content.ReadAsFormDataAsync(); var signature = request.Headers.GetValues("X-Twilio-Signature").FirstOrDefault(); // 验证请求是否合法 bool isRequestValid = validator.Validate( request.RequestUri.AbsoluteUri, formData, signature ); if (!isRequestValid) { return Unauthorized(); // 非法请求直接返回401 }
其他服务商也有类似的验证机制,比如Plivo用X-Plivo-Signature头,你可以参考他们的官方文档实现验证。
注意事项
- 不同服务商的请求参数格式可能不同:比如Plivo的短信内容字段叫
Text,而不是Body,需要根据你选择的服务商调整模型字段。 - 确保你的API是HTTPS的:大部分服务商要求Webhook地址必须是HTTPS,避免数据传输被窃取。
- 本地测试用ngrok:本地开发环境没有公网IP,用ngrok可以快速把本地API暴露到公网,方便调试。
内容的提问来源于stack exchange,提问作者blue
相关产品推荐
相关产品推荐

