suds.TypeNotFound:未找到类型:'MerchantCode'

时间:2012-01-24 06:06:12

标签: php python django wsdl suds

我正在使用django开发一个网站,它处理wsdl。我有一个处理它的示例代码,但它写在PHP上,我想将它转换为我的django的python。 这是PHP文件......

<?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       = "development@yespayments.com.ph";
  $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());

?>

这就是我将它转换为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","development@yespayments.com.ph"),
            ("ClientIPAddress","http://127.0.0.1:8000/"),
            ("Notes","This is test"),
            ])

response = client.service.OnlineTransaction(values)

但是当我运行它时,我收到了这个错误......

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'

我认为错误出现在我的python的这一行中,

response = client.service.OnlineTransaction(values)

任何人都可以给我一个关于我情况的想法吗?

提前感谢...

1 个答案:

答案 0 :(得分:4)

您确定DirectConnect.test.WSDL是否正确?似乎不是。请在这里发布。

添加了:

我得到了它的工作。请看一下结果。这是the working code(运行它的chmod + x main.py)。

(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': 'development@yespayments.com.ph',
        'ClientIPAddress': 'http://127.0.0.1:8000/',
        'Notes': 'This is test',
    }

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

if __name__ == '__main__':
    test_api()