2012-07-13 30 views

Trả lời

16

Bạn không thể kiểm tra IPN trên localhost của bạn, như IPN là tất cả về máy chủ của PayPal bắt đầu một POST server-side tới một URL bạn xác định.
Kết quả là, tập lệnh IPN phải của bạn có thể truy cập được bởi thế giới bên ngoài (hoặc bạn có thể sử dụng đường hầm như ngrok.me/localtunnel.me).

+3

http://progrium.com/localtunnel/ –

+4

Tốt bổ sung. Vâng, bạn có thể sử dụng localtunnel nếu bạn đang sử dụng Rails. Lưu ý rằng PayPal đề xuất cổng 80/443 (HTTP/HTTPS). 'Trình xác thực IPN' sẽ không hoạt động trên các cổng không phải HTTP (S). – Robert

+0

Bạn cũng có thể giả mạo dữ liệu IPN để thử nghiệm trên máy chủ lưu trữ cục bộ của mình. Xem kịch bản của tôi dưới đây. Bạn sẽ cần kết nối mạng để người nghe liên hệ với hộp cát và php với cài đặt curl. – user6972

4

Tôi làm kiểm tra trên máy chủ cục bộ. Bạn có thể sử dụng dịch vụ như dyn.com hoặc noip.com hoặc trỏ tên miền phụ vào địa chỉ cục bộ của bạn nếu địa chỉ đó tĩnh.

8

Bạn có thể mô phỏng bài đăng IPN của PayPal bằng cách chạy tập lệnh bên dưới mà tôi đã tạo trên máy chủ cục bộ của bạn (bạn sẽ cần cài đặt curl). Miễn là người nghe của bạn được chỉ vào sandbox thì nó nên xác thực. Thay đổi người nghe của bạn thành paypal trực tiếp và không nên xác thực.

<?php 
// SIMULATE PAYPAL IPN LOCALLY 
// 
// Sometimes you need to test on your local host and this can be difficult due 
// to IP routing issues. Use this code on your local machine to simulate the 
// same process that the sandbox IPN simulator does when posting to your URL. 
// 
// Run this code in command line or via the browser. It will post IPN data just 
// like Paypal would. If the code you've written to process your IPN data 
// posts back to the sandbox, it should come back as valid. 

// Put the full url to test in $paypal_url, include file extensions if necessary 
$paypal_url = 'http://localhost/paypal_ipn/process'; // IPN listener to test 

//example posted data from paypal IPN 
$test = 'residence_country=US&invoice=abc1234&address_city=San+Jose&first_name=John&payer_id=TESTBUYERID01&mc_fee=0.44&txn_id=421462822&receiver_email=seller%40paypalsandbox.com&custom=xyz123+CUSTOMHASH&payment_date=12%3A40%3A25+27+Aug+2013+PDT&address_country_code=US&address_zip=95131&item_name1=something&mc_handling=2.06&mc_handling1=1.67&tax=2.02&address_name=John+Smith&last_name=Smith&receiver_id=seller%40paypalsandbox.com&verify_sign=AFcWxV21C7fd0v3bYYYRCpSSRl31AgAAjEU7A5rthY2aP4j1jOIrjuGx&address_country=United+States&payment_status=Completed&address_status=confirmed&business=seller%40paypalsandbox.com&payer_email=buyer%40paypalsandbox.com&notify_version=2.4&txn_type=cart&test_ipn=1&payer_status=unverified&mc_currency=USD&mc_gross=12.34&mc_shipping=3.02&mc_shipping1=1.02&item_number1=AK-1234&address_state=CA&mc_gross1=9.34&payment_type=instant&address_street=123%2C+any+street'; 
/* 
* More detailed breakout of the raw data 
    _POST EXAMPLE ARRAY FROM PAYPAL: 
    Array 
    (
    [residence_country] => US 
    [invoice] => abc1234 
    [address_city] => San Jose 
    [first_name] => John 
    [payer_id] => TESTBUYERID01 
    [mc_fee] => 0.44 
    [txn_id] => 421462822 
    [receiver_email] => [email protected] 
    [custom] => xyz123 CUSTOMHASH 
    [payment_date] => 12:40:25 27 Aug 2013 PDT 
    [address_country_code] => US 
    [address_zip] => 95131 
    [item_name1] => something 
    [mc_handling] => 2.06 
    [mc_handling1] => 1.67 
    [tax] => 2.02 
    [address_name] => John Smith 
    [last_name] => Smith 
    [receiver_id] => [email protected] 
    [verify_sign] => AFcWxV21C7fd0v3bYYYRCpSSRl31AgAAjEU7A5rthY2aP4j1jOIrjuGx 
    [address_country] => United States 
    [payment_status] => Completed 
    [address_status] => confirmed 
    [business] => [email protected] 
    [payer_email] => [email protected] 
    [notify_version] => 2.4 
    [txn_type] => cart 
    [test_ipn] => 1 
    [payer_status] => unverified 
    [mc_currency] => USD 
    [mc_gross] => 12.34 
    [mc_shipping] => 3.02 
    [mc_shipping1] => 1.02 
    [item_number1] => AK-1234 
    [address_state] => CA 
    [mc_gross1] => 9.34 
    [payment_type] => instant 
    [address_street] => 123, any street 
) 
*/ 

