简体   繁体   中英

coldfusion web service issue

I have the following web service call:

    <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> 

This calls the following web service:

<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>

However, I get the following error:

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

I've trolled google and followed up the usual suspects for this type of error, to no avail so far.

Any help hugely appreciated.

While calling through webservice you may need to pass all arguments available in function but in case you want to pass as optional you need to tell ColdFusion to omit it just adding attributes omit= "true" See below

   <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> 

I remember a time when I was creating Web services, whenever I would change the underlying code, the stub would not be created again though java. So your web service being called would not actually refresh on the server side. It was really weird. Even though I was putting in refreshWSDL=true, it wouldn't recognize the change. You might want to try a restart of the cf server. That might help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM