Thứ Bảy, 17 tháng 10, 2009

Sử dụng plugin Paypal IPN trong CakePHP

Xin chào mọi người!

Plugin paypal IPN này thật sự cần thiết cho những ai muốn sử dụng Paypal IPN trong cakephp. Tôi đã tìm kiếm trên mạng và sử dụng plugin này, thấy thật sự mang lại tiện ích rất lớn. Helper trong plugin sẽ giúp ta dẽ dàng tạo ra các nút Checkout, Add to Cart, Subscribe, và Donate một cách dễ dàng. Chức năng chính của plugin này là tạo ra các nút add to cart, subscribe ... trong paypal để gửi thông tin lên paypal, thực hiện giao dịch và lưu trữ dữ liệu giao dịch trả về vào trong log và CSDL. (Cách sử dụng plugin bạn tham khảo tại đây).

Paypal IPN plugin. (Paypal Instant Payment Notification)
Version 1.4
Tác giả: Nick Baker (nick@webtechnick.com)

Website: http://www.webtechnick.com

Browse, Download, hoặc  Checkout Plugin.
Browse: http://projects.webtechnick.com/paypal_ipn
Download: http://projects.webtechnick.com/paypal_ipn.tar.gz
SVN: https://svn2.xp-dev.com/svn/nurvzy-paypal-ipn

Các bước cài đặt như sau:

1) Copy plugin vào trong project /app/plugins/paypal_ipn.

2) Import file /plugins/paypal_ipn/paypal_ipn.sql vào trong cơ sở dữ liệu.

3) Thêm những dòng dưới đây vào router: /app/config/routes.php fil
<?php
/* Paypal IPN plugin */
Router::connect('/paypal_ipn/process', array('plugin' => 'paypal_ipn', 'controller' => 'instant_payment_notifications', 'action' => 'process'));

/* Optional Routes, but nice for administration */
Router::connect('/paypal_ipn/edit/:id', array('admin' => true, 'plugin' => 'paypal_ipn', 'controller' => 'instant_payment_notifications', 'action' => 'edit'), array('id' => '[a-zA-Z0-9\-]+', 'pass' => array('id')));
Router::connect('/paypal_ipn/view/:id', array('admin' => true, 'plugin' => 'paypal_ipn', 'controller' => 'instant_payment_notifications', 'action' => 'view'), array('id' => '[a-zA-Z0-9\-]+', 'pass' => array('id')));
Router::connect('/paypal_ipn/delete/:id', array('admin' => true, 'plugin' => 'paypal_ipn', 'controller' => 'instant_payment_notifications', 'action' => 'delete'), array('id' => '[a-zA-Z0-9\-]+', 'pass' => array('id')));
Router::connect('/paypal_ipn/add', array('admin' => true, 'plugin' => 'paypal_ipn', 'controller' => 'instant_payment_notifications', 'action' => 'edit'));
Router::connect('/paypal_ipn', array('admin' => true, 'plugin' => 'paypal_ipn', 'controller' => 'instant_payment_notifications', 'action' => 'index'));/*
/* End Paypal IPN plugin */
?>

Router này sẽ chuyển cách gọi các controller và action trong plugin này về cách gọi thông thường. (nhìn code bạn sẽ hiểu ngay !^_^! )

Tạo tài khoản paypal:

Để sự dụng được plugin này bạn phải có một tài khoản paypal (tham khảo cách tạo tài khoản paypal tại đây). Với các lập trình viên, paypal có hỗ trợ cho việc tạo tài khoản ảo để test, địa chỉ https://developer.paypal.com. Khi tạo xong tài khoản, bật (enable) IPN trong tài khoản của bạn.

Sử dụng trong administator (tùy chọn): đây là trường hợp bạn thêm và lưu thông tin thông qua giao diện admin

1) Bạn phải đăng nhập vào trong phần quản trị với tài khoản administrator thông qua component Auth.

2) Sử dụng plugin tại http://www.yoursite.com/paypal_ipn

Sự dụng helper paypal (tùy chọn): Trong trường hợp bạn muốn sử dụng helper hoặc các button trong helper.

