com.twilio.exception.ApiException:无效参数:Spring Boot

问题描述 投票:0回答:1

我正在开发一个SpringBoot项目,我想在其中使用Twilio实现手机号码OTP验证我正在使用以下版本-

  1. 春天:6
  2. SpringBoot:3.1.3
  3. 爪哇:17
  4. Twilio-
<dependency>
           <groupId>com.twilio.sdk</groupId>
           <artifactId>twilio</artifactId>
           <version>9.11.0</version>
       </dependency>

我参考了以下文档并相应实施了-
https://www.twilio.com/docs/verify/api#user-verification-workflowhttps://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 对其进行了测试。但是,我在代码中遇到错误,但找不到问题所在。请帮忙!

java spring spring-boot twilio twilio-api
1个回答
0
投票

您需要使用以

VA
开头的服务 SID。

您想要使用 “验证 (VA)” 服务,但您正在使用

SID
来实现 “消息传递 (MG)” 服务。

还有一些错误(如果不是故意的);

    每次运行代码时,
  • 您的

    TwilioInitializer
    类都会为验证服务创建服务。 如果你是故意这样做的,那没问题,但如果你是在不知情的情况下这样做的;您不需要每次都创建服务。

  • 您只需要运行一次

    Twilio.init(...);
    块,不需要在每个方法中都运行它。

© www.soinside.com 2019 - 2024. All rights reserved.