Не могу сделать правильную контрольную сумму MD5 для модуля Робокассы

J2
На сайте с 13.12.2011
Offline
46
858

Здравствуйте. Помогите пожалуйста уже голову сломал. Как сделать правильную контрольную сумму MD5. Переделываю уже существующий модуль оплаты Пайпал на Робокассу.

Вот такой код используется

<?php defined('InShopNC') or exit('Access Invalid!');

class robokassa{

private $alipay_gateway_new = 'http://test.robokassa.ru/Index.aspx?';
private $code = 'robokassa';
private $payment;
private $order;
private $parameter;
private $order_type;

public function __construct($payment_info=array(),$order_info=array()){
if (!extension_loaded('openssl')) $this->alipay_verify_url = 'http://test.robokassa.ru/Index.aspx?';
if(!empty($payment_info) and !empty($order_info)){
$this->payment = $payment_info;
$this->order = $order_info;
}
}

/**
* Запросы для получения оплаты интерфейс
*
* @return string
*/
public function get_payurl(){
$this->parameter = array(
'mrh_pass1' => $this->payment['payment_config']['mrh_pass1'],
'Encoding' => CHARSET, //Сайт Кодирование
'sign_type' => 'MD5', //Подпись способ
'Desc' => 'ROBOKASSA Advanced User Guide', //Наименование
'MrchLogin' => $this->payment['payment_config']['mrh_login'], //Партнер ID
'InvId' => 0, //Внешний номер транзакции
'IncCurrLabel' => '', //типы оплаты
'Shp_item' => 1, //типы оплаты
'Culture' => 'ru', //типы оплаты
'OutSum' => $this->order['pay_amount'],//общая стоимость заказа

//'notify_url' => SHOP_SITE_URL."/api/payment/robokassa/notify_url.php", //URL Уведомление
//'return_url' => SHOP_SITE_URL."/api/payment/robokassa/return_url.php", //Вернуться URL
//'extra_common_param'=> $this->order['order_type'],//покупка продукт product_buy, predeposit предварительно пополнение счета
//'body' => $this->order['pay_sn'], //Описание продукта
//'logistics_type' => 'EXPRESS', //Логистика и методы распределения: POST (поверхность), EMS (EMS), Express (другой экспресс)
//'logistics_payment' => 'BUYER_PAY', //Логистика Оплата: SELLER_PAY (продавец платить), BUYER_PAY (покупатель платит), BUYER_PAY_AFTER_RECEIVE (наложенный платеж)
//'receive_name' => $_SESSION['member_name'],//Грузополучатель название
//'receive_address' => 'N', //приемник Адрес
//'receive_zip' => 'N', //Грузополучатель Почтовый
//'receive_phone' => 'N',//приемник Телефон
//'receive_mobile' => 'N',//Грузополучатель телефон
//'seller_email' => $this->payment['payment_config']['alipay_account'], //Электронная почта продавец
//'quantity' => 1,//количество
//'total_fee' => 0,//Логистика и издержки обращения
//'extend_param' => "isv^sh32",
);
$this->parameter['sign'] = $this->sign($this->parameter);
return $this->create_url();
}

/**
* Уведомление о проверки адреса
*
* @return bool
*/
public function notify_verify() {
$param = $_POST;
$param['mrh_pass1'] = $this->payment['payment_config']['mrh_pass1'];
$veryfy_url = $this->alipay_verify_url. "mrh_login=" .$this->payment['payment_config']['mrh_login']. "&notify_id=".$param["notify_id"];
$veryfy_result = $this->getHttpResponse($veryfy_url);
$mysign = $this->sign($param);
if (preg_match("/true$/i",$veryfy_result) && $mysign == $param["sign"]) {
$this->order_type = $param['extra_common_param'];
return true;
} else {
return false;
}
}

/**
* Вернуться Address Verification
*
* @return bool
*/
public function return_verify() {
$param = $_GET;
$param['act'] = "";//Пустые контроля параметров системы, потому что зашифрованные аутентификации для предотвращения ошибок
$param['op'] = "";
$param['mrh_pass1'] = $this->payment['payment_config']['mrh_pass1'];
$veryfy_url = $this->alipay_verify_url. "mrh_login=" .$this->payment['payment_config']['mrh_login']. "&notify_id=".$param["notify_id"];
$veryfy_result = $this->getHttpResponse($veryfy_url);
$mysign = $this->sign($param);
if (preg_match("/true$/i",$veryfy_result) && $mysign == $param["sign"]) {
$this->order_type = $param['extra_common_param'];
return true;
} else {
return false;
}
}

/**
*
* Заказы, сделанные статус платежа, успех или неудача
* @param array $param
* @return array
*/
public function getPayResult($param){
return $param['trade_status'] == 'TRADE_SUCCESS';
}

/**
*
*
* @param string $name
* @return
*/
public function __get($name){
return $this->$name;
}

/**
* Удаленный доступ к данным
* $ Адрес указать полный адрес URL путь
* @ Парам $ time_out тайм-аут. По умолчанию: 60
* Вернуться данных дистанционного выходных
*/
private function getHttpResponse($url,$time_out = "60") {
$urlarr = parse_url($url);
$errno = "";
$errstr = "";
$transports = "";
$responseText = "";
if($urlarr["scheme"] == "https") {
$transports = "ssl://";
$urlarr["port"] = "443";
} else {
$transports = "tcp://";
$urlarr["port"] = "80";
}
$fp=@fsockopen($transports . $urlarr['host'],$urlarr['port'],$errno,$errstr,$time_out);
if(!$fp) {
die("ERROR: $errno - $errstr<br />\n");
} else {
if (trim(CHARSET) == '') {
fputs($fp, "POST ".$urlarr["path"]." HTTP/1.1\r\n");
} else {
fputs($fp, "POST ".$urlarr["path"].'?encoding='.CHARSET." HTTP/1.1\r\n");
}
fputs($fp, "Host: ".$urlarr["host"]."\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($urlarr["query"])."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $urlarr["query"] . "\r\n\r\n");
while(!feof($fp)) {
$responseText .= @fgets($fp, 1024);
}
fclose($fp);
$responseText = trim(stristr($responseText,"\r\n\r\n"),"\r\n");
return $responseText;
}
}

/**
* Оформление платежных требований адрес интерфейса
*
* @return string
*/
private function create_url() {
$url = $this->alipay_gateway_new;
$filtered_array = $this->para_filter($this->parameter);
$sort_array = $this->arg_sort($filtered_array);
$arg = "";
while (list ($mrh_pass1, $val) = each ($sort_array)) {
$arg.=$mrh_pass1."=".urlencode($val)."&";
}

$url.= $arg."SignatureValue=" .$this->parameter['sign'];
return $url;
}

/**
* Alipay для получения подписи
*
* @return string
*/
private function sign($parameter) {
$mysign = "";

$filtered_array = $this->para_filter($parameter);
$sort_array = $this->arg_sort($filtered_array);
$arg = "";
while (list ($mrh_pass1, $val) = each ($sort_array)) {
$arg .= $mrh_pass1."=".$this->charset_encode($val,(empty($parameter['encoding'])?"utf-8":$parameter['encoding']),(empty($parameter['encoding'])?"utf-8":$parameter['encoding']))."&";
}
$prestr = substr($arg,0,-1); //Удалите последнюю амперсанд
$prestr .= $parameter['mrh_pass1'];
if($parameter['sign_type'] == 'MD5') {
$mysign = md5($prestr);
}elseif($parameter['sign_type'] =='DSA') {
//DSA Метод Подпись быть последующие развитие
die("Сигнатура метода DSA быть последующие развития, пожалуйста, использовать подпись путь MD5");
}else {
die("Paypal браузер не поддерживает".$parameter['sign_type']."Тип подписи образом");
}
return $mysign;

}

/**
* Снимите шаблон массив нулями и подпись
*
* @param array $parameter
* @return array
*/
private function para_filter($parameter) {
$para = array();
while (list ($mrh_pass1, $val) = each ($parameter)) {
if($mrh_pass1 == "sign" || $mrh_pass1 == "sign_type" || $mrh_pass1 == "mrh_pass1" || $val == "")continue;
else $para[$mrh_pass1] = $parameter[$mrh_pass1];
}
return $para;
}

/**
* Изменение порядка массив параметров
*
* @param array $array
* @return array
*/
private function arg_sort($array) {
ksort($array);
reset($array);
return $array;

}

/**
* Достижение разнообразные кодировки символов
*/
private function charset_encode($input,$_output_charset,$encoding="utf-8") {
$output = "";
if(!isset($_output_charset))$_output_charset = $this->parameter['encoding'];
if($encoding == $_output_charset || $input == null) {
$output = $input;
} elseif (function_exists("mb_convert_encoding")){
$output = mb_convert_encoding($input,$_output_charset,$encoding);
} elseif(function_exists("iconv")) {
$output = iconv($encoding,$_output_charset,$input);
} else die("sorry, you have no libs support for charset change.");
return $output;
}

}

Вот скриншет ошибки на робокассе при оплате

http://floomby.ru/s1/eW9Dd5

Это оригинальный MD5 робокассы

// формирование подписи

// generate signature

$crc  = md5("$mrh_login:$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item");
https://mallinru.ru/ (https://mallinru.ru/)
Kot Matroskin
На сайте с 29.08.2007
Offline
185
#1

Эта тема тысячу раз мусолилась. У них плохо описана процедура. Сам намучился с этим. Где-то нашёл решение. К сожалению не помню точно. Кажется что-то с выбором к какому серверу вы подключаетесь, к тестовому или к рабочему.

Я пользовался 11 разными хостингами. Есть только один ЛУЧШИЙ: ★ он тут ★ (https://goo.gl/R6v3zH) Пишите в ЛС за скидкой. VPS тоже в наличие ! Рекомендую.
R
На сайте с 18.12.2009
Offline
92
#2

На сайте робокассы есть рабочие примеры для php. Я когда настраивал, проблем не возникало.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий