Lập trình thanh toán tiền qua mạng với PayPal API

Cách đây 3 năm, tôi cũng có viết về vấn đề này (sử dụng Java), API của PayPal khi đó (2008) giờ đã lỗi thời. PayPal hiện nay (2011) cung cấp bộ API mới cho việc thanh toán tiền, gọi là Adaptive Payments API, rõ ràng hơn, tiện lợi hơn và độc lập nền tảng hơn.

Có nhiều kịch bản chuyển tiền, từ đơn giản đến phức tạp, nhưng thông thường nhất là chuyển tiền từ một tài khoản A đến một tài khoản B, nên chúng ta sẽ chỉ bàn về tình huống này.

A và B đương nhiên phải là hai tài khoản đã đăng ký với PayPal, đặc trưng cho mỗi tài khoản là địa chỉ email, chẳng hạn a@gmail.comb@gmail.com. Giả sử phần mềm chúng ta định viết tên là phần mềm K.

Đầu tiên, ta phải xin phép PayPal cấp quyền để làm K. PayPal sẽ cung cấp cho ta 3 thứ để có thể gọi API của họ:

API_USERNAME
API_PASSWORD
API_SIGNATURE

Những thông tin này cần giữ bí mật, nhưng để tiện cho demo, họ cho sẵn:

API_USERNAME = "sdk-three_api1.sdk.com";
API_PASSWORD = "QFZCWN5HZM8VBG7Q";
API_SIGNATURE = "A.d9eRKfd1yVkRrtmMfCFLTqa6M9AyodL0SJkhYztxUi8W9pCXF6.4NI";

Với những giá trị đó, chỉ có thể chuyển tiền giả vờ (phần sau sẽ nói về môi trường giả vờ này, công nhận PayPal khá chu đáo cho lập trình viên).

Tiếp theo, chọn giao thức gọi API: ở đây tôi chọn HTTPS POST. Vậy thì phải có địa chỉ URL để mà post vào, sau đây cũng là những địa chỉ giả vờ:

API_ENDPOINT_PAY = "https://svcs.sandbox.paypal.com/AdaptivePayments/Pay";

API_ENDPOINT_PAYMENT_DETAIL = "https://svcs.sandbox.paypal.com/AdaptivePayments/PaymentDetails";

API_ENDPOINT_PREAPPROVAL = "https://svcs.sandbox.paypal.com/AdaptivePayments/Preapproval";

API_ENDPOINT_PREAPPROVAL_DETAIL = "https://svcs.sandbox.paypal.com/AdaptivePayments/PreapprovalDetails";

API_ENDPOINT_CANCEL_PREAPPROVAL = "https://svcs.sandbox.paypal.com/AdaptivePayments/CancelPreapproval";

  • Để tạo một giao dịch chuyển tiền: post vào API_ENDPOINT_PAY.
  • Để kiểm tra chi tiết tình trạng một giao dịch chuyển tiền đã tạo ra trước đó: post vào API_ENDPOINT_PAYMENT_DETAIL.
  • Để tạo một thỏa thuận ngầm giữa K với người A: post vào API_ENDPOINT_PREAPPROVAL.
  • Để kiểm tra chi tiết tình trạng một thỏa thuận ngầm: post vào API_ENDPOINT_PREAPPROVAL_DETAIL.
  • Để hủy bỏ một thỏa thuận ngầm đã tạo ra từ trước : post vào API_ENDPOINT_CANCEL_PREAPPROVAL.

Bây giờ chúng ta sẽ bàn chi tiết về những loại API trên.

PAY

Có hai kiểu chuyển tiền: tường minh (explicit) và ngầm định (implicit).

  • Explicit: giao dịch chỉ thực sự hoàn thành khi người A đăng nhập vào PayPal và xác nhận.
  • Implicit: chỉ thực hiện được khi trước đó người A đã thỏa thuận ngầm với K, tiền chuyển ngay lập tức không cần xác nhận của A.

Trong cả hai kiểu trên, ta cần những thông tin cơ bản nhất để tạo giao dịch PAY:

  • Email của A
  • Email của B
  • Số tiền chuyển từ A sang B
  • Nội dung thông báo cho cả A lẫn B
  • Ai là người trả phí giao dịch: A hay B? (mặc định là B: receiver)

