thắc mắc GMO payment

  • Người tạo chủ đề Người tạo chủ đề sieudubi
  • Ngày bắt đầu Ngày bắt đầu
Cảm ơn bạn.
Mình nhập thẻ 4100000000005000 thì nó trả về kết quả như này rồi chắc là đúng rồi.Xem tệp đính kèm 2948296
Còn nhập thẻ 4111111111111111 thì nó trả về lỗi E21040001, ở thanh toán bình thường thì thẻ này chạy bình thường.
Mình sẽ xử lý sao đối với thẻ loại này vậy bạn
Tùy vào bài toán của bạn. Bạn setting trên shop là yêu cầu 3Ds thì những cái thẻ không phải 3ds2 nó lỗi là phải rồi. BÌnh thường nếu bắn lỗi đó thì mình alert cho user là thẻ của bạn không hỗ trợ 3ds2 hay gì đó.

LIst mã thẻ: PGマルチペイメントサービス用FAQサイト (https://mp-faq.gmo-pg.com/s/article/D00867)
 
Cảm ơn bạn.
Mình nhập thẻ 4100000000005000 thì nó trả về kết quả như này rồi chắc là đúng rồi.Xem tệp đính kèm 2948296
Còn nhập thẻ 4111111111111111 thì nó trả về lỗi E21040001, ở thanh toán bình thường thì thẻ này chạy bình thường.
Mình sẽ xử lý sao đối với thẻ loại này vậy bạn
Đối với những thẻ có ACS = 2 thì bạn redject đến URL, còn là ACS = 0 thì xem như là thanh toán đc rồi
 
Đối với những thẻ có ACS = 2 thì bạn redject đến URL, còn là ACS = 0 thì xem như là thanh toán đc rồi
Này mình k rõ lắm. Nói chung mỗi lần giao dịch xong ở trên trang shop có status của order đó. Hãy xem trạng thái order là biết nó thế nào.
 
Screenshot 2025-03-05 161429.png

Đoạn này trả về RedirectUrl rồi, mình chuyển hướng bằng js thì cứ bị lỗi này.
window.location = result.data.RedirectUrl;
Không biết sai chỗ nào không bạn.
--------------------------
Update
Chỗ này mình tìm được cách rồi nha, do mình parse string bị sai
Ai làm thì cẩn thận chỗ này nha, mình cảm ơn
 
Sửa lần cuối:
SecureTran2 ERROR [エラー理由と対応方法]【E21】E21030007. Này là lỗi gì nhỉ. Sử dụng trên production
 
AlterTran thì chi có cancel, khi chưa trừ tiền mà nhỉ, thanh toán xong rồi thì hoàn kiểu gì tôi ko biết ạ
 
AlterTran thì chi có cancel, khi chưa trừ tiền mà nhỉ, thanh toán xong rồi thì hoàn kiểu gì tôi ko biết ạ
tôi dùng AlterTran hoàn tiền được mà bác, tôi test bằng thẻ visa của tôi luôn ý.
bác xem param bác truyền lên như nào ạ.
 
Nếu thay đổi thông tin thẻ: từ thẻ A -> B thì có cần xác thực 3DS không các bác nhỉ?
 
các bác ơi cho e hỏi ở api /payment/Tds2Auth.idPass ngoài AccessID và AccessPassthì cần Tds2Param , cái này lấy ở đâu vậy ạ, e đang cần để xử lý lấy ra ChallengeUrl ạ
 
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Cache;

class GmoPaymentController extends Controller
{
public function index()
{
return view('gmo_payment');
}

// Bước 1: Tạo EntryTran để lấy AccessID và AccessPass
public function createEntryTran(Request $request)
{
$orderID = mt_rand(100000000, 999999999);
$token = $request->input('token');
$amount = 232;

$entryResponse = Http::asForm()->post(env('GMO_API_ENDPOINT') . '/EntryTran.idPass', [
'ShopID' => env('GMO_SHOP_ID'),
'ShopPass' => env('GMO_SHOP_PASSWORD'),
'OrderID' => $orderID,
'JobCd' => 'CAPTURE',
'Amount' => $amount,
'TdFlag' => '2', // Nếu có tức là có 3Ds không có thì thôi. 3ds phải có cái này là bắt buộc.
]);

\Log::info('EntryTran Response:', ['response' => $entryResponse->body()]);
parse_str($entryResponse->body(), $entryData);

if (isset($entryData['AccessID']) && isset($entryData['AccessPass'])) {
// Lưu dữ liệu giao dịch vào cache với key "gmo_order_{orderID}"
Cache::put('gmo_order_' . $orderID, [
'accessID' => $entryData['AccessID'],
'accessPass' => $entryData['AccessPass'],
'orderID' => $orderID,
'amount' => $amount
], now()->addMinutes(30));

// Lưu thêm mapping từ AccessID -> OrderID
Cache::put('gmo_access_' . $entryData['AccessID'], $orderID, now()->addMinutes(30));

return $this->executeTransaction($orderID, $entryData['AccessID'], $entryData['AccessPass'], $token, $amount);
} else {
return response()->json(['error' => 'Failed to create EntryTran'], 400);
}
}

public function executeTransaction($orderID, $accessID, $accessPass, $token, $amount)
{
$execParams = [
'ShopID' => env('GMO_SHOP_ID'),
'ShopPass' => env('GMO_SHOP_PASSWORD'),
'AccessID' => $accessID,
'AccessPass' => $accessPass,
'OrderID' => $orderID,
'Token' => $token,
'Method' => '1',//1: Bulk 2: Installment 3: Bonus (One time) 5: Revolving
'JobCd' => 'CAPTURE',
'RetUrl' => env('GMO_RETURN_URL'), // URL return sau khi xác thực nếu dùng 3Ds2 là bắt buộc
];

$execResponse = Http::asForm()
->post(env('GMO_API_ENDPOINT') . '/ExecTran.idPass', $execParams);
// \Log::info('Executing transaction with Tds2RetUrl:', ['Tds2RetUrl' => $execParams['Tds2RetUrl']]);

\Log::info('ExecTran Response:', ['response' => $execResponse->body()]);

parse_str($execResponse->body(), $execData);

if (isset($execData['ErrCode'])) {
\Log::error('ExecTran Error:', ['data' => $execData]);
return response()->json([
'error' => 'ExecTran Error',
'code' => $execData['ErrCode'],
'info' => $execData['ErrInfo'] ?? 'Unknown error',
'status' => 'error',
], 400);
}

if (isset($execData['ACS']) && $execData['ACS'] == '2') {
\Log::info('Redirecting to 3D Secure:', ['url' => $execData['RedirectUrl']]);
$t = $execData['t'] ?? null;
$redirectUrl = $execData['RedirectUrl'] ?? null;
$url = $redirectUrl.'&t='.$t;
\Log::info('NEW URL PAYMENT'. $url);
return response()->json(['status' => 'ok', 'redirectUrl' => $url]);

}

return response()->json([
'error' => 'This card does not support 3D Secure. Please use a card with 3D Secure enabled.',
'status' => 'error'
], 400);
}
public function handleCallback(Request $request)
{
\Log::info('Received callback:', $request->all());

// Lấy AccessID từ request (giả sử key là "AccessID")
$data = $request->all();
$accessID = $data['AccessID'] ?? null;
if (!$accessID) {
\Log::error('Missing AccessID in callback', $request->all());
return response()->json([
'error' => 'Missing AccessID',
'status' => 'error'
], 400);
}

// Lấy OrderID từ mapping cache với key "gmo_access_{AccessID}"
$orderID = Cache::get('gmo_access_' . $accessID);
if (!$orderID) {
\Log::error('Mapping for AccessID not found in cache', ['AccessID' => $accessID]);
return response()->json([
'error' => 'Transaction expired or invalid cache data',
'status' => 'error'
], 400);
}

// Lấy dữ liệu giao dịch từ cache theo key "gmo_order_{orderID}"
$orderData = Cache::get('gmo_order_' . $orderID);
if (!$orderData) {
\Log::error('Cache data missing for transaction', ['orderID' => $orderID]);
return response()->json([
'error' => 'Transaction expired or invalid cache data',
'status' => 'error'
], 400);
}

$accessPass = $orderData['accessPass'];
$amount = $orderData['amount'];

\Log::info('Processing transaction completion', [
'AccessID' => $accessID,
'AccessPass' => $accessPass,
'OrderID' => $orderID,
'amount' => $amount
]);


$afterTranParams = [
'AccessID' => $accessID,
'AccessPass' => $accessPass,
];

$afterTranResponse = Http::asForm()
->post(env('GMO_API_ENDPOINT') . '/SecureTran2.idPass', $afterTranParams);

\Log::info('SecureTran2 Response:', ['response' => $afterTranResponse->body()]);
parse_str($afterTranResponse->body(), $alterTranData);

if (isset($alterTranData['ErrCode'])) {
\Log::error('SecureTran2 Error:', ['data' => $alterTranData]);
return response()->json([
'error' => 'SecureTran2 Error',
'code' => $alterTranData['ErrCode'],
'info' => $alterTranData['ErrInfo'] ?? 'Unknown error',
'status' => 'error'
], 400);
}
\Log::info('data', ['response' => $afterTranResponse->body()]);
// Xóa dữ liệu cache sau khi giao dịch hoàn tất
Cache::forget('gmo_order_' . $orderID);
Cache::forget('gmo_access_' . $accessID);
return response()->json(['data' => $afterTranResponse-> body()]);
}

}
 

Thống kê chủ đề

Ngày tạo
sieudubi,
Người trả lời cuối
sieudubi,
Trả lời
55
Lượt xem
10.650
Quay lại
Lên đầu trang