() translation by (you can also view the original English article)
Xin chào! Hôm nay chúng ta sẽ kết hợp Paypal với PHP để cho phép dễ dàng xử lý các khoản thanh toán trên website của bạn.
Thành phẩm: Xem trước
Bước 1 - Tạo tài khoản PayPal
Với hướng dẫn này, bạn sẽ cần một tài khoản PayPal Premier và một website online. Bắt đầu bằng cách truy cập paypal.com và nhấp vào "Signup" ở đầu trang.



Nhấp vào Get Started dưới Premier Title; bạn sẽ được chuyển đến signup form (form đăng ký). Vui lòng điền đầy đủ thông tin cần thiết. Khi tài khoản của bạn đã được tạo ra, hãy đăng nhập và chuyển sang bước 2.
Bước 2 - Kích hoạt IPN
Trong bước này, chúng tôi sẽ kích hoạt Instant Payment Notification (IPN) - thông báo thanh toán tức thì, vì vậy khi đăng nhập, vui lòng nhấp vào Profile và sau đó chọn Instant Payment Notifcation



Bây giờ trên màn hình tiếp theo, bạn sẽ thấy rằng IPN được chuyển thành "off"; nhấp vào "Edit" để thay đổi.



Khi bắt đầu hướng dẫn này, tôi đã đề cập rằng bạn sẽ cần một website online. Tại sao? Vâng, chúng tôi sẽ yêu cầu PayPal gửi cho chúng tôi dữ liệu khi thanh toán hoàn tất. PayPal không thể truy cập các website được lưu trữ cục bộ trừ khi bạn có tất cả các cài đặt được định cấu hình chính xác. (Điều này ảnh hướng đến việc mở cổng trên router của bạn). Vì vậy, tôi sẽ nhập url vào script xác thực của tôi, ví dụ: http://www.yourdomain.com/PayPal/ipn.php. Sau đó, PayPal sẽ đăng thông báo lên server của tôi, tại URL tôi đã chỉ định.



Bước 3 - Xây dựng một trang HTML đơn giản
Được rồi, bây giờ chúng tôi cần một trang html đơn giản và cơ bản, đó là nơi khách truy cập của bạn có thể nhận quyền truy xuất vào khu vực downoad của bạn.
Tôi sẽ không giải thích về HTML vì tôi nghĩ bạn nên biết những điều cơ bản về HTML trước khi bạn bắt đầu với PHP.
index.php - Một trang HTML đơn giản với stylesheet.
1 |
|
2 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
4 |
<head>
|
5 |
<title>Nettuts.com | Purchase access to download area</title> |
6 |
<link rel="stylesheet" type="text/css" media="All" href="css/style.css" /> |
7 |
</head>
|
8 |
<body>
|
9 |
|
10 |
<div id="wrap"> |
11 |
<h3>Purchase Access</h3> |
12 |
<p>Please click the button below to receive login details for the download area. <br /> |
13 |
Already have an account? <a href="login.php">Login</a> here.</p> |
14 |
<!-- Paste your PayPal button code here (That you will get in the next step) -->
|
15 |
</div>
|
16 |
|
17 |
</body>
|
18 |
</html>
|
css/style.css - Style đơn giản cho Trang HTML của chúng tôi.
1 |
|
2 |
body{ |
3 |
background: #2D2D2D; /* Set Website Background Color */ |
4 |
font: 11px 'Verdana'; /* Set Website Font Size & Font Type */ |
5 |
}
|
6 |
|
7 |
#wrap{ |
8 |
margin: 0 auto; /* Center Our Content */ |
9 |
width: 500px; /* Set The Width For Our Content */ |
10 |
background: #FFF; /* Set Content Background Color */ |
11 |
padding: 10px; /* Set Padding For Content */ |
12 |
border: 1px solid #000; /* Add A Border Around The Content */ |
13 |
}
|



Bước 4 - Xây dựng PayPal Button
Chúng tôi cần tạo nút mua hàng, vì vậy vui lòng nhấp vào Merchant Services và sau đó chọn Website Payments Standard



