Xin kính chào 500 ae năm mới nhé!

*
URL Return: URL này vị mình tạo nên và đã gửi kèm qua URL giao dịch với key là vnp_Return
Url
, mục đích của URL này là dùng làm nhận thông tin giao dịch từ phía VNPAY trả về để hiển thị ra mang đến END_USER với không dùng cho việc cập nhật dữ liệu. Và bao gồm dạng sau:

https://mypage/return_url?vnp_Amount=1000000&vnp_Bank
Code=NCB&vnp_Bank
Tran
No=20170829152730&vnp_Card
Type=ATM&vnp_Order
Date=20170829153052&vnp_Response
Code=00&vnp_Tmn
Code=2QXUI4J4&vnp_Transaction
No=12996460&vnp_Txn
Ref=23597&vnp_Secure
Hash
Type=SHA256&vnp_Secure
Hash=20081f0ee1cc6b524e273b6d4050fefd
URL IPN: URL này mặt mình sẽ tạo nên ra cùng gửi quý phái VNPAY để họ config ngơi nghỉ phía server VNPAY, sau khi VNPAY tiếp nhận thông tin thanh toán giao dịch từ thanh toán URL với xử lí những thông tin giao dịch dứt thì đầu VNPAY sẽ gửi thông tin giao dịch thanh toán như mã giao dịch, trang thái giao dịch,... Về URL IPN vì chưng mình cung cấp. URL này bản thân sẽ dùng để update thông tin thanh toán vào DB. URL có dạng sau

http://mypage/vnpay_ipn?vnp_Amount=1000000&vnp_Bank
Code=NCB&vnp_Bank
Tran
No=20170829152730&vnp_Card
Type=ATM&vnp_Order
Date=20170829153052&vnp_Response
Code=00&vnp_Tmn
Code=2QXUI4J4&vnp_Transaction
No=12996460&vnp_Txn
Ref=23597&vnp_Secure
Hash
Type=SHA256&vnp_Secure
Hash=20081f0ee1cc6b524e273b6d4050fefd
Dưới dây là work flow thanh toán bên phía VNPAY(nguồn vnpay):

*

a) URL thanh toán

Dựa vào document của VNPAY mình sẽ sở hữu được code mẫu, từ code chủng loại mình thực hiện convert thanh lịch RUBY như dưới

# checkouts_controller.rbdef execute order = Order.new ... Vnp_url = get_payment_url(order, fallback_checkouts_url) redirect_to vnp_urlenddef fallback # this is URL return # todo hereendprivate def get_payment_url(order_object, return_url) # Mã website mặt VNPAY cung cấp ban sơ cho mình vnp_tmncode = ENV<"VNP_TMNCODE"> # Chuỗi kí tự cần sử dụng cho câu hỏi mã hóa thông số do bên VNPAY cung ứng vnp_hash_secret = ENV<"VNP_HASH_SECRET"> vnp_url = ENV<"VNP_URL"> vnp_txnref = order_object.id vnp_order_info = "Thanh toan tải hang" vnp_order_type = "190000" vnp_amount = order_object.total_price_cents * 100 vnp_local = "vn" vnp_ipadd = request.remote_ip input_data = "vnp_Amount" => vnp_amount, "vnp_Command" => "pay", "vnp_Create
Date" => Date
Time.current.strftime("%Y%m%d%H%M%S"), "vnp_Curr
Code" => "VND", "vnp_Ip
Addr" => vnp_ipadd, "vnp_Locale" => vnp_local, "vnp_Order
Info" => vnp_order_info, "vnp_Order
Type" => vnp_order_type, "vnp_Return
Url" => return_url, "vnp_Tmn
Code" => vnp_tmncode, "vnp_Txn
Ref" => vnp_txnref, "vnp_Version" => "2.0.0", original_data = input_data.map do |key, value| "#key=#value" end.join("&") vnp_url = vnp_url + "?" + input_data.to_query vnp_security_hash = Digest::SHA256.hexdigest(vnp_hash_secret + original_data) vnp_url += "&vnp_Secure
Hash
Type=SHA256&vnp_Secure
Hash=" + vnp_security_hash vnp_url end

Một điểm chú ý quan trọng là các tham số bao gồm trong URL trước khi đưa vào mã hóa piải được sort theo lắp thêm tự Alphabet, ở nội dung bài viết của bản thân thì đó là các key-value bao gồm trong trở nên input_data. Bởi vì đã làm lơ điểm nhỏ này mà tôi đã tốn kha khá thời hạn để xử lý được.

