PHP sayfası kullanıcıyı yönlendirme,
taklit ::

10 Cevap php


I'm working on a PHP application that links into the Protx VSP Direct payment gateway. To handle "3D Secure" requests from the credit card processing company, I need to forward the user to a different website, mimicking a form that has been posted. I'm trying to use the cURL libraries, but seem to have hit a problem. My code is the following:

<?php  
$ch = curl_init();  
// Set the URL  
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/');  
// Perform a POST  
curl_setopt($ch, CURLOPT_POST, 1);  
// If not set, curl prints output to the browser  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);   
// Set the "form fields"  
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);  
$output = curl_exec($ch);  
curl_close($ch);  
?>

Bütün bu geçti URL içeriğini kapmak olduğunu yapar, ve her yerde kullanıcı iletmediği. Googling ve kadar ben olabildiğince yukarı okuma denedim, ama ben eksik anlamaya olamaz. Herhangi bir fikir? Ben bunu önleyebilirsiniz eğer kendisi otomatik gönderen bir HTML formu oluşturmak zorunda istemiyorum.

Herhangi bir yardım :-) için teşekkürler

10 Cevap

3D Secure API arka planda isteği yapmak için izin vermez. Sen 3D secure siteye kullanıcıyı iletmek gerekir. Otomatik formu göndermek için javascript kullanın. İşte sağlayıcı anlaşılacağı ne:

<html> 
<head> 
<title>Processing your request...</title> 
</head> 
<body OnLoad="OnLoadEvent();"> 
<form name="downloadForm" action="<%=RedirURL%>" method="POST"> 
<noscript> 
<br> 
<br> 
<div align="center"> 
<h1>Processing your 3-D Secure Transaction</h1> 
<h2>JavaScript is currently disabled or is not supported by your browser.</h2><BR> 
<h3>Please click Submit to continue the processing of your 3-D Secure transaction.</h3><BR> 
<input type="submit" value="Submit"> 
</div> 
</noscript> 
<input type="hidden" name="PaReq" value="<%=PAREQ%>"> 
<input type="hidden" name="MD" value="<%=TransactionID%>"> 
<input type="hidden" name="TermUrl" value="<%=TermUrl%>"> 
</form> 
<SCRIPT LANGUAGE="Javascript"> 
<!-- 
function OnLoadEvent() { 
 document.downloadForm.submit(); 
} 
//--> 
</SCRIPT> 
</body> 
</html>

Ben kıvırmak ne gibi biraz karışık olduğunu düşünüyorum. Bu, size izah tam olarak ne yapar bu tür bir tarayıcı gibi davranır ve siteye çağrı yapar ve bu yazının içeriğini döndürür. Ben aslında tarayıcı, sunucu tarafı yönlendirme ve bir yazı temsil eden herhangi bir şekilde bilmiyorum. Ben aslında böyle bir şey yapmak için bir JavaScript çözümü yaratacak.

Ancak, ne yazık ki programı yönlendirme neden için tüm POST değişkenleri) güvenlik nedenleriyle (kaldırılacak Eğer sen,.., Bir header("Location: http://example.com/newpage ") gönderebilir PHP başka bir sayfaya kullanıcıyı yönlendirmek için Farklı bir URL'ye POST isteği göndermek için kullanıcının tarayıcısını neden istiyorum, sen kendini gönderen bir form oluşturmak gerekir:. (

Ben daha çok benim kullanıcıları JS etkin olacak garanti edemez gibi, cURL gibi perde arkasında bir şey kullanmak, ve bir form görüntüleyen doğrusu önleyeceğini diğer bazı sorunlara neden olur. Gerçi benim plan B var ;-)

Eğer POST değişkenleri koruyarak yeni web sitesine yönlendirmek için () fsockopen kullanabilirsiniz. Bu here gerçekleştirmek için nasıl iyi bir öğretici var.

Web sitesi İnternet canavar tarafından yemiş olur bu durumda, ben kopyaladım ve işlevi yapıştırılan ama bağlam için orijinal web sitesine göz atmanızı öneririm ettik.

function sendToHost($host,$method,$path,$data,$useragent=0)
{
    // Supply a default method of GET if the one passed was empty
    if (empty($method)) {
        $method = 'GET';
    }
    $method = strtoupper($method);
    $fp = fsockopen($host, 80);
    if ($method == 'GET') {
        $path .= '?' . $data;
    }
    fputs($fp, "$method $path HTTP/1.1\r\n");
    fputs($fp, "Host: $host\r\n");
    fputs($fp,"Content-type: application/x-www-form- urlencoded\r\n");
    fputs($fp, "Content-length: " . strlen($data) . "\r\n");
    if ($useragent) {
        fputs($fp, "User-Agent: MSIE\r\n");
    }
    fputs($fp, "Connection: close\r\n\r\n");
    if ($method == 'POST') {
        fputs($fp, $data);
    }

    while (!feof($fp)) {
        $buf .= fgets($fp,128);
    }
    fclose($fp);
    return $buf;
}

Ben cURL ne yanlış var ise, ah, ben JS otomatik teslim olan bir HTML formu razı olurum sanırım. Benim için biraz daha fazla iş yaratır, ama tek yolu ise, bunu yapmak zorunda olacak.

Yardım Herşey için teşekkürler.

Ben bu durumda bir form kullanmak gerekir düşünüyorum. Kartlı ödeme şirketleri web sitesi, sunucu tarafı kodu değil, kullanıcının tarayıcısı tarafından ziyaret edilmesi gerekmektedir.

Evet, 3DSecure vb ile entegre oldukça can sıkıcı, ama onlar gerçek bir güvenlik destek sağlamak - bu niyetiyle olarak kullanabilirsiniz.

Belki de ben bir şey eksik; Eğer kullanıcı verileri almak ödeme işlemci cURL yoluyla iletmek, ve sonra bir yerde kullanıcıyı yönlendirmek için çalışıyoruz gibi görünüyor. Değil mi?

Eğer öyleyse, tüm yapmanız gereken sadece kodun sonunda bu koymak:

header ("Location: http://www.yoursite.com/yoururl");

Bu işlem iken Ancak, bu iş için, komut istemci şey göndermez OLAMAZ; Bu komut bir şablonun ortasında idam olmamalı ve başka yakaladım açmadan etiketinden önce dosyanın başında boşluk olduğu anlamına gelir.

Eğer orijinal POST işlem verileri kaydetmek gerekiyorsa, onu kurtarmak için bir oturumu kullanın.

Bu bir JS-ücretsiz bir çözüm için çalışması gerekir.

Ben tamamen yanlış olabilir ama proxy Desen benzer bir şey yapmaya çalışıyoruz gibi geliyor.

Ben birlikte çalıştığım ve doğru almak için etrafında müdahalesi biraz gerektirir diğer siteler için benzer modeller hayata geçirdik.

Eğer alınan yanıt analiz ve buna bağlı olarak uygulama düzeyinde eylemler yapmak, böylece ben TRUE RETURN_TRANSFER bırakacağım.

http://en.wikipedia.org/wiki/Proxy_pattern

İyi şanslar.

Ben sendToHost çok yararlı yukarıdaki () işlevi bulundu, ancak hata ayıklama için biraz zaman aldı kaynağında bir yazım hatası vardır: Content-type üstbilgisi değeri 'form' ve 'urlencoded' arasında bir boşluk içeriyor - / 'uygulaması olmalı 'x-www-form-urlencoded