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.
Code:
 $url= $nl->buildCheckoutUrl($return_url, $receiver, $transaction_info,  $order_code, $price);
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
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;
Ý 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:
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)
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
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 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.
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);
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
bka viết 13:07 ngày 10/10/2018
cái bug trên thì mình cũng biết ,nhưng để nghịch cho vui thôi. giao dịch vẫn thành công dù số tiền bạn chỉnh xuống nhỏ nhất. nhưng dù thanh toán xong bạn cũng chẳng làm gì được vì phải đợi bọn ngân lượng kiểm tra , rồi người bán kiểm tra . việt nam mà , những bug này không có giá trị.. paypal cũng có vấn đề như thế này , nhưng lỗi không phải do họ mà do dev của site dùng api paypal . nếu bạn check price trả về khi thành công với price sản phẩm thì có change đường trời cũng không được. mặc dù có return url giao dịch thành công. cái này nhà cung cấp không chịu trách nhiệm
thq viết 13:01 ngày 10/10/2018
Như đã nói, vấn đề của NL không gây tổn thất ngay lập tức, nhưng việc NL là 1 trang web trung gian, có khả năng sinh hóa đơn lại bị bug đơn giản đến mức người dùng có khả năng tự sinh hóa đơn với bất kì giá nào, của bất kì doanh nghiệp nào đã đăng kí với NL, thì có phải là vấn đề "vô hại" (về nguyên tắc, nếu tôi là người mua cheating,thì rõ ràng tôi đã thanh toán và nhận được hóa đơn giao dịch thành công, tại sao không gởi hàng cho tôi?). Các bug này khá đơn giản và có thể sửa dễ dàng để nâng cao sự ổn định vào bảo mật, tiếc là NL lại chưa làm.
hidecode viết 12:57 ngày 10/10/2018
trước nay toàn dùng dịch vụ của onepay và mobivi...chưa thấy có lỗi gì! ^^
aplinux viết 13:03 ngày 10/10/2018
Được gửi bởi be3x.com
những lỗi thế này mà mắc phải ở 1 website lớn thì đúng là bó tay, không hiểu mấy anh coder ăn lương để làm gì nhỉ
Đùng đổ hết tội cho coder, tôi nghiệp lắm.
thq viết 13:09 ngày 10/10/2018
mấy bug này đúng là lỗi coder đó bạn. Họ không check điều kiện đầy đủ trước khi thực thi lệnh giao dịch
bka viết 13:04 ngày 10/10/2018
Được gửi bởi thq
mấy bug này đúng là lỗi coder đó bạn. Họ không check điều kiện đầy đủ trước khi thực thi lệnh giao dịch
bug này không phải lỗi tại nganluong mà lỗi này là lỗi của người tích hợp api của ngân lượng vào site người đó..nếu bạn sử dụng api của paypal để tích hợp vào website của bạn không check cẩn thận lỗi này vẫn có thể đc khai thác ( xin nói lại lỗi không phải của nhà cung cấp) bởi vì bao giờ một giao dịch thành công , nhà cung cấp cũng sẽ trả lại price đã thanh toán và báo giao dịch thành công. nếu người tích hợp không kiểm tra price trả về mà chỉ lấy giá trị dao dịch thành công thì lỗi này sẽ bị khai thác.
thq viết 13:03 ngày 10/10/2018
NL là nơi có thể phát sinh hóa đơn, và thu phí trên hóa đơn đó. NL hỏi kĩ và bắt verify url/ip khi MS đăng kí, vậy họ dùng chúng vào việc gì? HAy càng có nhiều hóa đơn thì họ càng thu được tiền?
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?
cuty08 viết 13:06 ngày 10/10/2018
Nếu dùng kiểu tích hợp chỉ đặt một đoạn nút nhúng thì người mua có thể thay đổi giá là đúng rồi(vì các tham số truyền trên URL, Paypal cũng có kiểu tích hợp này), nhưng theo như mô tả thì cách này không nên cập nhật hoá đơn tự động
nganluong viết 13:09 ngày 10/10/2018
Chào bạn thq,
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;
Bài liên quan
0