Bạn đang xem: Ipn url là gì

b) URL return

Khi chào đón thông tin từ VNPAY bước trước tiên mình đề nghị làm đó phải validate xem duy trì liệu bao gồm trong param có hợp lệ xuất xắc không. Bằng phương pháp lấy các thông tin params: "vnp_Amount", "vnp_Bank
Code", "vnp_Bank
Tran
No", "vnp_Card
Type", "vnp_Order
Info", "vnp_Pay
Date", "vnp_Response
Code", "vnp_Tmn
Code", "vnp_Transaction
No", "vnp_Txn
Ref" gồm trong URL đem đi tạo nên chuỗi mã hóa, tiếp đến đem đi đối chiếu với chuỗi mã hóa trong params : params<"vnp_Secure
Hash">
. Trường hợp 2 chuỗi này kiểu như nhau cho nên valid.

Như mình đã nhắc tới ở bên trên URL này chỉ dùng để làm hiển thị thông tin thanh toán giao dịch cho END_USER biết chứ không dùng để cập nhật thông tin vào cửa hàng dữ liệu.

Xem thêm: Local Content Requirements Là Gì, Ý Nghĩa Của Local Content Trong Tiếng Anh

# checkouts_controller.rb def fallback if checksum_valid! if params<"vnp_Response
Code"> == "00" current_user.cart.clear flash<:success> = t(".payment_success") redirect_to books_path else flash<:error> = t(".payment_failed") redirect_to checkouts_path kết thúc else flash<:error> = t(".payment_failed") redirect_to checkouts_path endendprivate def checksum_valid! vnp_secure_hash = params<"vnp_Secure
Hash"> data = response_params.to_h.map vì chưng |key, value| "#key=#value" end.join("&") secure_hash = Digest::SHA256.hexdigest(ENV<"VNP_HASH_SECRET"> + data) vnp_secure_hash == secure_hash kết thúc def response_params params.permit("vnp_Amount", "vnp_Bank
Code", "vnp_Bank
Tran
No", "vnp_Card
Type", "vnp_Order
Info", "vnp_Pay
Date", "vnp_Response
Code", "vnp_Tmn
Code", "vnp_Transaction
No", "vnp_Txn
Ref") endc) URL IPN

Cũng tương tự Return URL, URL IPN cũng cần phải kiểm tra thông tin đúng theo lệ trước khi thường xuyên xử lí
URL này sẽ sử dụng vào mục đích update dữ liệu vào db, lúc implement mn cần tiến hành đủ 8 case mặt dưới. 8 case này do mặt VNPAY cung ứng và sau bản thân tích hợp dứt họ cũng biến thành cùng mình tiến hành test đầy đủ 8 case, nếu pass không còn thì tiếp nối mới tiên hành đưa lên mt production.

