整合paypal

时间:2011-08-25 10:15:32

标签: html paypal

我已经成功整合了paypal帐户。一切都很好。但我希望当付款成功转移然后重定向到我的网站。另一个问题如何从贝宝获得回应?  这是我的贝宝形式。感谢

   `<form action="https://sandbox.paypal.com/cgi-bin/webscr" method="post">  
    <input type="hidden" name="business" value="savife_1314264698_biz@gmail.com ">  
    <input type="hidden" name="cmd" value="_xclick-subscriptions">  
    <input type="hidden" name="item_name" value="Alice's Weekly Digest">  
    <input type="hidden" name="item_number" value="DIG Weekly">  
    <input type="hidden" name="currency_code" value="USD">  
    <input type="hidden" name="notify_url" value="http://localhost/check.php">
    <input type="hidden" name="return" value="http://google.co.in">
    <input type="hidden" name="a3" value="5.00">  
    <input type="hidden" name="p3" value="1">  
    <input type="hidden" name="t3" value="M">  

    <!-- Display the payment button. -->  
    <input type="image" name="submit" border="0" src="btn_subscribe_LG.gif" alt="PayPal - The safer, easier way to pay online">  
    <img alt="" border="0" width="1" height="1" src="https://www.paypal.com/en_US/i/scr/pixel.gif" >  
</form>

3 个答案:

答案 0 :(得分:8)

请仔细阅读:

您想要的是PAYPAL IPN,即时支付通知,在付款完成后发送到用户的网站。

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro

或者您也可以在购物车中设置IPN路径,PayPal会发送这样的通知:

<input type="hidden" name="notify_url" value="site.com/ipn/index.php" />
<input type="hidden" name="return"     value="site.com/ipn/index.php"/>

但是您需要在paypal上登录您的商家帐户才能手动指定ipn和自动返回网址。在配置文件选项卡下的网站付款首选项和即时付款通知部分。

我已经添加了成功付款后发送到您网站的示例ipn代码:

// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];

if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
}
fclose ($fp);
}
?>

您需要在通知网址页面上添加此代码。你在购物车的通知网址中提到的退货页面,即

<input type="hidden" name="notify_url" value="site.com/ipn/index.php" />

将此代码放入site.com/ipn/index.php

让我们举一个购物车的例子:

<form action="https://sandbox.paypal.com/cgi-bin/webscr" method="post">  
    <input type="hidden" name="business" value="savife_1314264698_biz@gmail.com ">  
    <input type="hidden" name="cmd" value="_xclick-subscriptions">  
    <input type="hidden" name="item_name" value="Alice's Weekly Digest">  
    <input type="hidden" name="item_number" value="DIG Weekly">  
    <input type="hidden" name="currency_code" value="USD">  
    <input type="hidden" name="notify_url" value="http://localhost/check.php">
    <input type="hidden" name="return" value="http://google.co.in">
    <input type="hidden" name="a3" value="5.00">  
    <input type="hidden" name="p3" value="1">  
    <input type="hidden" name="t3" value="M">  

    <!-- Display the payment button. -->  
    <input type="image" name="submit" border="0" src="btn_subscribe_LG.gif" alt="PayPal - The safer, easier way to pay online">  
    <img alt="" border="0" width="1" height="1" src="https://www.paypal.com/en_US/i/scr/pixel.gif" >  
</form>

在这种情况下,paypal将发送ipn的通知网址为http://localhost/check.php

所以将该代码放在check.php页面中。收到ipn后,您可以进一步使用它进入您的数据库等。

或访问此链接以获取paypal ipn listener的概述:

https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNImplementation

希望这有帮助。

答案 1 :(得分:2)

您可以使用notify_url for paypal在付款时向您网站上的脚本发送IPN回复。使用此隐藏字段。

<input type="hidden" name="notify_url" value="yourwebsite.com/paypal/process" />

现在,当用户付费时,paypal会向您的网站发送IPN。

对于Return,您可以使用:

<input type="hidden" name="return" value="path.to/return/website/"/> // After successful payment
<input type="hidden" name="cancel_return" value=""/> // If user cancels where to redirect to.

答案 2 :(得分:1)

你可以像这样设置paypal notify_url(IPN Response url)和成功网址:

<input type="hidden" name="notify_url" value="http://localhost/demo/payment.php/ipn_response">                                            
<input type="hidden" name="return" value="http://localhost/demo/payment_successful">

获得Paypal回复paypal.php

     function ipn($ipn_data) {

    define('SSL_P_URL', 'https://www.paypal.com/cgi-bin/webscr');
    define('SSL_SAND_URL', 'https://www.sandbox.paypal.com/cgi-bin/webscr');
    $hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
    if (!preg_match('/paypal\.com$/', $hostname)) {
        $ipn_status = 'Validation post isn\'t from PayPal';
        if ($ipn_data == true) {
            //You can send email as well
        }
        return false;
    }

    // parse the paypal URL
    $paypal_url = ($_REQUEST['test_ipn'] == 1) ? SSL_SAND_URL : SSL_P_URL;
    $url_parsed = parse_url($paypal_url);

    $post_string = '';
    foreach ($_REQUEST as $field => $value) {
        $post_string .= $field . '=' . urlencode(stripslashes($value)) . '&';
    }
    $post_string.="cmd=_notify-validate"; // append ipn command
    // get the correct paypal url to post request to
    $paypal_mode_status = $ipn_data; //get_option('im_sabdbox_mode');
    if ($paypal_mode_status == true)
        $fp = fsockopen('ssl://www.sandbox.paypal.com', "443", $err_num, $err_str, 60);
    else
        $fp = fsockopen('ssl://www.sandbox.paypal.com', "443", $err_num, $err_str, 60);

    $ipn_response = '';

    if (!$fp) {
        // could not open the connection. If loggin is on, the error message
        // will be in the log.
        $ipn_status = "fsockopen error no. $err_num: $err_str";
        if ($ipn_data == true) {
            echo 'fsockopen fail';
        }
        return false;
    } else {
        // Post the data back to paypal
        fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n");
        fputs($fp, "Host: $url_parsed[host]\r\n");
        fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
        fputs($fp, "Content-length: " . strlen($post_string) . "\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        fputs($fp, $post_string . "\r\n\r\n");

        // loop through the response from the server and append to variable
        while (!feof($fp)) {
            $ipn_response .= fgets($fp, 1024);
        }
        fclose($fp); // close connection
    }
    // Invalid IPN transaction. Check the $ipn_status and log for details.
    if (!preg_match("/VERIFIED/s", $ipn_response)) {
        $ipn_status = 'IPN Validation Failed';

        if ($ipn_data == true) {
            echo 'Validation fail';
            print_r($_REQUEST);
        }
        return false;
    } else {
        $ipn_status = "IPN VERIFIED";
        if ($ipn_data == true) {
            echo 'SUCCESS';
            print_r($_REQUEST);
        }
        return true;
    }
}

function ipn_response() {
    //mail("sobhagya1411@gmail.com","My subject",print_r($request,true));
    $ipn_data = true;
    if ($this->ipn($_REQUEST)) {
        $this->insert_data($_REQUEST);
    }
}

function issetCheck($post, $key) {
    if (isset($post[$key])) {
        $return = $post[$key];
    } else {
        $return = '';
    }
    return $return;
}


 public function insert_data(){

     $post = $_REQUEST;    

    $item_name= $this->issetCheck($post, 'item_name');         
    $amount = $this->issetCheck($post, 'mc_gross');
    $currency = $this->issetCheck($post, 'mc_currency');
    $payer_email = $this->issetCheck($post, 'payer_email');
    $first_name = $this->issetCheck($post, 'first_name');
    $last_name = $this->issetCheck($post, 'last_name');
    $country = $this->issetCheck($post, 'residence_country');
    $txn_id = $this->issetCheck($post, 'txn_id');
    $txn_type = $this->issetCheck($post, 'txn_type');
    $payment_status = $this->issetCheck($post, 'payment_status');
    $payment_type = $this->issetCheck($post, 'payment_type');
    $payer_id = $this->issetCheck($post, 'payer_id');
    $create_date = date('Y-m-d H:i:s');
    $payment_date = date('Y-m-d H:i:s');

    $paypal_sql = "INSERT INTO ipn_data_tbl (item_name,payer_email,first_name,last_name,amount,currency,country,txn_id,txn_type,payer_id,payment_status,payment_type,create_date,payment_date)
    VALUES ($item_name,'$payer_email','$first_name','$last_name','$amount','$currency','$country','$txn_id','$txn_type','$payer_id','$payment_status','$payment_type','$create_date','$payment_date')";
    mysql_query($paypal_sql); 

}