我試圖將PagSeguro(支付網關 - 巴西版本的PayPal)併入我的網站。客戶完成PagSeguro後,他們將數據(通過POST)發送到我指定的功能。但是,我沒有收到POST。在完成所有我能想到的故障排除之後,我聯繫了PagSeguro。他們說他們的日誌表明POST正在正常發送,但他們正在接收HTTP 302響應。無法模擬HTTP 302響應
爲了弄清楚爲什麼發生這種情況,我創建了隱藏值的形式來模擬發送POST到我的功能。我把這個表格放在不同的域名下,以防與它有關。每次我從模擬表單發送POST時,都會收到一個HTTP 200響應,而我的日誌表明POST已收到。
PagSeguro如何接收與我的模擬不同的響應?它可能與服務器有關或與我的腳本有關嗎?
下面是函數(使用笨)其他應當接受POST:
function pagseguro_retorno(){
if (count($_POST) == 0) {
return FALSE;
}
$msg = 'POST RECEIVED';
$simulate = $this->input->post('Simulate');
if (! empty($simulate)){
$result = 'VERIFICADO';
$msg .= ' FROM SIMULATOR';
} else {
$this->load->library(PagSeguroNpi);
$result = $this->PagSeguroNpi->notificationPost();
}
$this->log($msg);
if ($result == "VERIFICADO") {
$id = $this->input->post('Referencia');//cart id
$this->load->model('transacao_model');
$trans_row = $this->transacao_model->get_transaction($id);
if (! is_object($trans_row)){
//LOAD NEW TRANSACTION
if (! $this->new_transaction($id)){
$notice = "Unable to load new transaction</p><p>";
$this->log($notice);
$notice .= '<pre>'.print_r($_POST, TRUE).'</pre>';
$this->email_notice($notice);
}
}
$this->load->model('carrinho_model');
if($_POST['StatusTransacao'] == 'Aprovado'){
$status = 'apr';
}elseif($_POST['StatusTransacao'] == 'Em Análise'){
$status = 'anl';
}elseif($_POST['StatusTransacao'] == 'Aguardando Pagto'){
$status = 'wtg';
}elseif($_POST['StatusTransacao'] == 'Completo'){
$status = 'cmp';
//nothing more happens here - client must click on 'mark as shipped' before cart is removed and history data is loaded
}elseif($_POST['StatusTransacao'] == 'Cancelado'){
//reshelf - don't set $status, because the cart's about to be destroyed
$this->carrinho_model->reshelf(array($id));
}
if (isset($status)){
$this->carrinho_model->update_carrinho($id, array('status' => $status));
}
} else if ($result == "FALSO") {
$notice = "PagSeguro return was invalid.";
$this->log($notice);
$notice .= '<pre>'.print_r($_POST, TRUE).'</pre>';
$this->email_notice($notice);
} else {
$notice = "Error in PagSeguro request";
$this->log($notice);
$notice .= '<pre>'.print_r($_POST, TRUE).'</pre>';
$this->email_notice($notice);
}
}
安全更新:
張貼後,我很快就意識到,我是開自己交給了黑客攻擊。該功能必須是公開的,所以任何知道該功能名稱的人都可以訪問它併發布「模擬」以便立即進行驗證。然後他們可以傳遞他們想要的任何數據。
我改變了函數的名字的東西,是不可能的猜測,而當沒有在生產模式,我已禁用的模擬選項。
您是否嘗試過記錄請求以確保PagSeguro實際上正在請求正確的頁面?最好確定一下。 –
我不知道你的意思是如何記錄請求,但毫無疑問,他們正在請求正確的頁面。我已經多次驗證了該網址。 –
我的意思是在Apache日誌,谷歌分析,你的PHP應用程序,無論你想要的。使用HTTP_REFERER,請求的URL和GET/POST參數將每個請求寫入日誌文件,以確保它是正確的。如果你* 100%肯定*他們正在請求正確的URL,正確的參數,然後從來沒有 - 但我會犯錯謹慎的一面,只是確保。 –