Lỗi sai chữ ký khi thanh toán vnpay?

Chào mọi người em có đang thử thích hợp cái vnpay vào website của mình nhưng mà mãi em vẫn chưa rõ lỗi ở đâu mà cái chữ ký của em nó cứ báo sai. Em dùng hmacsha512 để tạo chữ ký từ cái data mà mình gửi cho vnpay và cái hashscecret mà mình đăng ký. Khi đọc doc của vnpay thì nó bảo cái data mình gửi lên phải sắp xếp theo tăng dần thì em cũng đã thủ công sắp xếp đúng chuẩn tăng dần rồi mà vẫn không được. Thuật toán hmacsha512 thì em có lấy rất nhiều cách trên mạng nhưng vẫn cứ bị báo lỗi là sai chữ ký.Em sẽ để code ở đây nếu ai rảnh thì có thể thử và test giúp em với ạ.Em cảm ơn.

package com.webbansach.service.impl;

import com.webbansach.hmac.Sha512;
import com.webbansach.service.IPaymentVnpayService;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;


@Service
public class PaymentVnpayService implements IPaymentVnpayService {

    final String VNP_TMNCODE = "ABC123";
    final static String VNP_HASHSECRET = "XYZ789";
    final String VNP_URL = "https://sandbox.vnpayment.vn/paymentv2/vpcpay.html?";
    final String VNP_VERSION = "2.1.0";
    final String VNP_COMMAND = "pay";
    final String ORDER_TYPE = "150000";

    private RestTemplate restTemplate;
    private HttpHeaders headers;

    @Override
    public String sendRequest(long orderId1, int totalPrice, HttpServletRequest request) throws Exception {
        restTemplate = new RestTemplate();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime dateTimeNow = LocalDateTime.now();

        String vnp_Version = VNP_VERSION;
        String vnp_Command = VNP_COMMAND;
        String vnp_OrderInfo = "DH" + dtf.format(dateTimeNow);
        String vnp_OrderType = ORDER_TYPE;
        String vnp_TxnRef = String.valueOf(orderId1);
        String vnp_IpAddr = "127.0.0.1";
        String vnp_TmnCode = VNP_TMNCODE;
        String vnp_BankCode = "NCB";
        String vnp_CreateDate = dtf.format(dateTimeNow);
        String vnp_Amount = String.valueOf(totalPrice * 100);
        String vnp_CurrCode = "VND";
        String vnp_Locale = "vn";
        String vnp_ReturnUrl = "http://localhost:8080/thanh-cong";

        String rawHash = "vnp_Amount=" + vnp_Amount +
//                         "&vnp_BankCode=" + vnp_BankCode +
                         "&vnp_Command=" + vnp_Command +
                         "&vnp_CreateDate=" + vnp_CreateDate+
                         "&vnp_CurrCode=" + vnp_CurrCode +
                         "&vnp_IpAddr=" + vnp_IpAddr +
                         "&vnp_Locale=" + vnp_Locale +
                         "&vnp_OrderInfo=" + vnp_OrderInfo +
                         "&vnp_OrderType=" + vnp_OrderType +
                         "&vnp_ReturnUrl=" + vnp_ReturnUrl+
                         "&vnp_TmnCode=" + vnp_TmnCode +
                         "&vnp_TxnRef=" + vnp_TxnRef +
                         "&vnp_Version=" + vnp_Version;

        Sha512 sha512 = new Sha512();
        String vnp_SecureHash = sha512.calculateHMac(VNP_HASHSECRET, rawHash);

        String urlResult = VNP_URL+rawHash+"&vnp_SecureHash=" + vnp_SecureHash;
        return urlResult;
    }

    
}

cái này nên thử dùng code mẫu của vnpay rồi đối chiếu lại chuỗi data gốc và data đã hash với kết qủa của bạn xem có gì sai hay không
hoặc bạn cũng có thể copy code ra các ngôn ngữ khác để chạy để so sánh, có sẵn code mẫu có 5 ngôn ngữ mà

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?