Thiết kế module

Một phần của tài liệu Xây dựng hệ thống dịch vụ giá trị gia tăng trên nền dịch vụ nhắn tin tức thì qua hệ thống tin nhắn tức thì (Trang 56 - 62)

với cơ sở dữ liệu thông qua WEB. Nói một cách khác thì phần WEB chính là cầu nối giữa các dịch vụ với CSDL chính của TCat. Bởi vậy phần WEB không những cung cấp một giao diện đồ họa cho các xử lý của người sử dụng mà còn có thêm các dịch vụ Web tương thích với các dịch vụ được viết bởi SMS hay IM.

Cấu trúc cơ bản của module như sau:

• Điểm vào duy nhất là file index.php và index2.php. File index.php đọc biến action và sẽ load những dịch vụ có tên trùng với biến action nằm trong thư mục modules. Có một vài dịch vụ đặc biệt như đăng ký nick, đăng nhập được chuyển ra ngoài. File index2.php được sử dụng cho các dịch vụ liên kết. Các dịch vụ liên kết truy cập vào file index2.php để tránh các đoạn HTML không cần thiết.

• Thư mục moudules chứa toàn bộ các file dịch vụ sẽ được thực thi. File index.php sẽ gọi các moudle tùy theo biến action đưa vào. Nếu truy cập trực tiếp các moudule thì sẽ bị báo lỗi.

• Các thư viện được sử nằm trong thư mục lib và gồm có:

o DebugHelper là một thư viện mã nguồn mở dùng để kiểm tra các lỗi của chương trình. Nếu có một lỗi nào đó (có thể là warning, notice..) thì DebugHelper sẽ hiển thị số dòng bị lỗi để tiện xử lý. Cơ chế hiện thị lỗi của DebugHelper giống kiểu của Java, vì vậy giúp quét lỗi dễ dàng hơn, thuận tiện hơn. Nếu không có DebugHelper thì mỗi lần có lỗi, php chỉ in ra dòng bị lỗi (mà không in ra quá trình sinh ra lỗi, điều này khiến việc debug trở nên khó khăn).

o MyDB.php là thư viện do chúng tôi tự viết nên, cung cấp các phương thức truy nhập CSDL dễ dàng hơn. Chỉ cần tạo ra một đối tượng MyDB sau đó thực thi một số phương thức có sẵn. Điều này rất tiện dụng và có hiệu quả cao hơn so với việc viết các hàm kết nối php với mysql thông thường.

Ví dụ để kết nối:

$db = new MYDB($cfg['db.host'], $cfg['db.user'], $cfg['db.passwd']);

$db->setdb($cfg['db.dbname']);

$db->query(“Select * from User”);

Để lấy kết quả trả về dùng các phương thức sau:

