Как я могу предотвратить PHP SoapClient от преобразования двойного значения в научную нотацию? - PullRequest
1 голос
/ 19 августа 2011

Я использую PHP SoapClient и передаю номер кредитной карты в качестве одного из значений. Это число преобразуется в экспоненциальный формат методом soapCall. Я передаю 4321432143274321 и сервер получает <ccNumber xsi:type="xsd:double">4.3214321432743E+15</ccNumber>. Я пытался привести значение как двойное значение и строку безрезультатно.

Я не могу найти никаких подсказок по этому вопросу нигде! Самое близкое, что я нашел, это: http://www.php.net/manual/en/soapclient.soapcall.php#75078,, но «исправление» на самом деле не является исправлением.

Вот мой код:

    private function SetUpClient()
    {
        try
        {
            $options = array( 
                'soap_version'=>SOAP_1_2, 
                'exceptions'=>true, 
                'trace'=>1, 
                'cache_wsdl'=>WSDL_CACHE_NONE
            );

            $auth->username = $this->_username;
            $auth->password = $this->_password;

            $authValues = new SoapVar($auth, SOAP_ENC_OBJECT);
            $header =  new SoapHeader("http://v1.webservices", "authentication", $authValues, false);

            $this->_soapClient = new SoapClient( $this->_wsdlUrl );
            $this->_soapClient->__setSoapHeaders(array($header));
        }
        catch( Exception $ex )
        {
            var_dump($ex);
            return "An error occured: " .  $ex->getMessage();
        }
    }

    public function CallWebService($methodName, $arguments)
    {
        try {
            $result = $this->_soapClient->__soapCall($methodName, $arguments);
        } 
        catch (Exception $e) {
            echo $e->getMessage();
            $result = false;
        }

        return $result;
    }

Вот передаваемый массив $ arguments:

    Array
    (
            [memberUid] => 123456789
            [items] => 1809,1,N,1821,1,N
            [shippingOption] => 40
            [name1] => Test15, Juan
            [name2] => 
            [address1] => 123 Test Street
            [address2] => 
            [address3] => 
            [address4] => 
            [city] => Anytown
            [stateCode] => NY
            [countryCode] => USA
            [postalCode] => 12345
            [subOrderType] => 041
            [entryDate] => 08/18/2011
            [ccType] => 3
            [ccHolder] => Juan Test
            [ccNumber] => 4321432143274321
            [ccExpDate] => 01/2014
            [externalOrderNumber] => 
            [orderSource] => 
    )    

И, наконец, раздел мыльного вызова, который видит сервер:

    <ns1:createOrder>
        <memberUid xsi:type="xsd:string">123456789</memberUid>
        <items xsi:type="xsd:string">1809,1,N,1821,1,N</items>
        <shippingOption xsi:type="xsd:double">40</shippingOption>
        <name1 xsi:type="xsd:string">Test, Juan</name1>
        <name2 xsi:type="xsd:string"/>
        <address1 xsi:type="xsd:string">123 Test Street</address1>
        <address2 xsi:type="xsd:string"/>
        <address3 xsi:type="xsd:string"/>
        <address4 xsi:type="xsd:string"/>
        <city xsi:type="xsd:string">Anytown</city>
        <stateCode xsi:type="xsd:string">NY</stateCode>
        <countryCode xsi:type="xsd:string">USA</countryCode>
        <postalCode xsi:type="xsd:string">12345</postalCode>
        <subOrderType xsi:type="xsd:string">041</subOrderType>
        <entryDate xsi:type="xsd:string">08/19/2011</entryDate>
        <ccType xsi:type="xsd:double">3</ccType>
        <ccHolder xsi:type="xsd:string">Juan Test</ccHolder>
        <ccNumber xsi:type="xsd:double">4.3214321432743E+15</ccNumber>
        <ccExpDate xsi:type="xsd:string">01/2014</ccExpDate>
        <externalOrderNumber xsi:type="xsd:string"/>
        <orderSource xsi:type="xsd:string"/>
    </ns1:createOrder>

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Я нашел решение!

Я обновил настройку «точности» в файле php.ini. Я увеличил это значение с 14 до 16. Шестнадцать цифр - это максимум, который мне нужен для номеров кредитных карт. Подстраивайтесь под свои нужды соответственно!

0 голосов
/ 20 августа 2011

Вы можете использовать функцию number_format для точного преобразования числа в строку. По умолчанию в качестве разделителя тысяч используется запятая. Чтобы избежать этого, вы должны явно переопределить его:

$ccNumber = number_format( 4321432143274321, 0, '', '' );
0 голосов
/ 19 августа 2011

Приведите ваш ccNumber к строке, чтобы сериализация не использовала представление с плавающей запятой.

[ccNumber] => 4321432143274321 . ""
...