Bạn có thể chọn ba loại button, Sell single items, Sell multiple items và Subscription. Bây giờ trong hướng dẫn này, chúng ta sẽ tạo một mục duy nhất. Khi ai đó mua mặt hàng này, trong trường hợp này, hãy truy cập vào khu vực download. Khi thanh toán đã được xác thực, một email sẽ được gửi kèm theo các chi tiết.



Hãy nhập một số thông tin cho button mua hàng của chúng ta; bạn có thể giữ nguyên phần còn lại.



Khi bạn đã hoàn thành từng phần, hãy tạo ra code. Sao chép code này vào clipboard của bạn và sau đó dán nó vào trong index.php - nơi tôi đã thêm nhận xét vào trang html. Vui lòng xem lại bước 3, nếu cần.



Kết quả nên hoàn hảo. Người dùng có thể nhấp vào button và hoàn tất giao dịch mua hàng của họ.
Bước 5 - Viết ipn.php
Đầu tiên, tạo mới ipn.php để chúng ta có thể bắt đầu. Chúng tôi sẽ sử dụng một snippet mà tôi đã tạo từ một snipper lớn hơn mà bạn có thể lấy từ website của Paypal.
Xin lưu ý rằng không có lý do để tìm hiểu code này điên rồ này! Đoạn code rất tiện dụng và tiết kiệm thời gian. Tôi sẽ chia nhỏ nó ra.
1 |
|
2 |
<?php
|
3 |
|
4 |
mysql_connect("localhost", "user", "password") or die(mysql_error()); |
5 |
mysql_select_db("PayPal") or die(mysql_error()); |
6 |
|
7 |
// read the post from PayPal system and add 'cmd'
|
8 |
$req = 'cmd=_notify-validate'; |
9 |
foreach ($_POST as $key => $value) { |
10 |
$value = urlencode(stripslashes($value)); |
11 |
$req .= "&$key=$value"; |
12 |
}
|
13 |
// post back to PayPal system to validate
|
14 |
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; |
15 |
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; |
16 |
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; |
17 |
|
18 |
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30); |
19 |
|
20 |
|
21 |
if (!$fp) { |
22 |
// HTTP ERROR
|
23 |
} else { |
24 |
fputs ($fp, $header . $req); |
25 |
while (!feof($fp)) { |
26 |
$res = fgets ($fp, 1024); |
27 |
if (strcmp ($res, "VERIFIED") == 0) { |
28 |
|
29 |
// PAYMENT VALIDATED & VERIFIED!
|
30 |
|
31 |
}
|
32 |
|
33 |
else if (strcmp ($res, "INVALID") == 0) { |
34 |
|
35 |
// PAYMENT INVALID & INVESTIGATE MANUALY!
|
36 |
|
37 |
}
|
38 |
}
|
39 |
fclose ($fp); |
40 |
}
|
41 |
?>
|
Vui lòng nhập thông tin chính xác cho cơ sở dữ liệu của bạn để chúng ta có thể chèn dữ liệu trong bước tiếp theo.
PayPal POSTS (đăng) dữ liệu đến url chúng ta chỉ định. Trong ví dụ này, chúng tôi chỉ cần địa chỉ email của người mua để chúng tôi có thể gửi cho anh ấy thông tin đăng nhập của anh ấy. Đoạn code trên sẽ đọc dữ liệu mà PayPal gửi và trả lại thông tin cho PayPal. Tôi đã thêm hai bình luận trong đó mã sẽ đến nếu nó được xác nhận. Ngoài ra, tôi cũng đã thêm một bình luận chỉ định những gì nên được thực hiện nếu nó không được xác nhận.
Bước 6 - Tạo cơ sở dữ liệu
Bây giờ chúng ta sẽ tập trung vấn đề xảy ra nếu thanh toán được xác thực. Đầu tiên, chúng ta cần xây dựng một bảng MySQL, nơi chúng ta lưu trữ thông tin người dùng. Chỉ đơn giản với một trường id, email và mật khẩu.



