10/10/2018, 10:57
Vài suy nghĩ về nganluong.vn
Bài viết này trình bày các quan điểm cá nhân của riêng tôi sau khi sử dụng nganluong.vn (NL). Mục đích để các bạn đang/muốn sử dụng NL lưu ý hơn khi dùng dịch vụ dính đến tiền bạc của cá nhân. Để hiểu rõ bài này, bạn phải
- Biết PHP
- Biết qua NL
- Có acc NL để phá càng tốt.
I. Interactive
Khi thanh toán qua NL, Merchant Site (MS) sẽ được cung cấp mã nhúng/ hàm tạo url để “tích hợp”. Khi nhúng sẽ có 1 nút nhấn, và khi khách hàng nhấn nút này thì chuyển toàn bộ qua NL.
Nếu qua NL khách hàng có sẵn acc để thanh toán ngay, thì hóa đơn xem như được thanh toán và NL sẽ trở về MS được truyền đi trong $return_url. Ổn.
Nếu khách chọn hình thức khác không phải acc của NL, vd như ATM của ACB chẳng hạn, thì ở bước tiếp theo bạn phải khai báo các thông tin cá nhân
Sau trang này là trang hướng dẫn bạn ra 1 cột ATM nào đó để gởi tiền
Và… hết. Khách hàng sẽ kiên nhẫn cho đến khi hết kiên nhẫn, tắt tab và tự hỏi “rồi sao nữa”. Tức là sau cái bước này MS chưa hề biết là có 1 khách hàng đang cố gắng mua hàng, vì khi khách hàng xem hàng và chọn mua thì đã chuyển qua cho NL rồi, thông tin khách hàng là do NL record, MS không có khả năng “tiếp cận” khách hàng để hỗ trợ khi cần thiết. $return_url vô dụng, vì nó chỉ dùng khi thanh toán thành công. Nếu bạn là 1 khách hàng nghiêm túc thì bạn sẽ bị “bỏ rơi” tại bước 3 ở trên, không có được 1 lời cảm ơn từ MS.
Vậy, nên chăng record và gởi info lại cho MS, vì NL đại diện thu thập thông tin người bán, mà lại không sinh ra 1 hóa đơn (pending thôi cũng được) để MS biết? Người bán hàng nào mà chẳng muốn “thà bắt nhầm còn hơn bỏ sót”
II. Bạn muốn mua ipod với giá bao nhiêu?
Hãy vào http://www.h2shop.net/phone/viewp/52...e_he_5%29.html (chỉ chọn đại 1 website, không có ý gì khác)
Sửa lại ít chữ html nhé, sau đó lưu lại trên máy và nhấn vào nút thanh toán, bạn sẽ được thế này
Chỗ tô đỏ là vấn đề, khi bạn modify lại nội dung website, sẽ không có thông tin đó, nhưng các thông tin khác đều ok. Và bạn cứ thử … thanh toán xem?
Tất nhiên, tôi không nói rằng bạn sẽ thực sự mua được hàng với cái giá do bạn đặt, ta là con người mà. Ta có thể kiểm tra được, và người bán chẳng ai đi giao hàng cho bạn cả, nếu họ TỰ KIỂM TRA.
III. Chức năng NÂNG CAO của NL thì sao?
Với hướng dẫn này http://developer.nganluong.vn/tai-li...-nang-cao.html
NL có thêm 1 chức năng là khi người dùng thanh toán thì sẽ cập nhật thông tin cho MS rằng đơn hàng đã được thanh toán, MS nhìn vào tình trạng đó để gởi hàng chẳn hạn. Đây là code mẫu của NL down tại https://www.nganluong.vn/data/docume...ng-cao-php.rar , file comlete.php
Ý tưởng là NL sẽ gởi các tham số về đơn hàng cho MS thông qua HTTP request, hàm verifyPaymentUrl () có tham số $secure_code là md5 của chuối ghép các thông tin trong $_GET VÀ PASSWORD mà MS đăng kí với NL, và MS bản thân cũng có để tạo 1 chuỗi md5 tương ứng để kiểm tra. Nếu trùng thì cập nhật đơn hàng, không thì thôi. Hoàn toàn logic.
Tuy nhiên, nếu bạn lập trình kiểu này thì cái quan trọng nhất là giá tiền - $price lại không được kiểm tra mà “em trao thân gởi phận cả cho NL”. Và với việc bạn có thể tự đính giá thứ bạn muốn mua như ở trên thì bạn cũng thấy rằng…
IV. Bạn muốn thanh toán ipod với tên doanh nghiệp nào?
NL được tích hợp hầu như là như nhau trong các website: file nganluong.php là class, trong class này chứa các thông tin quan trọng giúp định danh bạn là ai:
Và trong đoạn mã tạo nút nhấn vào NL thì có thêm các khai báo này
- Khai báo phải đúng secure_code, merchant code, email của tôi , tôi có kết quả thế này
- Khai báo ĐÚNG secure_code, merchant code của tôi, và ĐÚNG email của … bạn lehao1314@yahoo.com, tôi được kết quả thế này
Ok, đến đây bạn có thể phá phách gì đó là việc của bạn.
Trên đây là kết quả tôi thử tích hợp trong vòng 2 ngày vừa qua.
Dù hơi lo, nhưng tôi cũng cố gắng giải quyết các vấn đề của mình.
i. Tôi sẽ record thông tin của mình trước khi chuyển khách hàng qua NL, các thông tin khách hàng của tôi, tôi “gởi đại” qua việc mò các biến $_GET, và may mắn là thành công, khách hàng của tôi sẽ chỉ điền 1 lần ở MS của tôi, qua NL sẽ tự điền.
Hiện tại tôi chỉ chữa cháy như thế, sau này NL thay đổi thì tôi lại mò tiếp.
ii. Tôi cũng tự thân lưu lại cái giá tiền “do nhà sản xuất cung cấp” (giá tiền do MS của tôi tính ra) và dùng nó để đối chiếu khi NL muốn cập nhật đơn hàng: thay vì $price=$_GET["price"]; thì tôi select từ trong db tôi có ra để kiểm $price=$row[‘price’]. Cẩn tắt vô ưu mà.
Các vấn đề iii và iv thực ra là lỗi logic. Có lẽ NL chỉ dựng website cho những người có trình độ hiểu về NL như họ, vì phải tuân thủ 100% thao tác mới mong thành công. Khá ngạc nhiên là khi đăng kí MS site, các anh hỏi khá nhiều về ip và url và hứa “NL chỉ giao tiếp với website này” nhưng có lẽ NL hơi dễ dãi.
Các vấn đề nêu ra đương nhiên chưa gây tổn hại tiền bạc, nhưng rõ ràng sẽ gây các tranh cãi về pháp lý không cần thiết. 1 website thanh toán lại càng nhạy cảm với vấn đề này.
Hi vọng NL sẽ có nhiều bước cải tiến, tốt hơn, bảo mật hơn.
supermanman
- Biết PHP
- Biết qua NL
- Có acc NL để phá càng tốt.
I. Interactive
Khi thanh toán qua NL, Merchant Site (MS) sẽ được cung cấp mã nhúng/ hàm tạo url để “tích hợp”. Khi nhúng sẽ có 1 nút nhấn, và khi khách hàng nhấn nút này thì chuyển toàn bộ qua NL.
Code:
$url= $nl->buildCheckoutUrl($return_url, $receiver, $transaction_info, $order_code, $price);
Nếu khách chọn hình thức khác không phải acc của NL, vd như ATM của ACB chẳng hạn, thì ở bước tiếp theo bạn phải khai báo các thông tin cá nhân
Sau trang này là trang hướng dẫn bạn ra 1 cột ATM nào đó để gởi tiền
Và… hết. Khách hàng sẽ kiên nhẫn cho đến khi hết kiên nhẫn, tắt tab và tự hỏi “rồi sao nữa”. Tức là sau cái bước này MS chưa hề biết là có 1 khách hàng đang cố gắng mua hàng, vì khi khách hàng xem hàng và chọn mua thì đã chuyển qua cho NL rồi, thông tin khách hàng là do NL record, MS không có khả năng “tiếp cận” khách hàng để hỗ trợ khi cần thiết. $return_url vô dụng, vì nó chỉ dùng khi thanh toán thành công. Nếu bạn là 1 khách hàng nghiêm túc thì bạn sẽ bị “bỏ rơi” tại bước 3 ở trên, không có được 1 lời cảm ơn từ MS.
Vậy, nên chăng record và gởi info lại cho MS, vì NL đại diện thu thập thông tin người bán, mà lại không sinh ra 1 hóa đơn (pending thôi cũng được) để MS biết? Người bán hàng nào mà chẳng muốn “thà bắt nhầm còn hơn bỏ sót”
II. Bạn muốn mua ipod với giá bao nhiêu?
Hãy vào http://www.h2shop.net/phone/viewp/52...e_he_5%29.html (chỉ chọn đại 1 website, không có ý gì khác)
Sửa lại ít chữ html nhé, sau đó lưu lại trên máy và nhấn vào nút thanh toán, bạn sẽ được thế này
Chỗ tô đỏ là vấn đề, khi bạn modify lại nội dung website, sẽ không có thông tin đó, nhưng các thông tin khác đều ok. Và bạn cứ thử … thanh toán xem?
Tất nhiên, tôi không nói rằng bạn sẽ thực sự mua được hàng với cái giá do bạn đặt, ta là con người mà. Ta có thể kiểm tra được, và người bán chẳng ai đi giao hàng cho bạn cả, nếu họ TỰ KIỂM TRA.
III. Chức năng NÂNG CAO của NL thì sao?
Với hướng dẫn này http://developer.nganluong.vn/tai-li...-nang-cao.html
NL có thêm 1 chức năng là khi người dùng thanh toán thì sẽ cập nhật thông tin cho MS rằng đơn hàng đã được thanh toán, MS nhìn vào tình trạng đó để gởi hàng chẳn hạn. Đây là code mẫu của NL down tại https://www.nganluong.vn/data/docume...ng-cao-php.rar , file comlete.php
Code:
//Thêm class NL_Checkout require_once("nganluong.php"); //Lấy kết quả trả về từ ngân lượng //Lấy thông tin giao dịch $transaction_info=$_GET["transaction_info"]; //Lấy mã đơn hàng $order_code=$_GET["order_code"]; //Lấy tổng số tiền thanh toán tại ngân lượng $price=$_GET["price"]; //Lấy mã giao dịch thanh toán tại ngân lượng $payment_id=$_GET["payment_id"]; //Lấy loại giao dịch tại ngân lượng (1=thanh toán ngay ,2=thanh toán tạm giữ) $payment_type=$_GET["payment_type"]; //Lấy thông tin chi tiết về lỗi trong quá trình giao dịch $error_text=$_GET["error_text"]; //Lấy mã kiểm tra tính hợp lệ của đầu vào $secure_code=$_GET["secure_code"]; //Xử lí đầu vào $nl=new NL_Checkout(); $check= $nl->verifyPaymentUrl($transaction_info, $order_code, $price, $payment_id, $payment_type, $error_text, $secure_code); if($check) $html .="<div align="center">Cám ơn quý khách, quá trình thanh toán đã được hoàn tất. Chúng tôi sẽ kiểm tra và chuyển hàng sớm!</div>"; else $html.="Quá trình thanh toán không thành công bạn vui lòng thực hiện lại"; echo $html;
Tuy nhiên, nếu bạn lập trình kiểu này thì cái quan trọng nhất là giá tiền - $price lại không được kiểm tra mà “em trao thân gởi phận cả cho NL”. Và với việc bạn có thể tự đính giá thứ bạn muốn mua như ở trên thì bạn cũng thấy rằng…
IV. Bạn muốn thanh toán ipod với tên doanh nghiệp nào?
NL được tích hợp hầu như là như nhau trong các website: file nganluong.php là class, trong class này chứa các thông tin quan trọng giúp định danh bạn là ai:
Code:
// URL chheckout của nganluong.vn private $nganluong_url = 'https://www.nganluong.vn/checkout.php'; // Mã merchante site private $merchant_site_code = '1iibabốn'; // Biến này được nganluong.vn cung cấp khi bạn đăng ký merchant site // Mật khẩu bảo mật private $secure_pass= 'Pass này giao tiếp NL'; // Biến này được nganluong.vn cung cấp khi bạn đăng ký merchant site //Hàm xây dựng url, trong đó có tham số mã hóa (còn gọi là public key)
Code:
$receiver="gmail@yahoo.com"; //Khai báo url trả về $return_url="sdfsdf.com"; //Giá của cả giỏ hàng $price=$my_price;
- Khai báo ĐÚNG secure_code, merchant code của tôi, và ĐÚNG email của … bạn lehao1314@yahoo.com, tôi được kết quả thế này
Ok, đến đây bạn có thể phá phách gì đó là việc của bạn.
Trên đây là kết quả tôi thử tích hợp trong vòng 2 ngày vừa qua.
Dù hơi lo, nhưng tôi cũng cố gắng giải quyết các vấn đề của mình.
i. Tôi sẽ record thông tin của mình trước khi chuyển khách hàng qua NL, các thông tin khách hàng của tôi, tôi “gởi đại” qua việc mò các biến $_GET, và may mắn là thành công, khách hàng của tôi sẽ chỉ điền 1 lần ở MS của tôi, qua NL sẽ tự điền.
Code:
$nl= new NL_Checkout(); //Tạo link thanh toán đến nganluong.vn $url= $nl->buildCheckoutUrl($return_url, $receiver, $transaction_info, $order_code, $price); $url.="&fullname=".urlencode($row_user['name']); $url.="&email=".urlencode($row_user['email']); $url.="&mobile=".urlencode($row_user['tel']); $url.="&address=".urlencode($row_user['address'].", ".$row_user['address2'].", ".$row_user['address3'].", ".$row_user['address4']); $url.="&reply=".urlencode($row_user['note']); $url=str_replace("https://www.nganluong.vn/checkout.php?", "https://www.nganluong.vn/index.php?portal=checkout&page=express&", $url);
ii. Tôi cũng tự thân lưu lại cái giá tiền “do nhà sản xuất cung cấp” (giá tiền do MS của tôi tính ra) và dùng nó để đối chiếu khi NL muốn cập nhật đơn hàng: thay vì $price=$_GET["price"]; thì tôi select từ trong db tôi có ra để kiểm $price=$row[‘price’]. Cẩn tắt vô ưu mà.
Các vấn đề iii và iv thực ra là lỗi logic. Có lẽ NL chỉ dựng website cho những người có trình độ hiểu về NL như họ, vì phải tuân thủ 100% thao tác mới mong thành công. Khá ngạc nhiên là khi đăng kí MS site, các anh hỏi khá nhiều về ip và url và hứa “NL chỉ giao tiếp với website này” nhưng có lẽ NL hơi dễ dãi.
Các vấn đề nêu ra đương nhiên chưa gây tổn hại tiền bạc, nhưng rõ ràng sẽ gây các tranh cãi về pháp lý không cần thiết. 1 website thanh toán lại càng nhạy cảm với vấn đề này.
Hi vọng NL sẽ có nhiều bước cải tiến, tốt hơn, bảo mật hơn.
supermanman
Bài liên quan
Khách hàng mua, NL sinh hóa đơn và thu phí dịch vụ, khi có khiếu nại thì là chuyện của người mua và người bán? Trong khi chính NL là người phát sinh hóa đơn và xác nhận giao dịch chuyển tiền thành công?
Việc kiểm tra giá tiền là chuyện nhỏ, và dễ dàng tự mỗi MS có thể khắc phục, nhưng ở vấn đề IV đã trình bày ở trên, tôi có thể mạo danh bất kì 1 Merchant site nào, vậy việc verify ur/file text trên host của MS còn có ý nghĩa? Lỗi này là của ai? của những người tích hợp API trên các merchant site khác, hay của NL?
Thay mặt BQT NgânLượng.vn chúng tôi cảm ơn bạn và các thành viên ddth khác đã cùng trao đổi về vấn đề này, qua đây chúng tôi cũng xin trả lời các bạn như sau:
Trong trường hợp bạn sử dụng cách tích hợp đặt mã nút nhúng, đây là cách tích hợp rất đơn giản, thuận tiện nhưng nhược điểm là thông tin về đơn hàng thường không được lưu tại website bán hàng và các tham số truyền trên url có thể bị chỉnh sửa. Tuy nhiên, theo cách này, chúng tôi cũng
đã khuyến cáo khách hàng là KHÔNG cập nhật hoá đơn tự động động và PHẢI kiểm tra giao dịch bằng tay (đăng nhập vào tài khoản NgânLượng.vn để kiểm tra số tiền trước khi giao hàng).
Khi bạn muốn lưu thông tin về đơn hàng trước khi chuyển sang NgânLượng.vn thanh toán và không cho người mua sửa đổi thông tin, bạn hãy dùng hình thức tích hợp nâng cao của NgânLượng.vn. Khi đó NgânLượng.vn dùng mã checksum để kiểm tra tham số gửi trên đường truyền, sẽ báo lỗi nếu có ít nhất một tham số thay đổi giá trị. Trong trường hợp này, NgânLượng.vn chỉ trả về kết quả cho website khách hàng khi có giao dịch đã thanh toán thành công. Chúng tôi xin ghi nhận và sẽ hướng dẫn chi tiết hơn trong phần hướng dẫn tích hợp để website bán hàng phải kiểm tra số tiền đã thanh toán (do NgânLượng.vn) trả về phải >= số tiền đã gửi sang thanh toán (có thể lưu trong DB của website bán hàng) thì mới cập nhật hoá đơn như bạn nói để hạn chế rủi ro nếu có.
Ngoài ra, khi gửi thông tin bằng tích hợp nâng cao từ website bán hàng sang NgânLượng.vn, chúng tôi sử dụng cặp mã merchant + mật khẩu (để tạo checksum) để xác định địa chỉ website đang giao tiếp với NgânLượng.vn, chúng tôi không căn cứ vào thông tin tài khoản người bán (biến receiver trên url) bởi nếu xác định người bán có phải là người đã tạo merchant site hay không chúng tôi sẽ không áp dụng được trong trường hợp mô hình dạng sàn (khi đó chỉ có chủ site đăng ký tích hợp nhưng có hàng ngàn người bán trên site). Tuy nhiên, nếu tích hợp bạn dùng mã checksum thì khách hàng không đơn giản tự thay đổi địa chỉ email của người bán được, khi đó hệ thống sẽ báo lỗi;