我正在开发一个SpringBoot项目,我想在其中使用Twilio实现手机号码OTP验证。我正在使用以下版本-
<dependency>
<groupId>com.twilio.sdk</groupId>
<artifactId>twilio</artifactId>
<version>9.11.0</version>
</dependency>
我参考了以下文档并相应实施了-
https://www.twilio.com/docs/verify/api#user-verification-workflow
和https://www.twilio.com/blog/phone-number-verification-java-spring-boot-verify-totp。
我的代码-
配置-我已经验证了所有的ID和令牌
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties("twilio")
public class TwilioConfig {
private String accountSid;
private String authToken;
private String trialNumber;
private String messagingServiceSid;
public void setAccountSid(String accountSid) {
this.accountSid = accountSid;
}
public void setAuthToken(String authToken) {
this.authToken = authToken;
}
public void setTrialNumber(String trialNumber) {
this.trialNumber = trialNumber;
}
public void setMessagingServiceSid(String messagingServiceSid) {
this.messagingServiceSid = messagingServiceSid;
}
public TwilioConfig(){
}
public String getAccountSid() {
return accountSid;
}
public String getAuthToken() {
return authToken;
}
public String getTrialNumber() {
return trialNumber;
}
public String getMessagingServiceSid() {
return messagingServiceSid;
}
@Override
public String toString() {
return "TwilioConfig{" +
"accountSid='" + accountSid + '\'' +
", authToken='" + authToken + '\'' +
", trialNumber='" + trialNumber + '\'' +
", messagingServiceSid='" + messagingServiceSid + '\'' +
'}';
}
}
Twilio 初始化器-
import com.twilio.Twilio;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TwilioInitializer {
Logger logger= LoggerFactory.getLogger(TwilioInitializer.class);
private final TwilioConfig twilioConfig;
@Autowired
public TwilioInitializer(TwilioConfig twilioConfig) {
this.twilioConfig = twilioConfig;
logger.info("Initializing Twilio");
Twilio.init(
twilioConfig.getAccountSid(),
twilioConfig.getAuthToken()
);
com.twilio.rest.verify.v2.Service service = com.twilio.rest.verify.v2.Service.creator("My First Verify Service").create();
logger.info("Twilio initialized");
}
}
和,服务-
import com.twilio.Twilio;
import com.twilio.rest.verify.v2.service.Verification;
import com.twilio.rest.verify.v2.service.VerificationCheck;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Service
public class SmsSenderImpl implements SmsSender {
private final Logger logger = LoggerFactory.getLogger(SmsSenderImpl.class);
private final TwilioConfig twilioConfig;
@Autowired
public SmsSenderImpl(TwilioConfig twilioConfig) {
this.twilioConfig = twilioConfig;
}
@Override
public void sendSms(SmsRequest smsRequest) {
Twilio.init(twilioConfig.getAccountSid(), twilioConfig.getAuthToken());
String phoneNumber = "+91" + smsRequest.getPhoneNumber().trim();
try {
logger.info("twilioConfig: " + twilioConfig);
logger.info("Sending otp: " + smsRequest);
Verification verification = Verification.creator(twilioConfig.getMessagingServiceSid(), // this is your verification sid
phoneNumber, //this is your Twilio verified recipient phone number
"sms" // this is your channel type
).create();
logger.info("Verification status: " + verification.getStatus());
logger.info("OTP has been successfully generated, and awaits your verification {}", LocalDateTime.now());
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void verifyOTP(String otp, String to) {
Twilio.init(twilioConfig.getAccountSid(), twilioConfig.getAuthToken());
logger.info("Verifying otp: " + otp);
try {
VerificationCheck verificationCheck = VerificationCheck.creator(twilioConfig.getMessagingServiceSid()).setTo(to.trim()).setCode(otp.trim()).create();
logger.info("verify otp, Verification status: " + verificationCheck.getStatus());
} catch (Exception e) {
e.printStackTrace();
}
}
}
问题- 当我在服务层使用方法 - sendSms 时,出现以下错误 -
com.twilio.exception.ApiException: Invalid parameter
at com.twilio.rest.verify.v2.service.VerificationCreator.create(VerificationCreator.java:184)
at com.twilio.rest.verify.v2.service.VerificationCreator.create(VerificationCreator.java:32)
at com.twilio.base.Creator.create(Creator.java:40)
我已选择服务-
消息传递 -> 服务 -> 新服务 -> 服务类型 - “验证用户”。
我无法理解问题出在哪里。我还在 Twilio 上创建了一项服务,并使用 https://console.twilio.com/us1/develop/sms/try-it-out/send-an-sms 对其进行了测试。但是,我在代码中遇到错误,但找不到问题所在。请帮忙!
您需要使用以
VA
开头的服务 SID。
您想要使用 “验证 (VA)” 服务,但您正在使用
SID
来实现 “消息传递 (MG)” 服务。
还有一些错误(如果不是故意的);
您的
TwilioInitializer
类都会为验证服务创建服务。 如果你是故意这样做的,那没问题,但如果你是在不知情的情况下这样做的;您不需要每次都创建服务。
您只需要运行一次
Twilio.init(...);
块,不需要在每个方法中都运行它。