Tiếp theo, chúng ta phải nhập chi tiết bảng của chúng tôi; chúng ta cần một ID làm primary key và nó sẽ tự động tăng lên; tiếp theo là email và password.



Đối với những bạn không có thời gian để nhập tất cả các thông tin này, dưới đây là một code MySQL Dump để tạo lại bảng.
1 |
|
2 |
CREATE TABLE `users` ( |
3 |
`id` int(10) NOT NULL auto_increment, |
4 |
`email` varchar(50) NOT NULL, |
5 |
`password` varchar(32) NOT NULL, |
6 |
PRIMARY KEY (`id`) |
7 |
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; |
Bước 7 - Tạo tài khoản
Mở lại ipn.php. Chúng tôi sẽ viết code sau bên dưới dòng "//PAYMET VALIDATED".
Bước đầu tiên của chúng tôi là lấy địa chỉ email của người mua; PayPal gửi tất cả thông tin này đến ipn.php.
1 |
|
2 |
|
3 |
// PAYMENT VALIDATED & VERIFIED!
|
4 |
|
5 |
$email = $_POST['payer_email']; |
Chúng ta phải tạo một biến cuối cùng - đó là password mà chúng ta sẽ tạo ra bằng cách sử dụng php.
1 |
|
2 |
// PAYMENT VALIDATED & VERIFIED!
|
3 |
|
4 |
$email = $_POST['payer_email']; |
5 |
$password = mt_rand(1000, 9999); |
Như bạn có thể thấy, chúng tôi đã sử dụng mt_rand để tạo mật khẩu ngẫu nhiên - trong trường hợp này là giá trị số từ 1000 đến 9999. Tiếp theo, chúng ta cần chèn dữ liệu này vào cơ sở dữ liệu của mình. Để làm như vậy, chúng tôi sẽ sử dụng truy vấn mysql insert.
1 |
|
2 |
// PAYMENT VALIDATED & VERIFIED!
|
3 |
|
4 |
$email = $_POST['payer_email']; |
5 |
$password = mt_rand(1000, 9999); |
6 |
|
7 |
mysql_query("INSERT INTO users (email, password) VALUES('". mysql_escape_string($email) ."', '".md5($password)."' ) ") or die(mysql_error()); |
Ở đây chúng tôi nói kịch bản của chúng tôi để chèn email và mật khẩu vào cơ sở dữ liệu của chúng tôi. Tôi đã thêm một mysql_escape_string để đảm bảo rằng vấn đề mysql injection không thể xảy ra. Tôi cũng đã thêm hàm md5 vào password của chúng tôi để nó sẽ được lưu trữ dưới dạng hash 32 ký tự. Bây giờ tài khoản đã tạo; hãy sang bước tiếp theo.
Bước 8 - Gửi email thông tin đăng nhập
Chúng tôi cần viết code để gửi thông tin đăng nhập qua email cho người mua. Để thực hiện điều này, chúng tôi sẽ sử dụng hàm mail php.
1 |
|
2 |
// PAYMENT VALIDATED & VERIFIED!
|
3 |
|
4 |
$email = $_POST['payer_email']; |
5 |
$password = mt_rand(1000, 9999); |
6 |
|
7 |
mysql_query("INSERT INTO users (email, password) VALUES('". mysql_escape_string($email) ."', '".md5($password)."' ) ") or die(mysql_error()); |
8 |
|
9 |
$to = $email; |
10 |
$subject = 'Download Area | Login Credentials'; |
11 |
$message = ' |
12 |
|
13 |
Thank you for your purchase
|
14 |
|
15 |
Your account information
|
16 |
-------------------------
|
17 |
Email: '.$email.' |
18 |
Password: '.$password.' |
19 |
-------------------------
|
20 |
|
21 |
You can now login at http://yourdomain.com/PayPal/'; |
22 |
$headers = 'From:noreply@yourdomain.com' . "\r\n"; |
23 |
|
24 |
mail($to, $subject, $message, $headers); |
Hãy chia nhỏ hàm email này. Chúng tôi sử dụng biến $email để nhận địa chỉ email của người dùng và gán nó cho biến $to.
Biến $subject là tiêu đề/chủ đề mà bạn sẽ thấy trong chương trình email của bạn. Sau này, chúng tôi đưa thông điệp của chúng tôi vào, trong đó sẽ có một lời cảm ơn bạn cũng như các thông tin tài khoản. Biến $email và $mật khẩu trong thông điệp sẽ thay đổi thành thông tin chính xác khi email đã được gửi đi. Chúng tôi cũng đã thiết lập một custom header. Khi người dùng nhận được email, địa chỉ "from" sẽ hiển thị là "noreply@yourdomain.com".
Bước 9 - Email thanh toán không hợp lệ
Một khoản thanh toán không hợp lệ có thể xảy ra do gian lận, mà còn vì một vấn đề với PayPal; vì vậy chúng tôi muốn đảm bảo rằng khách hàng của chúng tôi nhận được những gì anh ta đã thanh toán.
Vì vậy, chúng tôi sẽ gửi email đến quản trị viên website của chúng tôi, yêu cầu anh ấy liên hệ với người mua để biết thêm thông tin. Chỉ cần sao chép code email mà chúng tôi đã sử dụng trước đó và sau đó thực hiện các thay đổi được liệt kê bên dưới.
1 |
|
2 |
// PAYMENT INVALID & INVESTIGATE MANUALY!
|
3 |
|
4 |
$to = 'invalid@yourdomain.com'; |
5 |
$subject = 'Download Area | Invalid Payment'; |
6 |
$message = ' |
7 |
|
8 |
Dear Administrator,
|
9 |
|
10 |
A payment has been made but is flagged as INVALID.
|
11 |
Please verify the payment manualy and contact the buyer.
|
12 |
|
13 |
Buyer Email: '.$email.' |
14 |
'; |
15 |
$headers = 'From:noreply@yourdomain.com' . "\r\n"; |
16 |
|
17 |
mail($to, $subject, $message, $headers); |
Code này gần giống như trên, chỉ chúng tôi thực hiện một số thay đổi đối với người nhận, chủ đề và thông báo.
Bước 10 - Người dùng đăng nhập
Đây là bước cuối cùng, ở đây chúng tôi xây dựng một form đăng nhập đơn giản cho người mua của chúng tôi. Tạo một file php mới và đặt tên là login.php. Chúng tôi sẽ sử dụng cùng một trang HTML đã được sử dụng cho index.php, chúng tôi chỉ sẽ điều chỉnh một số nội dung của trang và tất nhiên bổ sung ít style cho form đăng nhập của chúng tôi.
login.php - Đây là trang mà người mua của chúng tôi có thể đăng nhập.
1 |
|
2 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
4 |
<head>
|
5 |
<title>Nettuts.com | Login</title> |
6 |
<link rel="stylesheet" type="text/css" media="All" href="css/style.css" /> |
7 |
</head>
|
8 |
<body>
|
9 |
|
10 |
<div id="wrap"> |
11 |
<h3>Login</h3> |
12 |
<p>Please enter your login credentials to get access to the download area</p> |
13 |
|
14 |
<form method="post" action="" > |
15 |
<fieldset>
|
16 |
<label for="email">Email:</label><input type="text" name="email" value="" /> |
17 |
<label for="password">Password:</label><input type="text" name="password" value="" /> |
18 |
<input type="submit" value="Login" /> |
19 |
</fieldset>
|
20 |
</form>
|
21 |
|
22 |
</div>
|
23 |
|
24 |
</body>
|
25 |
</html>
|
Bổ sung style.css
1 |
|
2 |
label{ |
3 |
display: block; /* Make sure the label is on a single line */ |
4 |
margin: 3px; /* Create some distance away from the input fields */ |
5 |
}
|
6 |
|
7 |
input{ |
8 |
padding: 3px; /* Give the text some more space */ |
9 |
border: 1px solid gray; /* Add a border around the input fields */ |
10 |
margin: 3px; /* Create some distance away from the labels */ |
11 |
}
|



Bây giờ chúng tôi đã tạo form của mình, chúng tôi cần kiểm tra xem thông tin xác thực đăng nhập có chính xác hay không. Tôi đã thay đổi login.php để chúng ta có thể bắt đầu:
1 |
|
2 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
4 |
<head>
|
5 |
<title>Nettuts.com | Login</title> |
6 |
<link rel="stylesheet" type="text/css" media="All" href="css/style.css" /> |
7 |
</head>
|
8 |
<body>
|
9 |
|
10 |
<div id="wrap"> |
11 |
|
12 |
<?php
|
13 |
|
14 |
mysql_connect("localhost", "paypalUser", "test123") or die(mysql_error()); |
15 |
mysql_select_db("PayPal") or die(mysql_error()); |
16 |
|
17 |
|
18 |
if(isset($_POST['email']) && isset($_POST['password'])){ |
19 |
// Verify
|
20 |
}else{ |
21 |
?>
|
22 |
|
23 |
<h3>Login</h3> |
24 |
<p>Please enter your login credentials to get access to the download area</p> |
25 |
|
26 |
<form method="post" action="" > |
27 |
<fieldset>
|
28 |
<label for="email">Email:</label><input type="text" name="email" value="" /> |
29 |
<label for="password">Password:</label><input type="text" name="password" value="" /> |
30 |
<input type="submit" value="Login" /> |
31 |
</fieldset>
|
32 |
</form>
|
33 |
|
34 |
<?php
|
35 |
}
|
36 |
?>
|
37 |
|
38 |
</div>
|
39 |
|
40 |
</body>
|
41 |
</html>
|
Code trên sẽ kiểm tra xem email và mật khẩu đã được nhập đủ không. Nếu đủ, chúng tôi có thể xác minh thông tin đăng nhập. Nếu không, chúng tôi sẽ trả về lỗi. Mã tiếp theo chúng ta sẽ viết sẽ được đặt bên dưới "//Verify". Đầu tiên, chúng ta cần biến các biến post thành các biến cục bộ.
1 |
|
2 |
$email = mysql_escape_string($_POST['email']); |
3 |
$password = md5($_POST['password']); |
Tôi đã thêm một hàm escape để ngăn chặn mysql injection và đã chuyển password thành md5 hash. Bởi vì chúng tôi đã làm điều này trong cơ sở dữ liệui, chúng tôi cũng phải hash password của người dùng để so sánh hai giá trị chính xác. Bây giờ là lúc để xác thực dữ liệu.
1 |
|
2 |
$email = mysql_escape_string($_POST['email']); |
3 |
$password = md5($_POST['password']); |
4 |
|
5 |
$gUser = mysql_query("SELECT * FROM users WHERE email='".$email."' AND password='".$password."' LIMIT 1") or die(mysql_error()); |
6 |
$verify = mysql_num_rows($gUser); |
7 |
|
8 |
if($verify > 0){ |
9 |
echo '<h3>Login Complete</h3> |
10 |
<p>Click here to download our program</p>'; |
11 |
}else{ |
12 |
echo '<h3>Login Failed</h3> |
13 |
<p>Sorry your login credentials are incorrect.'; |
14 |
}
|
Như bạn có thể thấy, chúng tôi đang chạy truy vấn mysql và đang chọn tất cả dữ liệu từ bảng user của chúng tôi - nhưng chỉ có row chứa email của người dùng khớp với dữ liệu từ cơ sở dữ liệu.
mysql_num_rows kiểm tra nếu một kết quả trùng khớp đã được tìm thấy: 1 = true; 0 = sai.
Xong rồi đấy!
Và đó là kết thúc của hướng dẫn này. Tôi hy vọng bạn thích bài viết, và thoải mái để lại bình luận cùng những suy nghĩ của bạn. Bạn có lời khuyên hữu ích nào không?
- Đăng ký NETTUTS RSS Feed để nhận thêm các bài viết và hướng dẫn về phát triển web thường nhật.