WPForms Salesforce FIELD_INTEGRITY_EXCEPTION lösen

Die WPForms Salesforce-Integration funktioniert in den meisten Fällen zuverlässig. Wer jedoch das Adressfeld von WPForms einsetzt und Leads direkt in Salesforce überträgt, kann auf hartnäckige API-Fehler stoßen, die weder in der WPForms-Dokumentation noch in der Salesforce-Dokumentation beschrieben sind.

Veröffentlicht am

Lesezeit

Integration

Das Problem: WPForms überträgt Country und State doppelt

Wenn WPForms das native Adressfeld verwendet, sendet die Salesforce-Integration automatisch sowohl das Feld Country als auch CountryCode – und ebenso State und StateCode. Der Wert ist in beiden Feldern identisch.

Salesforce erwartet in diesen Feldern unterschiedliche Werte: Country soll den Klarnamen enthalten, CountryCode den ISO-Code. Stehen in beiden Feldern identische Werte, reagiert die Salesforce-API mit einer FIELD_INTEGRITY_EXCEPTION.

Mismatched integration value and ISO code for field: Country Code – Ursache und Lösung

Dieser Fehler tritt auf, wenn Country und CountryCode den selben Wert enthalten, z.B. DE.

[message] => Mismatched integration value and ISO code for field: Country Code
[errorCode] => FIELD_INTEGRITY_EXCEPTION

Salesforce unterscheidet intern zwischen dem Klartext-Ländernamen (Country) und dem ISO-3166-Code (CountryCode). Enthält Country ebenfalls den ISO-Code, schlägt die Validierung fehl.

Die Lösung: Country aus dem API-Payload entfernen, bevor der Request an Salesforce gesendet wird.

WPForms stellt dafür einen nicht dokumentierten Filter bereit:

add_filter(
    'wpforms_salesforce_provider_api_request_options',
    function( $options, $method, $path ) {

        if ( ! isset( $options['body'] ) ) {
            return $options;
        }

        $payload = json_decode( $options['body'], true );

        if ( isset( $payload['Country'] ) ) {
            unset( $payload['Country'] );
        }

        $options['body'] = wp_json_encode( $payload );

        return $options;
    },
    10,
    3
);

Der Filter greift direkt vor dem API-Request und ermöglicht es, den Payload gezielt zu manipulieren. Im konkreten Fall wird Country entfernt, sodass Salesforce ausschließlich CountryCode erhält.

The StateCode field contains [Wert], which isn’t an available state – Ursache und Lösung

Ein zweiter Fehler betrifft das State-Feld. Er tritt auf, wenn State oder StateCode einen für Salesforce unbekannten Wert, beispielsweise segunda region für eine chilenische Region, enthalten.

[message] => The StateCode field contains segunda region, which isn't an available state.
[errorCode] => FIELD_INTEGRITY_EXCEPTION

Oder in einer anderen Variante:

[message] => There's a problem with this state, even though it may appear correct.
Please select a state from the list of valid states.: State/Province
[errorCode] => FIELD_INTEGRITY_EXCEPTION

Der Payload, der diesen Fehler ausgelöst hat, sah so aus:

[State]     => segunda region
[StateCode] => segunda region
[CountryCode] => CL

Worin genau hier der Fehler begründet ist, kann ich mangels Kenntnissen über Salesforce nicht abschließend beantworten. Für Salesforce jedenfalls ist die “Segunda Region” ein für Chile ungültiger / unbekannter Wert.

Die Lösung: Beide Felder aus dem Payload entfernen, sofern sie im konkreten Projekt nicht benötigt werden.

add_filter(
    'wpforms_salesforce_provider_api_request_options',
    function( $options, $method, $path ) {

        if ( ! isset( $options['body'] ) ) {
            return $options;
        }

        $payload = json_decode( $options['body'], true );

        if ( isset( $payload['StateCode'] ) ) {
            unset( $payload['StateCode'] );
        }

        if ( isset( $payload['State'] ) ) {
            unset( $payload['State'] );
        }

        $options['body'] = wp_json_encode( $payload );

        return $options;
    },
    10,
    3
);

Hinweis: Falls State oder StateCode benötigt wird, könnte es ausreichen, nur eines der beiden Felder zu entfernen, oder die entsprechende Region in Salesforce bekannt zu machen. Die genannten Optionen habe ich jedoch nicht getestet.

Die kombinierte Lösung – WPForms Salesforce FIELD_INTEGRITY_EXCEPTION

In der Praxis können beide Fehler gleichzeitig auftreten. Der folgende Code kombiniert beide Korrekturen in einem einzigen Filter:

add_filter(
    'wpforms_salesforce_provider_api_request_options',
    function( $options, $method, $path ) {

        if ( ! isset( $options['body'] ) ) {
            return $options;
        }

        $payload = json_decode( $options['body'], true );

        // Country-Duplikat entfernen
        if ( isset( $payload['Country'] ) ) {
            unset( $payload['Country'] );
        }

        // State-Felder entfernen
        if ( isset( $payload['StateCode'] ) ) {
            unset( $payload['StateCode'] );
        }

        if ( isset( $payload['State'] ) ) {
            unset( $payload['State'] );
        }

        $options['body'] = wp_json_encode( $payload );

        return $options;
    },
    10,
    3
);

Dieser Code gehört in die functions.php des Child-Themes oder besser noch in ein projektspezifisches Plugin.

Warum das ein Architekturproblem ist

Das eigentliche Problem liegt nicht im Code. Es liegt daran, dass WPForms die Salesforce-Integration mit einem Payload ausliefert, der Salesforce-seitig zu Validierungsfehlern führt. Das ganze leider ohne Dokumentation, ohne klare Fehlermeldung im WPForms-Interface, und ohne offiziellen Fix.

Solche Fehler sind typisch für Integrationen, die auf Plugin-Ebene konzipiert wurden, ohne die Datenstruktur des Zielsystems zu kennen. Wer WordPress als echtes Unternehmenssystem betreibt, inkl. CRM-Anbindung, komplexen Formularen und internationalen Nutzern, stößt früher oder später auf genau diese Art von versteckten Inkonsistenzen.

Der Filter wpforms_salesforce_provider_api_request_options ist übrigens nirgendwo offiziell dokumentiert. Ich konnte ihn nur ausfindig machen, als ich den Code der WPForms Salesforce-Integration gelesen und analysiert habe.

Ähnliches Problem in deinem Projekt?

Wenn du WPForms mit Salesforce, einem CRM oder einer anderen externen API verbinden und auf unerklärliche Fehler stößt, helfe ich gerne weiter.

Ich konzipiere und entwickle WordPress als technisches System. Mit sauberen Schnittstellen, stabiler Architektur und langfristiger Wartbarkeit. Sichere dir jetzt dein kostenloses Architekturgespräch.