بي أتش بي ::محاكاة <form Method=“post”>، وإعادة توجيه المستخدم إلى الصفحة

StackOverflow https://stackoverflow.com/questions/104872

  •  01-07-2019
  •  | 
  •  

سؤال

أنا أعمل على PHP التطبيق الذي يرتبط في Protx VSP Direct payment gateway.للتعامل مع طلبات "3D Secure" من شركة معالجة بطاقات الائتمان، أحتاج إلى إعادة توجيه المستخدم إلى موقع ويب مختلف، وتقليد النموذج الذي تم نشره.أحاول استخدام cURL المكتبات، ولكن يبدو أنها واجهت مشكلة.الكود الخاص بي هو التالي:

<?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);  
?>  

كل ما يفعله هذا هو الحصول على محتوى عنوان URL الذي تم تمريره، ولا يعيد توجيه المستخدم إلى أي مكان.لقد حاولت البحث عبر Google والقراءة بقدر ما أستطيع، لكن لا يمكنني معرفة ما أفتقده.أيه أفكار؟لا أريد أن أضطر إلى إنشاء نموذج HTML يرسل نفسه تلقائيًا إذا كان بإمكاني تجنبه.

شكرا على اي مساعدة :-)

هل كانت مفيدة؟

المحلول

لا تسمح لك واجهة 3D Secure API بتنفيذ الطلب في الخلفية.تحتاج إلى إعادة توجيه المستخدم إلى الموقع الآمن ثلاثي الأبعاد.استخدم جافا سكريبت لإرسال النموذج الخاص بك تلقائيًا.إليك ما يقترحه مزود الخدمة لدينا:

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

نصائح أخرى

أعتقد أنك في حيرة من أمرك بشأن ما يفعله الضفيرة.إنه يفعل بالضبط ما شرحته، فهو يعمل كمتصفح ويقوم بالاتصال بالموقع ويعيد محتوى هذا المنشور.لا أعرف بأي طريقة يمكنك من خلالها إعادة توجيه جانب خادم المتصفح وتمثيل منشور.سأقوم بالفعل بإنشاء حل جافا سكريبت للقيام بهذا الشيء.

لإعادة توجيه مستخدم إلى صفحة أخرى في PHP، يمكنك إرسال ملف header("Location: http://example.com/newpage");.ومع ذلك، لسوء الحظ، فإن إعادة توجيه برنامجك تتسبب في إزالة جميع متغيرات POST (لأسباب أمنية).إذا كنت تريد أن تجعل متصفح المستخدم يرسل طلب POST إلى عنوان URL مختلف، فسيتعين عليك إنشاء نموذج يرسل نفسه.:(

أفضّل استخدام شيء خلف الكواليس مثل cURL، حيث لا يمكنني ضمان تمكين JS للمستخدمين، كما أن عرض النموذج يسبب بعض المشكلات الأخرى التي أفضل تجنبها.إنها خطتي ب بالرغم من ذلك ؛-)

يمكنك استخدام fsockopen() لإعادة التوجيه إلى موقع الويب الجديد مع الحفاظ على متغيرات POST الخاصة بك.هناك برنامج تعليمي جيد حول كيفية تحقيق ذلك هنا.

في حالة قيام وحش الإنترنت باستهلاك موقع الويب هذا، فقد قمت بنسخ الوظيفة ولصقها ولكن أقترح التحقق من موقع الويب الأصلي لمعرفة السياق.

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

آه، إذا أسأت فهم ما يفعله cURL، فأعتقد أنني سأقبل نموذج HTML مع الإرسال التلقائي لـ JS.يخلق لي المزيد من العمل، لكن إذا كانت هذه هي الطريقة الوحيدة، فسأضطر إلى القيام بذلك.

شكرا لمساعتكم جميعا.

أعتقد أنه في هذه الحالة تحتاج إلى استخدام نموذج.يجب زيارة الموقع الإلكتروني لشركات الدفع بالبطاقة من خلال متصفح المستخدم، وليس من خلال الرمز الموجود على جانب الخادم.

نعم، يعد التكامل مع برنامج 3dsecure وما إلى ذلك أمرًا مزعجًا للغاية، ولكنها توفر تعزيزًا أمنيًا حقيقيًا - استخدمها كما هو مقصود منها.

ربما أفتقد شيئًا ما؛يبدو أنك تحاول تلقي بيانات المستخدم، وإعادة توجيهها عبر cURL إلى معالج الدفع، ثم إعادة توجيه المستخدم إلى مكان ما.يمين؟

إذا كان الأمر كذلك، فكل ما عليك فعله هو وضع هذا في نهاية الكود الخاص بك:

رأس ("الموقع: http://www.yoursite.com/yoururl");

ومع ذلك، لكي ينجح هذا الأمر، لا يمكن للبرنامج النصي إرسال أي شيء إلى العميل أثناء معالجته؛وهذا يعني أنه لا ينبغي تنفيذ البرنامج النصي في منتصف القالب، وهناك مسافة بيضاء في بداية الملف قبل علامة الفتح.

إذا كنت بحاجة إلى حفظ البيانات من معاملة POST الأصلية، فاستخدم جلسة لحفظها.

يجب أن يعمل هذا من أجل حل خالٍ من JS.

قد أكون مخطئًا تمامًا ولكن يبدو أنك تحاول القيام بشيء مشابه لنمط الوكيل.

لقد قمت بتنفيذ أنماط مماثلة للمواقع الأخرى التي عملت معها، وهي تتطلب القليل من التعديل للوصول إلى المستوى الصحيح.

لقد قمت بتعيين RETURN_TRANSFER على TRUE حتى تتمكن من تحليل الاستجابة المستردة واتخاذ إجراءات على مستوى التطبيق بناءً عليها.

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

حظ سعيد.

لقد وجدت وظيفة sendToHost() أعلاه مفيدة جدًا، ولكن هناك خطأ مطبعي في المصدر استغرق تصحيحه بعض الوقت:تحتوي قيمة رأس نوع المحتوى على مسافة بين "form-" و"urlencoded" - ويجب أن تكون "application/x-www-form-urlencoded"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top