Riêng với kiểu implicit, ta cần cung cấp thêm PREAPPROVAL_KEY (sẽ nói sau).

Tạo giao dịch xong, nếu thành công, PayPal trả về cho K một chuỗi ký tự gọi là PAY_KEY – là ID của giao dịch. K sẽ phải gửi email đến A một URL có chứa PAY_KEY này, A vào URL đó, đăng nhập và xác nhận. Ví dụ URL này với PAY_KEYAP-1U756635619684928:

PAY_CMD = "https://www.sandbox.paypal.com/webscr?cmd=_ap-payment&paykey=AP-1U756635619684928";

PAYMENT_DETAIL

Dĩ nhiên, cần phải có một PAY_KEY để K truy vấn tình trạng của giao dịch, ví dụ như A đã vào xác nhận chưa? nếu rồi thì đồng ý hay là không?

PREAPPROVAL

K tạo một thỏa thuận ngầm với A, thông tin căn bản gồm có:

  • Ngày giờ bắt đầu của thỏa thuận (phải là trong tương lai)
  • Ngày giờ kết thúc của thỏa thuận (phải sau ngày giờ bắt đầu)
  • Email của A
  • Tổng số tiền tối đa mà A sẽ bị lấy cho mọi giao dịch
  • Số tiền tối đa mà A sẽ bị lấy cho một giao dịch

Tạo thỏa thuận xong, PayPal trả về cho K chuỗi PREAPPROVAL_KEY – là ID của thỏa thuận. K sẽ phải gửi email đến A một URL có chứa PREAPPROVAL_KEY này, A vào URL đó, đăng nhập và xác nhận. Ví dụ URL này với PREAPPROVAL_KEYPA-48L30675AR8698511:

PREAPPROVED_CMD = "https://www.sandbox.paypal.com/webscr?cmd=_ap-preapproval&preapprovalkey=PA-48L30675AR8698511";

PREAPPROVAL_DETAIL

K truy vấn tình trạng của một thỏa thuận có ID là PREAPPROVAL_DETAIL: A đã vào xác nhận chưa? Nếu rồi thì đồng ý hay là không?

CANCEL_PREAPPROVAL

K hủy bỏ một thỏa thuận có ID là PREAPPROVAL_KEY, không cần xác nhận của A, nhưng A sẽ được thông báo bởi PayPal.

Chú ý: trong tất cả lời gọi API, PayPal đều trả về kết quả dưới dạng chuỗi Name Value Pair, ví dụ:

responseEnvelope.timestamp=2011-06-18T02:00:09.935-07:00&
responseEnvelope.ack=Success&
responseEnvelope.correlationId=a0362c21f2201&
responseEnvelope.build=1867348&
payKey=AP-07T51931WF943545D&
paymentExecStatus=CREATED

Để tiện lợi cho việc xem kết quả, K phải parse cái đống này, trích ra những thông tin cần thiết (xem cách parse trong link project bên dưới).

Môi trường giả vờ: PayPal Sandbox

Vào https://developer.paypal.com/ và đăng ký một tài khoản Sandbox. Sau đó đăng nhập, tạo các tài khoản ảo để test những API kể trên. Chủ yếu bạn cần các địa chỉ email ảo cho A, B; xem số tiền còn lại trong các tài khoản ảo.

Source code

Nên chọn C# cho dễ viết. Và cũng nên viết riêng ra một thư viện cho đẹp.

Project Visual Studio bạn có thể download tại mediafire hoặc github

Một số screenshot về demo

Photobucket

Photobucket

Photobucket

Advertisements

7 thoughts on “Lập trình thanh toán tiền qua mạng với PayPal API

  1. Anh ơi em cũng đang đang làm 1 project có liên quan đến Paypal nhưng dùng ngôn ngữ PHP ạ, anh có advise nào cho em ko ạ :(( về concept em nghĩ là cũng tương tự như lập trình với Java nhưng code thì thế nào anh có biết ko ạ? Em cảm ơn anh.

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s