//# 
// PayPal IPN processor in PHP 
// fake paypal post to test scripts 
//# 
//---------------------------------------------------------- 
// Create FAKE post from PayPal. 
//---------------------------------------------------------- 

$req = $test; // use test data 

//open connection 
$ch = curl_init(); 

//set the url, number of POST vars, POST data 
curl_setopt($ch,CURLOPT_URL, $paypal_url); 
curl_setopt($ch,CURLOPT_POST, substr_count($req,'&')+1); 
curl_setopt($ch,CURLOPT_POSTFIELDS, $req); 

//execute post 
$result = curl_exec($ch); 

//close connection 
curl_close($ch); 
?> 
+0

bạn cần thay đổi txn_id cho mọi thử nghiệm để tránh lỗi tái sử dụng giao dịch trùng lặp. –

+0

@khaled_webdev không sandbox thực sự ngăn chặn trùng lặp của txnid? Đó không phải là vấn đề khi tôi sử dụng lần cuối. Người nghe của bạn có thể kiểm tra điều này và từ chối. Hệ thống paypal trực tiếp cũng sẽ phát hiện và từ chối. – user6972

+0

nó không phải là sandbox mà là một bản ghi được tạo bởi bundle order symfony2-paypal-ipn và người nghe của tôi không làm việc lần thứ hai. Lần đầu tiên 'Thành công' và khi tôi thử lại, tôi gặp Lỗi. –

30

Trình mô phỏng IPN của Paypal sẽ không hoạt động với máy chủ cục bộ. Tuy nhiên, bạn có thể mô phỏng giả lập :-). Để thực hiện việc này, bạn cần cài đặt plugin/tiện ích bổ sung cho trình duyệt như poster cho firefox hoặc Advanced Rest Client cho google chrome.

Mở ứng dụng và đưa vào url của bạn, bạn đang lắng nghe trên để được trả lời IPN:

http://localhost/ipn 

Đặt sau khi dữ liệu POST của bạn và gửi yêu cầu:

residence_country=US&invoice=abc1234&address_city=San+Jose&first_name=John&payer_id=TESTBUYERID01&mc_fee=0.44&txn_id=421462822&receiver_email=seller%40paypalsandbox.com&custom=xyz123+CUSTOMHASH&payment_date=12%3A40%3A25+27+Aug+2013+PDT&address_country_code=US&address_zip=95131&item_name1=something&mc_handling=2.06&mc_handling1=1.67&tax=2.02&address_name=John+Smith&last_name=Smith&receiver_id=seller%40paypalsandbox.com&verify_sign=AFcWxV21C7fd0v3bYYYRCpSSRl31AgAAjEU7A5rthY2aP4j1jOIrjuGx&address_country=United+States&payment_status=Completed&address_status=confirmed&business=seller%40paypalsandbox.com&payer_email=buyer%40paypalsandbox.com&notify_version=2.4&txn_type=cart&test_ipn=1&payer_status=unverified&mc_currency=USD&mc_gross=12.34&mc_shipping=3.02&mc_shipping1=1.02&item_number1=AK-1234&address_state=CA&mc_gross1=9.34&payment_type=instant&address_street=123%2C+any+street 

CẬP NHẬT: Tôi vừa bắt đầu sử dụng một tùy chọn khác dễ dàng hơn, https://localtunnel.me. Để cài đặt và chạy mô-đun, hãy làm như sau. Nó sẽ hiển thị URL công khai của bạn. Tất cả các yêu cầu tới URL công khai đó sẽ được chuyển tiếp đến máy chủ cục bộ của bạn.

npm install -g localtunnel 
lt --port 80 
+1

Tôi cũng sử dụng [localtunnel] (http://localtunnel.me/) và tôi thấy nó dễ hơn 'ngrok' vì tôi không phải đăng ký. Một mẹo, nếu trang web của bạn được tìm thấy trên một máy chủ khác (không phải locahost), hãy sử dụng tùy chọn '-l'. Ví dụ 'lt -p 80 -l local.dev' hy vọng sẽ giúp. – JohnnyQ

40

Bạn có thể thử nghiệm trên máy chủ cục bộ bằng cách sử dụng ngrok.

Đơn giản chỉ cần chạy ngrok tại địa phương sau đó dán url thử nghiệm mà ngrok mang đến cho bạn (giống như http://1bc7d09d.ngrok.com/)

Nó cung cấp một đường hầm để localhost của bạn.

+2

Đây phải là câu trả lời được chấp nhận :) Hoạt động tuyệt vời! – lucaswxp

+1

Wow - đây là điều tôi đang tìm kiếm trong một thời gian dài! Đây là câu trả lời! – mgibas

4
/ngrok http -host-header=yourwebsite.com 80 

chí hầm để localhost với tiêu đề máy chủ phải

+0

Cảm ơn bạn rất nhiều vì đoạn mã rất đơn giản này. :) –

Các vấn đề liên quan