2017-03-08 75 views
-1

我正在使用萬事達卡支付網關。 所有工作正常,如果我硬編碼hash_hmac sha256的數據或字符串。如何將變量分配給hash_hmac sha256字符串或php中的數據?

的工作版本:

$vpcURL = 'https://migs.mastercard.com.au/vpcpay?'; 
$secret = strtoupper("MYSECRET CODE"); 

$data ="vpc_AccessCode=0E5AC9E6&vpc_Amount=1000&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.examplesite.com/payment-confirmation/&vpc_Version=1"; 

$sha256_hmac = strtoupper(hash_hmac('sha256', $data, pack('H*', $secret))); 
header("Location: " . $vpcURL . "&" . $data . "&vpc_SecureHash=" . $sha256_hmac."&vpc_SecureHashType=SHA256"); 

,但我不能硬編碼的值傳遞給vpc_Amount 我從一個表單,用戶可以輸入他們希望量越來越量。

所以我從得到的量:

$totalAmount = $_POST['totalAmount']; 

現在我想這個$總金額傳遞到$數據。 所以我的$的數據改成這樣:

$data ="vpc_AccessCode=0E5AC9E6&vpc_Amount=$totalAmount&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.examplesite.com/payment-confirmation/&vpc_Version=1"; 

當我用這個支付網關直接進入確認頁面:https://www.examplesite.com/payment-confirmation/和所有的值都是空的。

我認爲這是一個簡單的錯誤了Syntex ..

我該如何解決這個問題? 如何正確傳遞$totalAmount$data

print_r ($data); gives this: 

vpc_AccessCode=0E5AC9E6&vpc_Amount=58,258.00&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.examplesite.com/payment-confirmation/?vpc_Version=1 

UPDATE 如果我更新在確認頁面代碼

$real_integer_amount = filter_var($totalAmount, FILTER_SANITIZE_NUMBER_INT); 

$data ="vpc_AccessCode=0E5BC9E7&vpc_Amount={$real_integer_amount}&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.examplesite.com/payment-confirmation/?vpc_Version=1"; 

它顯示了真正的量和其他都是空的,但仍然不打算支付網關,其中用戶可以輸入他們的信用卡詳細信息

+0

你可能想插入'{$ totalAmount}' – pvg

+0

我看不到你的代碼中有任何語法錯誤。你有沒有收到任何錯誤信息?你有沒有檢查你的錯誤日誌?在對它進行散列並檢查它看起來是否正確之前,請回顯該字符串。 –

+0

@pvg你能給你的建議檢查一下嗎? –

回答

0

我張貼在第一部作品非常好....

如果我改變vpc_amount任何(硬編碼)值的作品..

的問題是,當我分配到$totalAmountvpc_amount變量($總金額)持有小數點和千個分隔符.. ,使這個問題..

我只是想通過這個totalAmountdata,使其工作之前,消毒變量..

所以我已經更新了它:

$real_integer_amount = filter_var($totalAmount, FILTER_SANITIZE_NUMBER_INT); 

,現在能正常工作..

所以最終的工作代碼爲:

$vpcURL = 'https://migs.mastercard.com.au/vpcpay?'; 
$secret = strtoupper("My Secret Code"); 

$real_integer_amount = filter_var($totalAmount, FILTER_SANITIZE_NUMBER_INT); 

$data ="vpc_AccessCode=0E5AC9E6&vpc_Amount=$real_integer_amount&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=TEST_TRN&vpc_Merchant=TESTSITE&vpc_OrderInfo=123&vpc_ReturnURL=https://www.trinitycollege.lk/payment-confirmation/&vpc_Version=1"; 

$sha256_hmac = strtoupper(hash_hmac('sha256', $data, pack('H*', $secret))); 
header("Location: " . $vpcURL . "&" . $data . "&vpc_SecureHash=" . $sha256_hmac."&vpc_SecureHashType=SHA256"); 

@MagnusEriksson:感謝時間和建議..網址編碼對此問題沒有任何影響。

@PVG沒有任何拼寫錯誤..如果我只是用在$data沒有工作{$totalAmount} ..但是這需要這樣的:FILTER_SANITIZE_NUMBER_INT

@miken32感謝您的回答。我試着只是用我的實際細節更換PARAMS使用你的代碼..但它給了我這個錯誤「HTTP Status - 400 E5000: Cannot form a matching secure hash based on the merchant's request using either of the two merchant's secrets

我仔細檢查過的拼寫和值/ PARAMS

這可能有助於別人在將來..

0

我無法想象接收服務器想要值中的逗號。此外,你應該建立一個查詢字符串,像這樣以避免轉義值問題:

<?php 
$vpcURL = 'https://migs.mastercard.com.au/vpcpay?'; 
$secret = strtoupper("MYSECRET CODE"); 
$totalAmount = str_replace(",", "", $_POST["totalAmount"]); 

$data = [ 
    "vpc_AccessCode" => "0E5AC9E6", 
    "vpc_Amount" => $totalAmount, 
    "vpc_Command" => "pay", 
    "vpc_Locale" => "en", 
    "vpc_MerchTxnRef" => "TEST_TRN", 
    "vpc_Merchant" => "TESTSITE", 
    "vpc_OrderInfo" => "123", 
    "vpc_ReturnURL" => "https://www.examplesite.com/payment-confirmation/", 
    "vpc_Version" => "1", 
]; 
$data = http_build_query($data); 

$sha256_hmac = strtoupper(hash_hmac('sha256', $data, pack('H*', $secret))); 
header("Location: " . $vpcURL . "&" . $data . "&vpc_SecureHash=" . $sha256_hmac."&vpc_SecureHashType=SHA256"); 
+0

感謝那乾淨的代碼片段..但我現在得到這個錯誤'HTTP狀態 - 400 E5000:無法形成一個匹配的安全哈希根據商人的要求使用兩個商人的祕密' –

+0

不應該'$ vpcURL。 「&」。 $ data'只是'$ vpcURL。 $ data'? –

+0

有些東西告訴我'&vpc_Version = 1'不應該用returnURL編碼,而應該只是另一個參數。 @RiffazStarr是我的假設是否正確? –

相關問題