2012-01-24 1 views
3

Je développe un site Web en utilisant django et il traite avec wsdl. J'ai un exemple de code à traiter, mais il est écrit en PHP et je voulais le convertir en python pour mon django. voici le fichier PHP ...suds.TypeNotFound: Type introuvable: 'MerchantCode'

<?php 
    ini_set("soap.wsdl_cache_enabled", "0"); 

    $WSDL     = "DirectConnect.test.WSDL"; 

    $MerchantCode   = "HELLO"; 
    $MerchantReference  = "" . time(); 
    $TransactionType  = 20; 
    $Amount    = 100; 
    $CurrencyCode   = "PHP"; 
    $CardHolderName  = "RAUL O REVECHE"; 
    $CardNumber   = "4005550000000001"; 
    $ExpiryMonth   = 5; 
    $ExpiryYear   = 2013; 
    $CardID    = 0; 
    $CardSecurityCode  = "400"; 
    $CustomerAccountNumber = ""; 
    $BillNumber   = 0; 
    $CardHolderEmail  = "[email protected]"; 
    $ClientIPAddress  = $_SERVER["REMOTE_ADDR"]; 
    $Notes     = "This is a test."; 

    $SoapClient = new SoapClient($WSDL,array(
    "soap_version" => SOAP_1_2, 
    "features"  => SOAP_SINGLE_ELEMENT_ARRAYS, 
    "cache_wsdl" => WSDL_CACHE_NONE, 
    "trace"  => 1, 
    "exceptions" => 0)); 

    try 
    { 
    $response = $SoapClient->OnlineTransaction(array(
     "MerchantCode"   => $MerchantCode, 
     "MerchantReference"  => $MerchantReference, 
     "TransactionType"  => $TransactionType, 
     "Amount"    => $Amount, 
     "CurrencyCode"   => $CurrencyCode, 
     "CardHolderName"  => $CardHolderName, 
     "CardNumber"   => $CardNumber, 
     "ExpiryMonth"   => $ExpiryMonth, 
     "ExpiryYear"   => $ExpiryYear, 
     "CardID"    => $CardID, 
     "CardSecurityCode"  => $CardSecurityCode, 
     "CustomerAccountNumber" => $CustomerAccountNumber, 
     "BillNumber"   => $BillNumber, 
     "CardHolderEmail"  => $CardHolderEmail, 
     "ClientIPAddress"  => $ClientIPAddress, 
     "Notes"     => $Notes 
    )); 

    print "<br />TransactionID: ".   $response->OnlineTransactionResult->TransactionID; 
    print "<br />TransactionType: ".   $response->OnlineTransactionResult->TransactionType; 
    print "<br />MerchantReference: ".  $response->OnlineTransactionResult->MerchantReference; 
    print "<br />ResponseCode: ".    $response->OnlineTransactionResult->ResponseCode; 
    print "<br />ResponseShortDescription: ". $response->OnlineTransactionResult->ResponseShortDescription; 
    print "<br />ResponseDescription: ".  $response->OnlineTransactionResult->ResponseDescription; 
    print "<br />TimeStamp: ".    $response->OnlineTransactionResult->TimeStamp; 
    print "<br />CardID: ".     $response->OnlineTransactionResult->CardData->CardID; 
    print "<br />CardSuffix: ".    $response->OnlineTransactionResult->CardData->CardSuffix; 
    print "<br />ExpiryYear: ".    $response->OnlineTransactionResult->CardData->ExpiryYear; 
    print "<br />ExpiryMonth: ".    $response->OnlineTransactionResult->CardData->ExpiryMonth; 
    print "<br />BINCountryCode: ".   $response->OnlineTransactionResult->BINCountryCode; 
    print "<br />IPCountryCode: ".   $response->OnlineTransactionResult->IPCountryCode; 
    print "<br />WarningArray: ".    $response->OnlineTransactionResult->WarningArray; 

    } 
    catch (SoapFault $exception) 
    { 
    print $exception; 
    } 

    print "<br /><br />Request:<br />". htmlspecialchars($SoapClient->__getLastRequest()); 
    print "<br /><br />Response:<br />". htmlspecialchars($SoapClient->__getLastResponse()); 

?> 

et c'est ce que je l'ai fait pour le convertir en python ...

from suds.client import Client 
import collections 
url = 'file:///home/myFile/DirectConnect.test.WSDL' 
client = Client(url) 
values = collections.OrderedDict([ 
      ("MerchantCode", "HELLO"), 
      ("MerchantReference", ""), 
      ("TransactionType",20), 
      ("Amount",100), 
      ("CurrencyCode","PHP"), 
      ("CardHolderName","RAUL O REVECHE"), 
      ("CardNumber", "4005550000000001"), 
      ("ExpiryMonth",5), 
      ("ExpiryYear",2013), 
      ("CardID",0), 
      ("CardSecurityCode","400"), 
      ("CustomerAccountNumber",""), 
      ("BillNumber",0), 
      ("CardHolderEmail","[email protected]"), 
      ("ClientIPAddress","http://127.0.0.1:8000/"), 
      ("Notes","This is test"), 
      ]) 

