Механика 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, краткое описание которых ты найдешь в соответствующей документации на нашем диске. |