Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #81, СЕНТЯБРЬ 2005 г.

Механика wm-процессинга

nikitozz

Хакер, номер #081, стр. 081-128-3


[код функции, реализующий HTTPS-запрос]

function _HttpsReq($addr)

{

$ch = curl_init("https://w3s.webmoney.ru".$addr);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_CAINFO, "/home/apache/ired/htdocs/pay/wm.crt"); #здесь надо указать путь к сертификату, или можно установить его в SSL

$result=curl_exec($ch);

curl_close($ch);

return $result;

}

Если возиться с сертификатами не хочется, а хочется побыстрее попробовать систему в действии, нужно заменить строку curl_setopt($ch, CURLOPT_CAINFO…) на curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE). Хоть делать так разработчики не советуют, нашим опытам это не помешает ни капельки. Другое дело, что так нельзя делать с большим магазином, где крутятся деньги.

После того, как ты исправишь функцию _HttpsReq, или установишь сертификат, все должно заработать. Теперь давай разберемся с тем, как функционирует эта программа. В файле wm.inc найди функцию InvCreate:

[код фукнции, реализующей выписку счета через https-интерфейс]

function InvCreate($wmid, $summ, $inv_id, $dsc, $adr)

{

//поскипано, тут объявляются переменные

$PlanStr = "$OrderID$LoginOfCust$PurseOfStores$Amount$Desc$InvAddress$Period$Experation$RequestN";#пописываемая строка запроса

$SignStr = _GetSign($PlanStr); #формируется подпись запроса

$W3sUrl="/asp/Invoice.asp?SL=$LoginOfStores&SP=$PurseOfStores&CL=$LoginOfCust&IN=$OrderID&D=".urlencode($Desc)."&AD=".urlencode($InvAddress)."&A=$Amount&E=$Experation&P=$Period&RN=$RequestN&SS=$SignStr";#соствляется URL get-запроса

$httpsRes = _HttpsReq($W3sUrl);#выполняется запрос

if (substr($httpsRes,0,6) == "Error:") #разбирается ответ. Если произошла ошибка

{

$errCode = sprintf("%d", substr($httpsRes,6)); #получается код ошибки

#поскипано. Тут в зависимости от кода ошибки выводятся разные сообщения

if (substr($httpsRes,0,8) == "WMInvId:") #Если все выполнилось нормально

{

$wminv_id = sprintf("%d", substr($httpsRes,8));#получаем номер счета

} return array($wminv_id, $err);

}

Как видишь, все просто. Фактически, работа функции сводится к формированию URL, к которому следует обратиться, чтобы выполнить транзакцию. В самом деле: из параметров запроса, согласно документации, формируется подписываемая строка, затем, при помощи функции _GetSign, формируется ЦП, которая помещается в качестве параметра запроса с именем SS. После того, как в соотвествующие GET-поля, согласно документации, установлены значения параметров запроса, при помощи функции _HttpReq он отправляется серверу и происходит нехитрая обработка ответа. Что касается функции _GetSign, то идеологически работает она просто: при помощи знакомой тебе функции popen открывается пайп с процессом WMSigner, туда вдувается подписываемая строка и извлекается ЦП запроса. Что касается _HttpReq, то этот блок кода приведен чуть выше. Легко видеть, что он использует в своей работе функции curl, краткое описание которых ты найдешь в соответствующей документации на нашем диске.

Назад на стр. 081-128-2  Содержание  Вперед на стр. 081-128-4