3

実際に Twilio から送信されている場合は、受信リクエストの検証に以下のコードを使用します。

URLは、

http://example.xom/twilio/getCallForwardResponse/phoneId=1&orgId=1&Called=%2B16032944666&ToState=NH&CallerCountry=US&Direction=inbound&CallerState=NH&ToZip=03801&CallSid=CA3070631fb96644ca8cb6e3ad4ffe75d5&To=%2B16032944666&CallerZip=03038&ToCountry=US&ApiVersion=2010-04-01&CalledZip=03801&CalledCity=PORTSMOUTH&CallStatus=呼び出し中&From=%2B17037750000&AccountSid=ACASN

get & POST メソッドを使用します。

次のように expectedSignature を取得します。

String expectedSignature = request.getHeader("X-Twilio-Signature");

リクエストURlは、

    String serverUrl = request.getRequestURL().toString()+"/"+request.getQueryString();

// Since we use GET, it will be empty and it is working fine.
Map<String,String> tempParams = new HashMap<String,String>();

TwilioUtils util = new TwilioUtils("AUTH_TOKEN_OF_USER");
                    boolean validationResult = util.validateRequest(expectedSignature, serverUrl, tempParams);

POSTの場合、機能していません。POSTのコード、

- - - - - - 編集 - - - - - - - - - - -

    // Check twilio header ...
    String expectedSignature = request.getHeader("X-Twilio-Signature");

    // These are the post params twilio sent in its request
    Map<String, String> params = null;

    String serverUrl = null;
    serverUrl = PROTOCOL + "://" + request.getServerName() + request.getRequestURI() + "?" + request.getQueryString();
    if (request.getMethod().equalsIgnoreCase("POST")) {
       params = new HashMap<String, String>();
       Enumeration<String> reqParams = request.getParameterNames();
       LOGGER.info("NUMBER OF PARAMS ===>>>> " + request.getParameterMap().size());

       int i = 1;
       while (reqParams.hasMoreElements()) {
       String paramName = reqParams.nextElement();
       String paramValue = request.getParameter(paramName);

       LOGGER.info("KKKKK KEY is {}, value is {} count {}", paramName, paramValue, i);

       params.put(paramName, paramValue);
       i = i + 1;
      }

       String queryString = request.getQueryString();

       if (! StringUtils.isEmpty(queryString)) {

          String[] parameters = queryString.split("&");
             for (String parameter : parameters) {
                String[] keyValuePair = parameter.split("=");
                params.remove(keyValuePair[0]);
                LOGGER.info("===>>>> Removing KEY {} ", keyValuePair[0]);
             }
          }
          LOGGER.info("NUMBER OF PARAMS COUNT FINAL ===>>>> " + params.size());
        }
}

 TwilioUtils util = new TwilioUtils(authToken);
                    boolean validationResult = util.validateRequest(expectedSignature, serverUrl, params);

常に false を返します。私は何か間違ったことをしていますか?

4

1 に答える 1

4

作成したら serverUrl を出力することをお勧めします。

これに基づいて: URL を完成させるための HttpServletRequest

getQueryString() には ? が含まれていないようです。自分で追加する必要があります。

- -編集 - -

元の質問で、gets を行っていると言いました。投稿をしている場合は、Map tempParams = new HashMap(); 空白のマップを作成していて、実際にはポスト パラメータをキャプチャしていないため、不正解です。

次のいずれかを試してください: Map params = RestContext.request.params; ( twilio 経由で SMS リクエストを取得する方法)

また

Map tempParams = getAllRequestParams(httpRequest); ( Twilio - 着信コールバック リクエストの検証 - Java )

2 番目の回答に基づいて、設定したすべてのクエリ パラメーター (twilio コンソールまたはコードでポスト バック URL に ?something=something が含まれていますか?) を serverUrl に含める必要があるように見えますが、tempParams から削除する必要があります。

于 2016-07-02T03:11:44.063 に答える