使用PHP& amp;的Barclaycard ePDQ API CURL只是不想工作,没有回应,不确定CURL是否有效?

时间:2011-05-03 19:48:00

标签: php curl

我一直把它关掉一段时间,因为我似乎对我正在做的事情一无所知。我正在尝试使用PHP和Curl与Barclaycard ePDQ MPI交谈。我在使用HSBC XML API之前已经完成了这个,但是Barclaycard ePDQ MPI似乎给了我一些麻烦。我有一个表单,其中发布了卡详细信息/地址详细信息以及包含以下功能的页面请注意我在域上设置了SSL,CURL安装在服务器上,我有HSBC XML API正常工作相同的方框/网址。

<?php
    function process_card($users_ip, $Temp_Order_ID, $User_NameX, $First_Name, $Surname, $Address_Line1, $Address_Line2, $Town, $Country, $Postcode, $CardNumber, $CardExpiryDate, $issue_node, $CardCVV, $totalCost ) {

    if ($CardCVV == "")
        $cvvindicator = 0;
    else
        $cvvindicator=1;

    global $status;
    //$amount = $amount * 100;

        $xml = '
    <?XML version="1.0" encoding="UTF-8"?>
    <EngineDocList>
        <DocVersion>1.0</DocVersion>
        <EngineDoc>
        <IPAddress>' . $users_ip . '</IPAddress>
            <ContentType>OrderFormDoc</ContentType>
            <User>
                <Name>XXXXX</Name>
                <Password>XXXXXXX</Password>
                <ClientId DataType="S32">12345</ClientId>
            </User>
            <Instructions>
                <Pipeline>Payment</Pipeline>
            </Instructions>
            <OrderFormDoc>
                <Mode>T</Mode>
                <Id>' . $Temp_Order_ID. '</Id>
                <Consumer>
                    <Email>' . $User_NameX . '</Email>
                    <BillTo>
                        <Location>
                            <Address>
                                <FirstName>' . $First_Name . '</FirstName>
                                <LastName>' . $Surname .'</LastName>
                                <Street1>' . $Address_Line1 . '</Street1>
                                <Street2>' . $Address_Line2 . '</Street2>
                                <Street3></Street3>
                                <City>' . $Town . '</City>
                                <StateProv>' . $Country . '</StateProv>
                                <PostalCode>' . $Postcode . '</PostalCode>
                                <Country>' . getCuntCode($Country) . '</Country>
                            </Address>
                        </Location>
                    </BillTo>
                    <ShipTo>
                        <Location>
                            <Address>
                                <FirstName>' . $First_Name . '</FirstName>
                                <LastName>' . $Surname .'</LastName>
                                <Street1>' . $Address_Line1 . '</Street1>
                                <Street2>' . $Address_Line2 . '</Street2>
                                <Street3></Street3>
                                <City>' . $Town . '</City>
                                <StateProv>' . $Country . '</StateProv>
                                <PostalCode>' . $Postcode . '</PostalCode>
                                <Country>' . getCuntCode($Country) . '</Country>
                            </Address>
                        </Location>
                    </ShipTo>
                    <PaymentMech>
                        <CreditCard>
                            <Type DataType="S32">1</Type>
                            <Number>' . $CardNumber . '</Number>
                            <Expires DataType="ExpirationDate" Locale="826">' . $CardExpiryDate . '</Expires>
                            ' . $issue_node . ' 
                            <Cvv2Indicator>' . $cvvindicator . '</Cvv2Indicator>
                            <Cvv2Val>' . $CardCVV . '</Cvv2Val>
                        </CreditCard>
                    </PaymentMech>
                </Consumer>
                <Transaction>
                    <Type>Auth</Type>
                    <CurrentTotals>
                        <Totals>
                            <Total DataType="Money" Currency="826">' . $totalCost . '</Total>
                        </Totals>
                    </CurrentTotals>
                    <CardholderPresentCode DataType="S32"></CardholderPresentCode>
                    <PayerSecurityLevel DataType="S32"></PayerSecurityLevel>
                    <PayerAuthenticationCode></PayerAuthenticationCode>
                    <PayerTxnId></PayerTxnId>
                </Transaction>
            </OrderFormDoc>
        </EngineDoc>
    </EngineDocList>';

        $url = "https://secure2.epdq.co.uk:11500";

        $params = array("CLRCMRC_XML" => $xml);
        $params = formatData($params);

        $response = post_to_epdq($url, $xml);   
        $auth_code = strstr($response, "<AuthCode>");

        echo "auth_code=" . $auth_code;

        if ($auth_code <> "") {

            $splt = split("</AuthCode>", $auth_code);
            $status = strip_tags($splt[0]);
            return $xml . "<hr/>" . $response . "Good";
        } else {

            $error = strstr($response, "<Text>");
            $splt = split("</Text>", $error);
            $status = strip_tags($splt[0]);
            return $xml . "<hr/>" . $response . "Bad";

        }
    }

    function post_to_epdq($url, $data) {


        set_time_limit(120);
        $output = array();
        $curlSession = curl_init();
        curl_setopt($curlSession, CURLOPT_URL, $url);
        curl_setopt($curlSession, CURLOPT_PORT, 443);
        curl_setopt($curlSession, CURLOPT_HEADER, 0);
        curl_setopt($curlSession, CURLOPT_POST, 1);
        curl_setopt($curlSession, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curlSession, CURLOPT_TIMEOUT, 60);
        #$response = split(chr(10),curl_exec ($curlSession));

        $response = curl_exec($curlSession);

        if (curl_error($curlSession)) {
            $this->error = curl_error($curlSession);
            return "ERROR";
        }

        curl_close($curlSession);
        return $response;
    }

    function formatData($data) {

        $output = "";
        foreach ($data as $key => $value)
            $output .= "&" . $key . "=" . urlencode($value);
            $output = substr($output, 1);
            return $output;
    }

