SMS SMSゲートウェイドッキング

仕事の需要は、ビジネスは登録ユーザーである必要バットSMSゲートウェイは、電話が確認コードを送信する必要があるため、他の企業は、サードパーティのインターフェースを使用する可能性がありますが、同社の大きなポイントは、安全のために、彼らは自分のSMSを持っていますメッセージセンター(SMSC)

 1.ビジネスニーズ

    - 1.ドッキングSMSゲートウェイは、使用して、メッセージ、ダウンリンク伝送(MT)送信openSMPPオープンソース開発キット

    - 前記検証コードがRedisのストレージを使用して(主に、分散ストレージ、支持満了時間)

 2.以下は、(送信メッセージ認証コード記憶部とRedisのを含む)コードの簡単な例であります

 POM依存を追加

        <依存性> 
            <のgroupId> org.opensmpp </のgroupId> 
            <たartifactId> opensmppコア</たartifactId> 
            <バージョン> 3.02 </バージョン> 
        </依存関係>
パブリック クラス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シミュレータ 

その他の参考文献:

   http://read.pudn.com/downloads97/sourcecode/java/400090/OpenSMPP/src/org/smpp/test/SMPPTest.java__.htm

   https://support.nowsms.com/discus/messages/1/SMPP_v3_4_Issue1_2-24857.pdf

   https://stackoverflow.com/questions/26729958/using-smpp-to-send-sms-texts-in-java?answertab=active#tab-top

   https://www.activexperts.com/sms-component/smpp-specifications/smpp-pdu-definition/

   https://zhuanlan.zhihu.com/p/58237629

おすすめ

転載: www.cnblogs.com/guanbin-529/p/12340492.html