仕事の需要は、ビジネスは登録ユーザーである必要バットSMSゲートウェイは、電話が確認コードを送信する必要があるため、他の企業は、サードパーティのインターフェースを使用する可能性がありますが、同社の大きなポイントは、安全のために、彼らは自分のSMSを持っていますメッセージセンター(SMSC)
1.ビジネスニーズ
- 1.ドッキングSMSゲートウェイは、使用して、メッセージ、ダウンリンク伝送(MT)送信openSMPPオープンソース開発キット
- 前記検証コードがRedisのストレージを使用して(主に、分散ストレージ、支持満了時間)
2.以下は、(送信メッセージ認証コード記憶部とRedisのを含む)コードの簡単な例であります
POM依存を追加
<依存性> <のgroupId> org.opensmpp </のgroupId> <たartifactId> opensmppコア</たartifactId> <バージョン> 3.0。2 </バージョン> </依存関係>
パブリック クラスSmsController { @Autowired プライベートRedisTemplate redisTemplate。 パブリックブールsendVerifyCode(){ 文字列の先 = " 8613594312686 " 。 文字列のホスト = " 192.168.xxの" ; 文字列のポート = " 12345 " ; 文字列のユーザ名は = 「テスト」; 文字列のパスワード = 「テスト」; // 存储Redisの中的キー キー=文字列(あなたが欲しいん)getDestinationNumKey; //は、このコードが既に存在するRedisのは、その後、保存されたコード(15分の同じ有効期限内の伝送コード)を使用してのRedis、または6桁のコードが生成さ valueByKey =オブジェクトgetValueByKey(キー); 文字列verificationCode?= Objects.nonNull(valueByKey)valueByKey.toString():String.valueOf((int型)(Math.random()* 900000 + 100000 )); // テナント(通らない、デフォルトのデフォルト) ブール= sendSuccess のsendMessage(ホスト、ポート、あなたがしたいですか、ユーザ名、パスワード、verificationCode); // 送信に成功し、次の、有効期限(デフォルト15分)に保存され、設定コードのRedis のIF (sendSuccessを){ putValueToRedisWithTimeout(キー、verificationCode、15 、TimeUnit.MINUTES)。 } 戻りsendSuccessと、 } プライベート文字getDestinationNumKey(文字列先){ 戻り String.Formatの(" %S:%S "、" 宛先" 、宛先)。 } パブリックブールのsendMessage(文字列のホスト、 文字列ポート、 文字列のユーザ名、 文字列のパスワード、 文字列PHONENUMBER、 文字列verifyCode){ log.info("あるSMS通知、レシーバ、ホスト{}、ポート{}、userNameに{}パスワード{}先を送信するために開始し、{} verifyCode {} 」)、ホスト、ポート、ユーザ名、パスワード、PHONENUMBER、verifyCode; 試し{ TCPIPConnection接続 = 新しいですTCPIPConnection(ホスト、Integer.parseInt(ポート)); セッションセッション = 新しいセッション(接続); BindRequest要求 = 新しいBindTransmitter(); request.setSystemId(ユーザー名); request.setPassword(パスワード); // SMPPプロトコルバージョン 要求。 setInterfaceVersion((バイト)0x34の)。 request.setSystemType(" SMPP " ); BindResponseバインド = session.bind(リクエスト)。 log.info(" バインド応答debugString {}、応答コマンドステータス{} " 、bind.debugString()、bind.getCommandStatus())。 文字列の内容 = 「[登録] 」 + verifyCode + 「確認コードが15分で有効な他の誰でこのコードを共有しないでください。。。」; SubmitSM submitSM = constructRequest(PHONENUMBER、コンテンツ)。 //堤防faild会导致TCPIPConnection关闭从而导致のOutputStream关闭从而导致ない SubmitSMResp応答= session.submit(submitSM)。 log.info(" メッセージ送信結果は{}、コマンド・ステータスは} {ある" 、response.debugString()、response.getCommandStatus())。 } キャッチ(例外e){ log.error(" 呼び出しSMSセッション例外" 、E)。 } } プライベートにphoneNumberと、SubmitSM constructRequest(文字列にphoneNumber、文字列の内容は)WrongLengthOfStringException、にUnsupportedEncodingExceptionをスロー{ 文字列recipientPhoneNumber = SubmitSM要求 = 新しいSubmitSM(); request.setDestAddr(createAddress(recipientPhoneNumber))。 request.setShortMessage(コンテンツ、Data.ENC_UTF8)。 request.setReplaceIfPresentFlag((バイト)0 ); request.setEsmClass((バイト)0 ); request.setProtocolId((バイト)0 ); request.setPriorityFlag((バイト)0 ); request.setRegisteredDelivery((バイト)1)。// 我々は、配信レポートをしたいです request.setDataCoding((バイト)0 ); request.setSmDefaultMsgId((バイト)0 ); リターン要求。 } プライベートアドレスcreateAddress(列アドレス)WrongLengthOfStringException {スロー アドレスaddressInst = 新しいアドレス()。 // 国家トン addressInst.setTon((バイト)1 )。 //数値計画の指標 addressInst.setNpi((バイト)1 )。 addressInst.setAddress(住所、Data.SM_ADDR_LEN)。 返すaddressInstを。 } / * * * Redisの中存储値(値可为列、マップ、リスト、セット等)、并设置过期时间 * * @paramキー * @param値 * @paramタイムアウト * @paramユニット * / 公共 ボイド putValueToRedisWithTimeout(オブジェクトキー、オブジェクトの値、最終長いタイムアウト、最終TimeUnitで単位){ 試み{ valueOperations valueOperations = redisTemplate.opsForValue() ; valueOperations。セット(キー、値、タイムアウト、単位)。 } キャッチ(例外e){ } } / * * *根据キー获取値值 * * @param鍵 * / パブリックオブジェクトgetValueByKey(オブジェクトキー){ Object値 = NULL ; 試す{ ValueOperations valueOperations = redisTemplate.opsForValue()。 値 = valueOperations。取得(キー); } キャッチ(例外e){ } 戻り値。 } / * * *キーザ・ゲット値値 * * @paramキー * / パブリックオブジェクト削除キー(オブジェクトキー){ オブジェクト値 = NULL ; してみてください{ 場合(redisTemplate.hasKey(キー)){ redisTemplate.delete(キー); } } キャッチ(例外e){ } 戻り値。 } }
PINを確認してください。3.
値が値のない、正しいか間違っているかどうかを比較した場合ここでは、コードは、Redisの問い合わせに電話番号から直接、掲載されていない、検証コードへの直接のスローは無効です
4.ドッキングゲートウェイAPI
参照してください:https://www.world-text.com/docs/interfaces/SMPP/ と https://www.smssolutions.net/tutorials/smpp/smpperrorcodes/
SMSゲートウェイシミュレータ
テスト環境に問題があるか、インターネットからシミュレーションSMPPを見つけるテストをドッキング、私は非常に良い使用を感じる、ここで共有アドレス:SMPPシミュレータ
その他の参考文献:
https://support.nowsms.com/discus/messages/1/SMPP_v3_4_Issue1_2-24857.pdf
https://www.activexperts.com/sms-component/smpp-specifications/smpp-pdu-definition/
https://zhuanlan.zhihu.com/p/58237629