2011-06-13 166 views
0

我有以下的Web服务调用:ColdFusion的Web服务问题

<cfinvoke webservice="#application.capsRemote#card.cfc?wsdl" method="purchase" returnVariable="retpurchase" refreshwsdl="true"> 
     <cfinvokeargument name="iCustomer" value="#session.user.customerCode#"> 
     <cfinvokeargument name="iAmountCents" value="#form.cc_amount*100#"> 
     <cfinvokeargument name="sCard" value="#form.cc_number#"> 
     <cfinvokeargument name="sExpiry" value="#form.cc_expiry#"> 
     <cfinvokeargument name="sType" value="PAYMENT"> 
     <cfinvokeargument name="sSecurityNo" value="#form.cc_securitycode#"> 
    </cfinvoke> 

这将调用以下Web服务:

<cffunction name="purchase" access="remote" returntype="struct" hint="This function wraps calls to the purchase method of the Buyline OCX at Compass"> 
<cfargument name="iCustomer" required="yes" type="string"> 
<cfargument name="iAmountCents" required="yes" type="string"> 
<cfargument name="sCard" required="yes" type="string"> 
<cfargument name="sExpiry" required="yes" type="string" hint="Format yyyymm"> 
<cfargument name="sType" required="yes" type="string"> 
<cfargument name="sSecurityNo" required="yes" type="string"> 
<cfargument name="sMerchant" required="no" default="F" type="string"> 
<cfargument name="sBuylineUser" required="no" default="FreenetWeb" type="string"> 

<cfscript> 
    var Status = ""; 
    var StatusText = ""; 
    var ResponseSequence = ""; 
    var ResponseCode = ""; 
    var ResponseText = ""; 
    var stReturn = StructNew(); 
</cfscript> 

<cftry> 
    <cfobject type="COM" action="Create" name="oBuyline" class="ctlBuyline.Buyline"> 
    <cfscript> 
     // Create an instance of the OCX 
     oBuyline.Server = variables.sBuylineServer; 
     oBuyline.RemotePort = variables.nBuylineRemoteport; 
     oBuyline.UserName = variables.sBuylineUsername; 
     oBuyline.Password = variables.sBuylinePassword; 
     oBuyline.Timeout = variables.sBuylineTimeout; 
    </cfscript> 
    <cfscript> 
     // calling the purchase method, call does not contain the sSBank argument 
     Status = oBuyline.Purchase(arguments.sMerchant,arguments.iCustomer,arguments.iAmountCents,arguments.sCard,arguments.sExpiry,arguments.sBuylineUser,arguments.sType,0,arguments.sSecurityNo); 


     switch(Status) 
     { 
      case "0": 
       StatusText = oBuyline.ResponseText; 
       break; 
      case "1": 
       StatusText = "Successful transaction"; 
       break; 
      case "2": 
       StatusText = oBuyline.ResponseText; 
       break; 
      default: 
       StatusText = "CAPS: Unknown issue with communicating with Buyline";    
     }  
     // response from the purchase method 
     ResponseSequence = oBuyline.Sequence; 
     ResponseCode = oBuyline.ResponseCode; 
     if (ResponseCode neq "0"){ 
      ResponseText = "Declined (" & Replace(oBuyline.ResponseText, "ERROR~~", "") & ")"; 
     } else { 
      ResponseText = "Approved"; 
     } 
     // set return values 
     stReturn.Status = Status; 
     stReturn.StatusText = StatusText; 
     stReturn.ResponseSequence = ResponseSequence; 
     stReturn.ResponseCode = ResponseCode; 
     stReturn.ResponseText = ResponseText; 
     if (sMerchant eq "T") { 
      stReturn.MerchantId = "TEST555555"; 
     } else { 
      stReturn.MerchantId = "1111111"; 
     } 
     // 
     return stReturn;   
    </cfscript> 

    <cfcatch type="any"><!--- catch code ---></cfcatch> 
</cftry> 

不过,我得到以下错误:

Web service operation purchase with parameters {sSecurityNo={111},iAmountCents={100.0},sExpiry={201310},sCard={1111111111111111},iCustomer={111111},sType={PAYMENT}} cannot be found. 

我拖了谷歌,并跟进了这种类型的错误通常的嫌疑人,到目前为止没有用。

任何帮助极大的赞赏。

回答

2

在呼吁通过web服务,你可能需要通过所有可用的参数在功能上,但如果你想通过可选,你需要告诉的ColdFusion忽略它只是添加属性忽略=“真” 见下文

<cfinvoke webservice="#application.capsRemote#card.cfc?wsdl" method="purchase" returnVariable="retpurchase" refreshwsdl="true"> 
    <cfinvokeargument name="iCustomer" value="#session.user.customerCode#"> 
    <cfinvokeargument name="iAmountCents" value="#form.cc_amount*100#"> 
    <cfinvokeargument name="sCard" value="#form.cc_number#"> 
    <cfinvokeargument name="sExpiry" value="#form.cc_expiry#"> 
    <cfinvokeargument name="sType" value="PAYMENT"> 
    <cfinvokeargument name="sSecurityNo" value="#form.cc_securitycode#"> 
    <cfinvokeargument name="sMerchant" value="" omit="true"> 
    <cfinvokeargument name="sBuylineUser" value="" omit="true"> 
    </cfinvoke> 
+0

是的,这个伎俩。谢谢Pritesh! – 2011-06-13 22:30:53

0

我记得当我创建Web服务的时候,每当我改变底层代码时,这个存根都不会再通过java创建。所以被调用的Web服务实际上并不会在服务器端刷新。这真的很奇怪。即使我将refreshWSDL = true,它也不会识别这个变化。您可能想要尝试重新启动cf服务器。这可能有帮助。