2016-09-25 95 views
1

验证它的时候总是返回false后,我得到令牌g-recaptcha-response的响应,我与验证码验证它是这样的:验证码与谷歌

@Service 
public class RecaptchaService { 

    private static class RecaptchaResponse { 
     @JsonProperty("success") 
     private boolean success; 
     @JsonProperty("error-codes") 
     private Collection<String> errorCodes; 
    } 

    @Value("${recaptcha.url}") 
    private String recaptchaUrl; 

    @Value("${recaptcha.secret-key}") 
    private String recaptchaSecretKey; 


    public boolean isResponseValid(String response) { 

     RestTemplate restTemplate = new RestTemplate(); 

     Map<String, String> params = new HashMap<String, String>(); 
     params.put("secret", recaptchaSecretKey); 
     params.put("response", response); 


     RecaptchaResponse recaptchaResponse = restTemplate.postForEntity(recaptchaUrl, params, RecaptchaResponse.class).getBody(); 

     return recaptchaResponse.success; 

    } 

} 

但我总是得到falserecaptchaResponse.success[missing-input-response, missing-input-secret]error-codes

回答

1

我有同样的问题,但它是一个简单的修复。我会解释这个问题,然后尝试解释这个问题。

解决此问题的最简单方法是将参数追加到URL并为“对象请求”传递一个空值。我已更改您的代码以演示此更改。

@Service 
public class RecaptchaService { 

    private static class RecaptchaResponse { 
     @JsonProperty("success") 
     private boolean success; 
     @JsonProperty("error-codes") 
     private Collection<String> errorCodes; 
    } 

    @Value("${recaptcha.url}") 
    private String recaptchaUrl; 

    @Value("${recaptcha.secret-key}") 
    private String recaptchaSecretKey; 

    public boolean isResponseValid(String response) { 
     RestTemplate restTemplate = new RestTemplate(); 

     recaptchaUrl = new StringBuilder() 
       .append(recaptchaUrl) 
       .append("?secret=") 
       .append(recaptchaSecretKey) 
       .append("&response=") 
       .append(response) 
       .toString(); 

     RecaptchaResponse recaptchaResponse = restTemplate.postForEntity(recaptchaUrl, null, RecaptchaResponse.class).getBody(); 
     return recaptchaResponse.success; 
    } 
} 

让我知道这是否适合你。我将参数从Hashmap移动到URL的原因是因为RestTemplate将Hashmap参数转换为JSON格式。 Recaptcha无法理解JSON格式的参数。将参数移动到URL很容易,而且工作。