2011-06-13 165 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服務器。這可能有幫助。