2010-02-11 3 views
0

Salut im essayant de se connecter à intégrer mon formulaire à un fournisseur de paiement, mais im obtenir URL non autorisée et il se trouve que le HTTP_REFERER ne se trouve pas ..php, le HTTP_REFERER pas trouvé

#the following function performs a HTTP Post and returns the whole response 
function pullpage($host, $usepath, $postdata = "") { 

# open socket to filehandle(epdq encryption cgi) 
$fp = fsockopen($host, 80, &$errno, &$errstr, 60); 

#check that the socket has been opened successfully 
if(!$fp) { 
    print "$errstr ($errno)<br>\n"; 
} 
else { 

    #write the data to the encryption cgi 
    fputs($fp, "POST $usepath HTTP/1.0\n"); 
    $strlength = strlen($postdata); 
    fputs($fp, "Content-type: application/x-www-form-urlencoded\n"); 
    fputs($fp, "Content-length: ".$strlength."\n\n"); 
    fputs($fp, $postdata."\n\n"); 

    #clear the response data 
    $output = ""; 


    #read the response from the remote cgi 
    #while content exists, keep retrieving document in 1K chunks 
    while(!feof($fp)) { 
     $output .= fgets($fp, 1024); 
    } 

    #close the socket connection 
    fclose($fp); 
} 

#return the response 
return $output; 
} 

#define the remote cgi in readiness to call pullpage function 
$server="secure2.epdq.co.uk"; 
$url="/cgi-bin/CcxBarclaysEpdqEncTool.e"; 

#the following parameters have been obtained earlier in the merchant's webstore 
#clientid, passphrase, oid, currencycode, total 
$params="clientid=xxx"; 
$params.="&password=xxxx"; 
$params.="&oid=xxxx"; 
$params.="&chargetype=Auth"; 
$params.="&currencycode=826"; 
$params.="&total=120"; 

#perform the HTTP Post 
$response = pullpage($server,$url,$params); 

#split the response into separate lines 
$response_lines=explode("\n",$response); 

#for each line in the response check for the presence of the string 'epdqdata' 
#this line contains the encrypted string 
$response_line_count=count($response_lines); 
for ($i=0;$i<$response_line_count;$i++){ 
    if (preg_match('/epdqdata/',$response_lines[$i])){ 
     $strEPDQ=$response_lines[$i]; 
    } 
} 


<FORM action="https://secure2.epdq.co.uk/cgi-bin/CcxBarclaysEpdq.e" method="POST"> 
<?php print "$strEPDQ"; ?> 
<INPUT type="hidden" name="returnurl" value="http://www.xxxxxx.co.uk/test/confirm.php"> 
<INPUT type="hidden" name="merchantdisplayname" value="xx xxx"> 
<INPUT type=hidden name=baddr1 value="address line 1"> 
<INPUT type=hidden name=baddr2 value="address line 2"> 
<INPUT type=hidden name=baddr3 value="address line 3"> 
<INPUT type=hidden name=bcity value="City"> 
<INPUT type=hidden name=bcountyprovince value="County"> 
<INPUT type=hidden name=bpostalcode value="Postcode"> 
<INPUT type=hidden name=bcountry value="GB"> 
<INPUT type=hidden name=btelephonenumber value="01111"> 
<INPUT type=hidden name=email value="xxxxx"> 
<INPUT type=hidden name=saddr1 value="Address line 1"> 
<INPUT type=hidden name=saddr2 value="Address line 2"> 
<INPUT type=hidden name=saddr3 value="Address line 3"> 
<INPUT type=hidden name=scity value="City"> 
<INPUT type=hidden name=scountyprovince value="County"> 
<INPUT type=hidden name=spostalcode value="Postcode"> 
<INPUT type=hidden name=scountry value="GB"> 
<INPUT type=hidden name=stelephonenumber value="01111"> 
<INPUT TYPE="submit" VALUE="purchase"> 
</FORM> 

quelqu'un peut-il aider ?

+3

Ce n'est pas clair pour moi comment le referer s'inscrit dans ce que vous faites. Qui se plaint à ce sujet? Le site distant, ou vous? Il n'y a aucune garantie qu'un référent existe toujours; vous ne pouvez pas compter dessus pour n'importe quoi fondamentalement. – Joe

+0

oui vraiment aucune idée .. le site distant se plaint à ce sujet .. – bob

Répondre

1

Je pense que certains des autres articles traitent directement du problème que vous voyez, mais je vous suggère d'utiliser CURL (http://php.net/manual/en/book.curl.php) pour ce que vous essayez de faire au lieu d'ouvrir manuellement une connexion socket . Votre fournisseur de paiement pourrait même avoir des exemples de code pour cela en PHP. En règle générale, il s'agit d'une meilleure façon de gérer la communication avec les passerelles et d'avoir beaucoup plus de flexibilité. Cela sera particulièrement utile si vous intégrez plusieurs passerelles car la plupart ont des exemples de code CURL, et vous trouverez d'autres utilisations dans le futur.

EDIT:

Encore mieux que le manuel PHP - ce site le rend beaucoup plus clair comment l'utiliser, y compris des routines auth, en passant vars de poste, etc avec des exemples:

http://devzone.zend.com/article/1081

+0

J'ai posté cette réponse alors que le formatage a été levé - mais la suggestion s'applique toujours. =) – Shane

0
fputs($fp, "Referer: ".$somereferer."\n"); 
0

Je pense que vous avez oublié l'en-tête Host:. Mais, il existe de meilleures façons de POSTER quelque chose via HTTP que d'ouvrir une socket et d'implémenter votre propre client HTTP. Essayez curl.