不用说我验证用户输入,生成他们的IP并确定国家代码,然后我调用上面的函数:

process_card($users_ip,$Temp_Order_ID,$User_NameX,$First_Name,$Surname,$Address_Line1,$Address_Line2,$Town,$Country,$Postcode,$CardNumber, $CardExpiryDate, $issue_node, $CardCVV, $totalCost );

我没有回复?我不确定port和url项是否不正确或者整个CURL请求是否错误。请求中没有返回任何内容。

很抱歉这是一个很长的帖子,但这真的是我的头脑!

以前有人这样做过吗?

2 个答案:

答案 0 :(得分:1)

我现在设法解决了我的问题。事实证明,与巴克莱网站的CURL连接被服务器上的防火墙阻止,这就是我没有收到任何错误消息的原因。

我稍微修改了CURL代码以检查错误:

$data = curl_exec($ch); 

if(curl_errno($ch)) {
    print curl_error($ch);  
}

curl_close ($ch); 

然后说:无法连接到主机,此时我在另一台服务器上尝试了它并且它已经过了这个错误。

我现在得到的错误是:“执行请求的操作的权限不足。”我已经尝试了所有帐户,但是如果我登录EPDQ控制面板,我似乎只能分配EPDQ Level 4和CPI访问而没有提到MPI,尽管它说可以从早上8点到晚上12点,它不是。除了最基本的查询之外,其他任何事情都只是办公时间。

使用SagePay有什么好处吗? SagePay允许您通过单独的交易详细信息发送,巴克莱只允许您发送应付总金额,并且他们确实在办公时间之外提供支持。

我将网站更改为MPI的唯一原因是,使用CPI,客户可以在返回网站之前关闭浏览器,以便不会发送订单详细信息和发票,因此无法知道已购买的内容

由于 罗宾

答案 1 :(得分:0)

你好,在这里玩了一些正确的CURL设置你必须做...

我意识到变量可能会更好,我应该把它作为一个对象,但我只想在那里快速回答。该脚本还需要筛选不同的接受和错误消息,但这是我到目前为止所得到的......

$ch = curl_init();
$url = "https://secure2.epdq.co.uk:11500"; // Don't need to add curl_setopt($curlSession, CURLOPT_PORT, 443); as port is included
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); // $vars is your XML 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$data = curl_exec($ch);
curl_close ($ch);

$xml = new domDocument;
$xml->loadXML($data);

if (!$xml) {
    echo 'Error while parsing the document - Please Contact to determine if payment has gone though';
    exit;
}

$x = $xml->getElementsByTagName( "CcErrCode" );
$approved = $x->item(0)->nodeValue;

$xx = $xml->getElementsByTagName( "CcReturnMsg" );
$CcReturnMsg = $xx->item(0)->nodeValue;

if($approved) {

// the card is valid.
    $y = $xml->getElementsByTagName( "Id" );
    $BCardId = $y->item(1)->nodeValue;

    $z = $xml->getElementsByTagName( "MessageList" );
    $MessageList = $z->item(0)->nodeValue;

    $zz = $xml->getElementsByTagName( "AvsRespCode" );
    $AvsRespCode = $zz->item(0)->nodeValue;

    $zzz = $xml->getElementsByTagName( "AvsDisplay" );
    $AvsDisplay = $zzz->item(0)->nodeValue;

    $zzzz = $xml->getElementsByTagName( "ProcReturnMsg" );
    $ProcReturnMsg = $zzzz->item(0)->nodeValue;

     if($approved == "1"){
       echo "approved!<br />";
       echo "BCardId: " . $BCardId . ", MessageList=" . $MessageList . ", " . $AvsRespCode . ", " . $AvsDisplay . ", " . $ProcReturnMsg;
       die();
     }else{
       // raise that it's been partially accepted, 
       echo "partially approved";
       echo "BCardId: " . $BCardId . ", MessageList=" . $MessageList . ", " . $AvsRespCode . ", " . $AvsDisplay . ", " . $ProcReturnMsg;
       die();
     }

}else{
   echo "you have been completely knocked back";
   $zzzzz = $xml->getElementsByTagName( "Text" );
   $BCard_Text = $zzzzz->item(0)->nodeValue;
   echo "The reason:" . $BCard_Text;    
   die();
}

希望这有助于其他需要设置的人!