while ($row = $db->getNext()) {

//Các lệnh thực thi trên biến $row }

o Function.php là thư viện do chúng tôi tự thiết kế nên cung cấp các hàm giúp quá trình viết code được nhanh hơn. Các hàm được cung cấp thuộc ba nhóm chính:

 Nhóm hàm cung cấp các chức năng xử lý các biến. ví dụ như các hàm getVar(), postVar() … giúp lấy biến. Để đảm bảo tính bảo mật thì không nên dùng trực tiếp luôn biến từ $_POST hay $_GET mà các biến này phải qua xử lý để lấy ra đúng dữ liệu cần.

 Nhóm hàm cung cấp các chức năng về HTML hoặc javascript. Ví dụ như các hàm jsRedirect() dùng để chuyển trang bằng javascript.

 Nhóm hàm cung cấp các chức năng thao tác trên CSDL: Có một số thao tác trên CSDL phải thực hiện nhiều lần, hoặc một số thao tác muốn tổng quát hóa. Ví dụ như các hàm check_right() dùng để kiểm tra quyền truy nhập của người dùng với dịch vụ hiện hành.

o User.php là một class do chúng tôi thiết kế nên. Class này cung cấp các thao tác trên xử lý trên User. Ví dụ như lấy username, password hay thậm chí có thể lấy các danh sách bạn bè. Class được viết ngắn gọn, dễ sử dụng và tích hợp.

Vậy làm sao để một dịch vụ khác kết nối đến dịch vụ được cung cấp ở WEB này? Để làm được điều đó, chúng tôi cung cấp một số chuẩn viết code. Theo các chuẩn này thì việc phát triển hai dịch vụ ở hai bên khác nhau (bên WEB và bên IM,SMS) có thể thực hiện bởi hai lập trình viên. Chuẩn viết code như sau:

- Biến py có giá trị là mã của bên thực hiện nhiệm vụ ở phía IM hoặc SMS. Như thiết kế CSDL ở chương trên thì chỉ có các con Bot có mã nằm trong bảng BOT mới được phép yêu cầu dịch vụ. Điều này nhằm hạn chế khả năng mất mát thông tin hoặc rò rỉ thông tin của khách hàng. Nếu không có số bảo mật này thì mọi người ai cũng có thể gửi yêu cầu đến WEB. Nếu như vậy, WEB sẽ trả lại các thông tin nhạy cảm, đồng thời đánh dấu là đã được gửi rồi. Kẻ tấn công sẽ lấy được các thông tin đó còn người sử dụng sẽ không được con Bot gửi tin nhắn (vì thông tin đã được gửi rồi, nhưng đã bị người khác bắt).

Ngoài một số chuẩn qui định sẵn thì các lập trình viên ở hai phía có thể thống nhất với nhau cách một số chuẩn nhận dữ liệu khác nữa.

Các dịch vụ phía IM, SMS kết nối đến WEB đều phải thông qua file index2.php (một trong hai đầu vào). Thông qua file index2.php chúng tôi đã lược bỏ đi tất cả các đoạn HTML rườm rà không cần thiết, kết quả trả lại có kiểu plain-text (text thuần túy). Khi đó các dịch vụ phía IM, SMS không cần lược bỏ các thẻ HTML không cần thiết nữa, chỉ việc sử dụng dữ liệu luôn.

Index.php Index2.php Dịch vụ .. Dịch vụ .. Dịch vụ .. Dịch vụ .. Đăng ký Thư viện Xác thực Thư viện Thư viện

Sơ đồ Hình 4. 2 Sơ đồ cấu trúc module WEB miêu tả cấu trúc của module WEB gồm các bước như sau:

Với người sử dụng, đầu tiên sẽ vào trang index.php. Trang này sẽ nạp các thư viện cần thiết trong thư mục lib. Nếu người sử dụng đã có nick (tài khoản) rồi thì không cần đăng ký lại nữa mà qua quá trình xác thực sẽ đến phần sử dụng các dịch vụ luôn. Còn trường hợp người sử dụng chưa có nick, họ sẽ phải đăng ký một nick, sau đó mới được phép sử dụng dịch vụ. Phần xác thực khá quan trọng trong việc phát triển của TCat sau này. Nếu như có ý tưởng thương mại hóa TCat, phần xác thực phải được chỉnh sửa sao cho phù hợp. Ví dụ như trong tài khoản của người đó còn bao nhiêu tiền thì được sử dụng những dịch vụ nào …

Với các dịch vụ phía IM hoặc SMS, đầu tiên sẽ phải vào trang index2.php. Sau đó các dịch vụ đó phải đưa ra mã số của mình. Phần xác thực sẽ tự động ghi lại thời gian xác thực và kiểm tra tính đúng đắn của mã số đó. Việc lưu lại thời gian xác thực có ý nghĩa khá quan trọng. Khi lưu lại thời gian xác thực, WEB sẽ biết được trong khoảng thời gian

t nào đó, có bao nhiêu dịch vụ IM, SMS đã được xác thực. Như vậy có thể kết luận một cách gần đúng là có bao nhiêu dịch vụ IM, SMS đang online. Điều này có tính quyết định đến việc phân chia dữ liệu nếu như có nhiều module IM, SMS khác nhau cùng chạy.

Sau khi xác thực thành công thì index2.php sẽ nạp dịch vụ web mà IM, SMS yêu cầu. Sau đó trả về dữ liệu đã được nén lại.

Phương pháp nén dữ liệu theo kiểu text mà chúng tôi sử dụng là JSON.

JSON là viết tắt của từ JavaScript Object Notation, đó là là một kiểu định dạng dữ liệu chuyển đổi nhẹ cho máy tính, có tính khả đọc vì là kiểu văn bản text-based, dùng để biểu diễn các kiểu dữ liệu. (adsbygoogle = window.adsbygoogle || []).push({});

Định dạng JSON được mô tả chi tiết trong RFC 4627 [14] bởi Douglas Crockford. Thực chất của JSON chính là việc chuyển đổi các định dạng dữ liệu (như một mảng, đối tượng …) về thành một chuỗi text và tất nhiên có thể khôi phục lại được.

JSON được xây dựng trên hai cấu trúc:

* Là tập hợp của các cặp tên và giá trị (name-value). Trong những ngôn ngữ khác nhau, đây được coi như là một đối tượng (object), bản ghi (record), cấu trúc (struct), từ

* Là một tập hợp các giá trị đã được sắp xếp. Trong hầu hết các ngôn ngữ, JSON được coi như là một mảng, véc tơ, tập hợp hay là một dãy (sequence).

Đây là một cấu trúc dữ liệu phổ dụng. Hầu như tất cả các ngôn ngữ lập trình hiện đại đều hổ trợ trong một hình thức nào đó, tạo nên ý nghĩa của một định dạng hoán vị dữ liệu với các ngôn ngữ lập trình cũng đã được cơ sở hoá trên cấu trúc này. JSON ban đầu được viết ra để hỗ trợ Ajax trong JavaScript, tuy nhiên tính tiện dụng của JSON ngày càng được đón nhận. Cụ thể là vào năm 2005 Yahoo đã cung cấp các dịch vụ dưới chuẩn JSON[15], năm 2006 Google cũng tiếp bước Yahoo cung cấp các dịch vụ dưới chuẩn JSON (ngoài các dịch vụ theo chuẩn Feed XML)[16].

JSON cung cấp các API cho hầu hết các ngôn ngữ và đã nằm trong thư viện chuẩn của Python từ phiên bản Python 2.6 (phiên bản Python 2.5 chưa hỗ trợ JSON nên chúng tôi phải dùng một thư viện ngoài là PyJSON), đồng thời cũng được PHP hỗ trợ từ phiên bản PHP5.x. Thông tin chính thức của JSON được cập nhập trên trang chủ http://json.org.

Lý do chúng tôi sử dụng JSON thay thế cho các chuẩn XML là bởi vì JSON rất đơn giản. Khi muốn gửi một đối tượng nào đó, chỉ cần dùng hàm json_encode(). Hàm này trả về một chuỗi text là dữ liệu cần gửi đi. Khi muốn khôi phục lại đối tượng ban đầu, chỉ cần sử dụng hàm json_decode(). Hàm sẽ trả lại đối tượng như ban đầu. Với hai ngôn ngữ thông dịch cấp cao là PHP và Python thì sự liên kết này rất tuyệt vời. Nếu như sử dụng XML thì sẽ khó khăn khi phải parse đoạn XML để lấy dữ liệu, hơn nữa dữ liệu gửi bằng JSON nhẹ hơn dữ liệu XML.

Để bảo đảm tính an toàn, chúng tôi thiết kế sao cho các module IM, SMS kết nối đến WEB đều thông qua giao thức HTTPS.

CHƯƠNG 5. GIAO DIỆN SMS

Một phần của tài liệu Xây dựng hệ thống dịch vụ giá trị gia tăng trên nền dịch vụ nhắn tin tức thì qua hệ thống tin nhắn tức thì (Trang 56 - 62)