response = client.service.OnlineTransaction(values) 

mais quand je le lance, j'ai eu cette erreur .. .

Traceback (most recent call last): 
    File "yes_test.py", line 24, in <module> 
    response = client.service.OnlineTransaction(values) 
    File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 542, in __call__ 
    return client.invoke(args, kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 595, in invoke 
    soapenv = binding.get_message(self.method, args, kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/binding.py", line 120, in get_message 
    content = self.bodycontent(method, args, kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/document.py", line 63, in bodycontent 
    p = self.mkparam(method, pd, value) 
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/document.py", line 105, in mkparam 
    return Binding.mkparam(self, method, pdef, object) 
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/binding.py", line 287, in mkparam 
    return marshaller.process(content) 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/core.py", line 62, in process 
    self.append(document, content) 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/core.py", line 75, in append 
    self.appender.append(parent, content) 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/appender.py", line 102, in append 
    appender.append(parent, content) 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/appender.py", line 243, in append 
    Appender.append(self, child, cont) 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/appender.py", line 182, in append 
    self.marshaller.append(parent, content) 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/core.py", line 74, in append 
    if self.start(content): 
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/literal.py", line 87, in start 
    raise TypeNotFound(content.tag) 
suds.TypeNotFound: Type not found: 'MerchantCode' 

je pense que l'erreur est dans ces lignes de mon python,

response = client.service.OnlineTransaction(values) 

quelqu'un peut-il me donner une idée de ma situation?

merci à l'avance ...

+0

Pourriez-vous s'il vous plaît montrer plus du rapport d'erreur ... –

+0

Merci pour la réponse Sandip Agarwal, je viens de mettre l'ensemble du rapport d'erreur .. Merci – gadss

Répondre

4

Êtes-vous sûr que votre DirectConnect.test.WSDL est correcte? Il semble que ce ne soit pas. Veuillez le poster ici.

Ajouté:

Je l'ai fonctionné. S'il vous plaît jeter un oeil sur le résultat. Voici the working code (chmod + x main.py pour l'exécuter).

(sudstest)mike-imac:sudstest mike$ ./main.py 
(OnlineResponse){ 
    TransactionID = 0 
    TransactionType = 20 
    MerchantReference = None 
    ResponseCode = "ERMERC" 
    ResponseShortDescription = "YESDEC" 
    ResponseDescription = "Invalid Merchant Code" 
    TimeStamp = "2012/01/24 17:21:37" 
    CardData = 
     (YESCardData){ 
     CardID = 0 
     ExpiryYear = 0 
     ExpiryMonth = 0 
     } 
} 

main.py

#!/usr/bin/env python 
import os 
from suds.client import Client 

WSDL = 'DirectConnect.test.WSDL' 

def test_api(): 
    url = 'file://' + os.path.join(os.path.abspath(os.path.dirname(__file__)), WSDL) 
    client = Client(url) 

    data = { 
     'MerchantCode': 'HELLO', 
     'MerchantReference': '', 
     'TransactionType': 20, 
     'Amount': 100, 
     'CurrencyCode': 'USD', 
     'CardHolderName': 'RAUL O REVECHE', 
     'CardNumber': 4005550000000001, 
     'ExpiryMonth': 5, 
     'ExpiryYear': 2013, 
     'CardID': 0, 
     'CardSecurityCode': 400, 
     'CustomerAccountNumber': '', 
     'BillNumber': 0, 
     'CardHolderEmail': '[email protected]', 
     'ClientIPAddress': 'http://127.0.0.1:8000/', 
     'Notes': 'This is test', 
    } 

    result = client.service.OnlineTransaction(**data) 
    print result 

if __name__ == '__main__': 
    test_api() 
+0

msamoylov pour la répondre, j'ai posté le lien de mon DirectConnect.test.WSDL – gadss

+0

merci msamoylov, son aide moi tellement, dans mon code, je viens d'ajouter '**' dans le 'OnlineTransaction()', donc mon 'response' est comme this 'response = client.service.OnlineTransaction (** valeurs)' – gadss

+0

Il n'y a pas besoin dans le OrderedDict (implémenté en Python) IMHO. Essayez d'utiliser "bon marché" et light dict (implémenté en C) à la place. Je ne pense pas que l'ordre ait de l'importance pour ce cas. –

Questions connexes