1) Cấu hình lại với thông tin của bạn tại /paypal_ipn/config/paypal_ipn_config.php

2) Thêm 'PaypalIpn.Paypal' vào trong danh sách helper của app_controller.php:
<?php
var $helpers = array('Html','Form','PaypalIpn.Paypal');
?>

3) cách sử dụng (tham khảo thêm tại /paypal_ipn/views/helpers/paypal.php)

$paypal->button(String tittle, Options array);

ví dụ:
<?php
//Pay Now Button
echo $paypal->button('Pay Now', array('amount' => '12.00', 'item_name' => 'test item'));
//Pay Now Button with Image
echo $paypal->button('pay_now.jpg', array('amount' => '12.00', 'item_name' => 'test item'));

//Subscribe Button
echo $paypal->button('Subscribe', array('type' => 'subscribe', 'amount' => '60.00', 'term' => 'month', 'period' => '2'));

//Donate Button
echo $paypal->button('Donate', array('type' => 'donate', 'amount' => '60.00'));

//Add To Cart
echo $paypal->button('Add To Cart', array('type' => 'addtocart', 'amount' => '15.00'));
?>

Ta cũng có thể thêm một số thuộc tính Paypal hợp lệ vào trong options của button.

Ví dụ :
<?php echo $paypal->button('Pay Now', array('amount' => '12.00', 'item_name' => 'Stuff', 'return' => 'http://www.yoursite.com/thankyou')); ?>

Ngoài việc sử dụng các helper button đẻ tạo ra các button paypal ta còn có thể tạo ra thông các các thẻ html. Khi sử dụng thẻ form html ta phải sử dụng notify_url để gán tới http://www.yoursite.com/paypal_ipn/process
ví dụ:
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
...
...
<input type="hidden" name="notify_url" value="http://www.yoursite.com/paypal_ipn/process" />
...
</form>

Khi thông tin giao dịch được trả về từ paypal, dữ liệu sẽ được lưu vào trong cơ sở dữ liệu và hàm afterPaypalNotification sẽ được gọi (nếu nó tồn tại). Đây sẽ là nơi bạn xử lý các thao tác login khác liên quan đến giao dịch sau khi giao dịch thành công.

Tạo ra function trong /app/app_controller.php như sau:
<?php
function afterPaypalNotification($txnId){
//Here is where you can implement code to apply the transaction to your app.
//for example, you could now mark an order as paid, a subscription, or give the user premium access.
//retrieve the transaction using the txnId passed and apply whatever logic your site needs.

$transaction = ClassRegistry::init('PaypalIpn.InstantPaymentNotification')->findById($txnId);
$this->log($transaction['InstantPaymentNotification']['id'], 'paypal');

//Tip: be sure to check the payment_status is complete because failure transactions
// are also saved to your database for review.

if($transaction['InstantPaymentNotification']['payment_status'] == 'Completed'){
//Yay! We have monies!
}
else {
//Oh no, better look at this transaction to determine what to do; like email a decline letter.
}
}
?>

Chú ý:

1) Với các bạn chưa lần nào làm về paypal, các bạn có thể tìm hiểu qua về cách tạo một trang web trực tuyển qua paypal một cách đơn giản tại đây. Sau khi làm xong ví dụ này, tôi nghĩ các bạn sẽ hiểu rõ hơn nguyên tắc hoặt động của plugin này.

2) Plugin này hiện tại (version 2.1) theo tôi được biết thì chỉ có hỗ trợ 2 button chính là Paynow và Subscribe. Còn các nút AddToCart... thì chưa hỗ trợ việc lưu dữ liệu. Hi vọng khi các bạn sử dụng thì đã hỗ trợ đủ.

Chúc các bạn thành công  !^_^!

2 nhận xét:

  1. Mình vừa mới đọc bài biết của bạn nhưng phần chú ý link lại die, có thể giúp mình fix lại được không

    Trả lờiXóa
  2. 59le5z bhrykfoaqlrm, [url=http://jumyhzeamvdo.com/]jumyhzeamvdo[/url], [link=http://rzozkirtgnyb.com/]rzozkirtgnyb[/link], http://anarunkfnrtv.com/

    Trả lờiXóa