Appearance
Xử lý kết quả thanh toán (Payment Notification)
🔁 Giao diện Redirect (Client)
Sau khi luồng thanh toán hoàn tất, khách hàng được điều hướng đến redirectUrl
mà bên đối tác đã cung cấp trong create
request. Một vài thông số sẽ được thêm vào URL theo dạng sau:
Method: POST
json
redirectUrl ?{parameters}
💻 Code mẫu
php
<?php
header('Content-type: text/html; charset=utf-8');
$accessKey = '';
$secretKey = '';
if (!empty($_GET)) {
$partnerCode = $_GET["partnerCode"];
$orderId = $_GET["orderId"];
$requestId = $_GET["requestId"];
$amount = $_GET["amount"];
$orderInfo = $_GET["orderInfo"];
$orderType = $_GET["orderType"];
$transId = $_GET["transId"] ?? '';
$resultCode = $_GET["resultCode"];
$message = $_GET["message"];
$payType = $_GET["payType"];
$responseTime = $_GET["responseTime"];
$extraData = $_GET["extraData"] ?? '';
$m2signature = $_GET["m2signature"]; //MoMo signature
//Checksum
$rawHash = "accessKey=$accessKey&amount=$amount&message=$message&orderId=$orderId&orderInfo=$orderInfo&orderType=$orderType&partnerCode=$partnerCode&payType=$payType&requestId=$requestId&responseTime=$responseTime&resultCode=$resultCode";
$partnerSignature = hash_hmac("sha256", $rawHash, $secretKey);
echo "<script>console.log('Debug huhu Objects: " . $rawHash . "' );</script>";
echo "<script>console.log('Debug huhu Objects: " . $partnerSignature . "' );</script>";
if ($m2signature == $partnerSignature) {
if ($resultCode == '0') {
$result = '<div class="alert alert-success"><strong>Payment status: </strong>Success</div>';
} else {
$result = '<div class="alert alert-danger"><strong>Payment status: </strong>' . $message . '</div>';
}
} else {
$result = '<div class="alert alert-danger">This transaction could be hacked, please check your signature and returned signature</div>';
}
}
js
const express = require('express');
const crypto = require('crypto');
const app = express();
const port = 3000;
app.get('/redirect', (req, res) => {
const accessKey = ''; // Thay bằng accessKey thực tế
const secretKey = ''; // Thay bằng secretKey thực tế
// Lấy các giá trị từ query parameters
const partnerCode = req.query.partnerCode;
const orderId = req.query.orderId;
const requestId = req.query.requestId;
const amount = req.query.amount;
const orderInfo = req.query.orderInfo;
const orderType = req.query.orderType;
const transId = req.query.transId || '';
const resultCode = req.query.resultCode;
const message = req.query.message;
const payType = req.query.payType;
const responseTime = req.query.responseTime;
const extraData = req.query.extraData || '';
const m2signature = req.query.m2signature; // MoMo signature
// Tạo chuỗi rawHash
const rawHash = `accessKey=${accessKey}&amount=${amount}&message=${message}&orderId=${orderId}&orderInfo=${orderInfo}&orderType=${orderType}&partnerCode=${partnerCode}&payType=${payType}&requestId=${requestId}&responseTime=${responseTime}&resultCode=${resultCode}`;
// Tạo chữ ký HMAC SHA256
const partnerSignature = crypto.createHmac('sha256', secretKey).update(rawHash).digest('hex');
console.log('Debug rawHash:', rawHash);
console.log('Debug partnerSignature:', partnerSignature);
let result;
// Kiểm tra chữ ký
if (m2signature === partnerSignature) {
if (resultCode === '0') {
result = '<div class="alert alert-success"><strong>Payment status: </strong>Success</div>';
} else {
result = `<div class="alert alert-danger"><strong>Payment status: </strong>${message}</div>`;
}
} else {
result = '<div class="alert alert-danger">This transaction could be hacked, please check your signature and returned signature</div>';
}
// Trả về kết quả
res.send(result);
});
// Khởi động server
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
js
using System;
using System.Security.Cryptography;
using System.Text;
using Microsoft.AspNetCore.Mvc;
namespace Pay2SRedirect.Controllers
{
public class PaymentController : Controller
{
// Hành động xử lý redirect
[HttpGet("redirect")]
public IActionResult RedirectFromPay2S(
string partnerCode, string orderId, string requestId,
string amount, string orderInfo, string orderType,
string transId, string resultCode, string message,
string payType, string responseTime, string extraData,
string m2signature)
{
string accessKey = ""; // Thay thế với accessKey thực tế
string secretKey = ""; // Thay thế với secretKey thực tế
// Tạo chuỗi rawHash cho chữ ký
var rawHash = $"accessKey={accessKey}&amount={amount}&message={message}&orderId={orderId}&orderInfo={orderInfo}&orderType={orderType}&partnerCode={partnerCode}&payType={payType}&requestId={requestId}&responseTime={responseTime}&resultCode={resultCode}";
// Tạo chữ ký HMAC SHA256
var partnerSignature = CreateHmacSha256Signature(rawHash, secretKey);
// Kiểm tra chữ ký
if (m2signature == partnerSignature)
{
if (resultCode == "0")
{
// Trả về kết quả thành công
ViewBag.Result = "<div class='alert alert-success'><strong>Payment status: </strong>Success</div>";
}
else
{
// Trả về kết quả lỗi
ViewBag.Result = $"<div class='alert alert-danger'><strong>Payment status: </strong>{message}</div>";
}
}
else
{
// Thông báo chữ ký không hợp lệ
ViewBag.Result = "<div class='alert alert-danger'>This transaction could be hacked, please check your signature and returned signature</div>";
}
// Trả về view chứa kết quả
return View();
}
// Hàm tạo chữ ký HMAC SHA256
private string CreateHmacSha256Signature(string data, string secretKey)
{
using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey)))
{
byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(data));
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
}
}
}