Using FormState::setError() in Form::submitForm()
The Drupal form system, isn't really built for what you are trying to do. I see two ways of going about this:


Webservice validation

If the webservice can do a validation of the data or such a method can be added, you can use the form system as is, and use ::validateForm to validate via webservice.
Rebuild form

What you can do, instead of doing a "validation" is to delete your ::validateForm method entirely and just send the data to the webservice in the ::submitForm. If the operation fails, you can rebuild the form and display a message to the user. You can make it appear as a validation error even though it technically isn't. Drupal does something like this as well. Fx in NodeForm::save

public function save(array $form, FormStateInterface $form_state) {
  ...
  $node-&gt;save();
  ...
  if ($node-&gt;id()) {
    ...
  else {
    // In the unlikely case something went wrong on save, the node will be
    // rebuilt and node form redisplayed the same way as in preview.
    drupal_set_message(t('The post could not be saved.'), 'error');
    $form_state-&gt;setRebuild();
  }
}


So basically, you can use $form_state-&gt;setRebuild() and drupal_set_message to make something that mimics validation in the submit handler. You can also save data in the store ($form_state-&gt;setStorate($data)) which you can use the form method to display error message or something else to the user.