def vnp_ipn logger = Logger.new("#Rails.root/log/payment_#Date.today.to_s.log") response_data = <> if checksum_valid! permit_params = response_params order_object = Order.find_by_id(permit_params<"vnp_Txn
Ref">) if order_object if order_object.total_price_cents == (permit_params<"vnp_Amount">.to_i / 100) if order_object.pending? if permit_params<"vnp_Response
Code"> == "00" order_object.set_paid else order_object.set_failed end # save vnp_Transaction
No order_object.transaction_id = permit_params<"vnp_Transaction
No"> order_object.save! code = "00" message = "Confirm Success" else code = "02" message = "Order already confirmed" kết thúc else code = "04" message = "Invalid amount" end else code = "01"; message = "Order not found" kết thúc else code = "97"; message = "Invalid Checksum" kết thúc logger.info("VNPAY with params: " + permit_params.to_s + ", code: #code, message: #message") render json: "Rsp
Code": code, "Message": message rescue => e logger.error("VNPAY with params: " + permit_params.to_s + ", " + e.message) render json: "Rsp
Code": "99", "Message": "Unknow error" end=> Tổng kết:

Cần 3 URL: URL thanh toán, URL Return, URL IPNCheck thông tin valid phụ thuộc chuỗi bảo mật thông tin trước khi liên tiếp xử lí đến URL Return với URL IPNCần bố trí thứ tự các key vào params theo vật dụng tự ALPHABET trước lúc tạo chuỗi bảo mật
Implment đủ các case do mặt VNPAY cung cấp.

3. Tài liệu tham khảo

Một số tin tức có trong bài viết được lấy từ VNPAY.
Bước 1: quý khách thực hiện mua sắm và chọn lựa trên trang web - áp dụng TMĐT và triển khai thanh toán trực con đường cho 1-1 hàng. Bước 2: trang web - áp dụng TMĐT thành lập và hoạt động yêu cầu giao dịch thanh toán dưới dạng URL mang thông tin giao dịch thanh toán và gửi hướng người sử dụng sang Cổng thanh toán VNPAY bằng URL đó. Cổng thanh toán VNPAY giải pháp xử lý yêu cầu thanh toán giao dịch mà website - áp dụng TMĐT gởi sang. Khách hàng tiến hành nhập hoặc xử trí xác thực các thông tin được yêu ước Thanh toán. Bước 3,4: người sử dụng nhập tin tức để xác minh thông tin tài khoản Ngân hàng của người sử dụng và xác thực thanh toán (Nhập tin tức tài khoản, thẻ hoặc quét mã VNPAY-QR). Bước 5: thanh toán thành công tại Ngân hàng, VNPAY tiến hành: đưa hướng khách hàng về trang web - áp dụng TMĐT (vnp_Return
Url) thông báo cho trang web - áp dụng TMĐT tác dụng thanh toán của người sử dụng thông qua IPN URL. Merchant cập nhật kết quả thanh toán giao dịch VNPAY gởi tại URL này. Bước 6: Merchant hiển thị tác dụng giao dịch tới quý khách hàng (vnp_Return
Url).

Sơ trang bị tuần từ bỏ

*

thông tin cấu hình

Các thông tin quan trọng kết nối vào môi trường thiên nhiên cachseo.com Cổng thanh toán VNPAY: - Mã Tmn
Code vnp_Tmn
Code là mã định danh kết nối được khai báo tại khối hệ thống của VNPAY. Mã định danh tương xứng với thương hiệu miền website, ứng dụng, thương mại dịch vụ của merchant kết nối vào VNPAY. Mỗi đối kháng vị hoàn toàn có thể có một hoặc những mã Tmn
Code kết nối. - URL thanh toán giao dịch (cachseo.com): https://cachseo.com/paymentv2/vpcpay.html - Secret Key vnp_Hash
Secret Chuỗi bí mật sử dụng để kiểm tra toàn diện dữ liệu khi hai khối hệ thống trao đổi tin tức (checksum). - URL tầm nã vấn kết quả giao dịch - hoàn tiền (cachseo.com): https://cachseo.com/merchant_webapi/api/transaction Nếu chưa tồn tại thông tin cấu hình tích hợp, chúng ta có thể đăng cam kết ngay tại phía trên http://cachseo.com/devreg/ hệ thống sẽ gửi thông tin liên kết về e-mail bạn đăng ký

Tạo URL Thanh toán

URL giao dịch (cachseo.com): https://cachseo.com/paymentv2/vpcpay.html Phương thức: GET URL giao dịch thanh toán là địa chỉ cửa hàng URL mang tin tức thanh toán. trang web TMĐT giữ hộ sang Cổng giao dịch VNPAY các thông tin này khi cách xử lý giao dịch thanh toán giao dịch trực tuyến đến Khách tải hàng. URL bao gồm dạng:

https://cachseo.com/paymentv2/vpcpay.html?vnp_Amount=1806000&vnp_Command=pay&vnp_Create
Date=20210801153333&vnp_Curr
Code=VND&vnp_Ip
Addr=127.0.0.1&vnp_Locale=vn&vnp_Order
Info=Thanh+toan+don+hang+%3A5&vnp_Order
Type=other&vnp_Return
Url=https%3A%2F%2Fdomainmerchant.vn%2FReturn
Url&vnp_Tmn
Code=DEMOV210&vnp_Txn
Ref=5&vnp_Version=2.1.0&vnp_Secure
Hash=3e0d61a0c0534b2e36680b3f7277743e8784cc4e1d68fa7d276e79c23be7d6318d338b477910a27992f5057bb1582bd44bd82ae8009ffaf6d141219218625c42 danh sách tham số - thông tin gửi sang VNPAY (vnp_Command=pay)

thông số Kiểu dữ liệu Bắt buộc/Tùy chọn biểu hiện
vnp_Version Alphanumeric<1,8> Bắt buộc Phiên bản api nhưng merchant kết nối. Phiên phiên bản hiện trên là : 2.1.0
vnp_Command Alpha<1,16> Bắt buộc Mã API sử dụng, mã mang đến giao dịch thanh toán là: pay
vnp_Tmn
Code
Alphanumeric<8> Bắt buộc Mã trang web của merchant trên khối hệ thống của VNPAY. Ví dụ: 2QXUI4J4
vnp_Amount Numeric<1,12> Bắt buộc Số chi phí thanh toán. Số tiền ko mang các ký tự phân bóc thập phân, phần nghìn, cam kết tự tiền tệ. Để nhờ cất hộ số tiền giao dịch là 10,000 VND (mười nghìn VNĐ) thì merchant đề xuất nhân thêm 100 lần (khử phần thập phân), sau đó gửi sang VNPAY là: 1000000
vnp_Bank
Code
Alphanumeric<3,20> Tùy chọn Mã phương thức thanh toán, mã loại bank hoặc ví điện tử thanh toán. còn nếu như không gửi sang tham số này, đưa hướng người dùng sang VNPAY chọn cách tiến hành thanh toán. Lưu giữ ý: những mã loại hình thức thanh toán tuyển lựa tại website-ứng dụng của merchant vnp_Bank
Code=VNPAYQRThanh toán quét mã QR vnp_Bank
Code=VNBANKThẻ ATM - thông tin tài khoản ngân hàng nội địa vnp_Bank
Code=INTCARDThẻ thanh toán quốc tế
vnp_Create
Date
Numeric<14> Bắt buộc Là thời gian phát sinh giao dịch định dạng yyyy
MMdd
HHmmss (Time zone GMT+7) Ví dụ: 20220101103111
vnp_Curr
Code
Alpha<3> Bắt buộc Đơn vị tiền tệ thực hiện thanh toán. Bây giờ chỉ cung cấp VND
vnp_Ip
Addr
Alphanumeric<7,45> Bắt buộc Địa chỉ IP của người sử dụng thực hiện giao dịch. Ví dụ: 13.160.92.202
vnp_Locale Alpha<2,5> Bắt buộc Ngôn ngữ giao diện hiển thị. Hiện nay tại cung ứng Tiếng Việt (vn), giờ đồng hồ Anh (en)
vnp_Order
Info
Alphanumeric<1,255> Bắt buộc Thông tin diễn đạt nội dung giao dịch quy định tài liệu gửi sang VNPAY (Tiếng Việt ko dấu với không bao gồm các ký tự sệt biệt) Ví dụ: Nap tien mang lại thue bao 0123456789. So tien 100,000 VND
vnp_Order
Url
Alphanumeric<10,255> Bắt buộc URL thông báo hiệu quả giao dịch khi khách hàng ngừng thanh toán. Ví dụ: https://domain.vn/Vn
Pay
Return
vnp_Expire
Date
Numeric<14> Bắt buộc Thời gian không còn hạn giao dịch thanh toán GMT+7, định dạng: yyyy
MMdd
HHmmss
vnp_Txn
Ref
Alphanumeric<1,100> Bắt buộc Mã tham chiếu của giao dịch thanh toán tại hệ thống của merchant. Mã này là duy nhất dùng để phân biệt các đơn hàng gửi quý phái VNPAY. Không được trùng lặp trong ngày. Ví dụ: 23554
vnp_Secure
Hash
Alphanumeric<32,256> Bắt buộc Mã chất vấn (checksum) để bảo đảm an toàn dữ liệu của thanh toán không bị biến hóa trong quy trình chuyển từ merchant sang VNPAY. Việc tạo nên mã này phụ thuộc vào thông số kỹ thuật của merchant với phiên bản api sử dụng. Phiên bạn dạng hiện tại cung ứng SHA256, HMACSHA512.
lưu ý dữ liệu checksum được ra đời dựa bên trên việc sắp xếp tăng dần của thương hiệu tham số (Query
String) Số tiền thường phải trả nhân với 100 để triệt tiêu phần thập phân trước khi gửi sang VNPAY vnp_Bank
Code: giá trị này tùy chọn. - Nếu loại trừ tham số không giữ hộ sang, quý khách hàng sẽ chọn phương thức thanh toán, bank thanh toán tại VNPAY. - Nếu tùy chỉnh giá trị (chọn ngân hàng thanh toán trên Website-ứng dụng TMĐT), xem thêm bảng mã trả về tại API: Endpoint: https://cachseo.com/qrpayauth/api/merchant/get_bank_list Http method: POST Content-Type: application/x-www-form-urlencoded key tmn_code value Theo mã định danh kết nối (vnp_Tmn
Code) VNPAY cung cấp Trong URL thanh toán giao dịch có tham số vnp_Return
Url là URL thông báo hiệu quả giao dịch khi khách hàng ngừng thanh toán Code setup