├── .gitattributes ├── .gitignore ├── README.md ├── examples ├── payment_initialization.php └── payment_validation.php └── robokassa.class.php /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | [Dd]ebug/ 46 | [Rr]elease/ 47 | *_i.c 48 | *_p.c 49 | *.ilk 50 | *.meta 51 | *.obj 52 | *.pch 53 | *.pdb 54 | *.pgc 55 | *.pgd 56 | *.rsp 57 | *.sbr 58 | *.tlb 59 | *.tli 60 | *.tlh 61 | *.tmp 62 | *.vspscc 63 | .builds 64 | *.dotCover 65 | 66 | ## TODO: If you have NuGet Package Restore enabled, uncomment this 67 | #packages/ 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | 76 | # Visual Studio profiler 77 | *.psess 78 | *.vsp 79 | 80 | # ReSharper is a .NET coding add-in 81 | _ReSharper* 82 | 83 | # Installshield output folder 84 | [Ee]xpress 85 | 86 | # DocProject is a documentation generator add-in 87 | DocProject/buildhelp/ 88 | DocProject/Help/*.HxT 89 | DocProject/Help/*.HxC 90 | DocProject/Help/*.hhc 91 | DocProject/Help/*.hhk 92 | DocProject/Help/*.hhp 93 | DocProject/Help/Html2 94 | DocProject/Help/html 95 | 96 | # Click-Once directory 97 | publish 98 | 99 | # Others 100 | [Bb]in 101 | [Oo]bj 102 | sql 103 | TestResults 104 | *.Cache 105 | ClientBin 106 | stylecop.* 107 | ~$* 108 | *.dbmdl 109 | Generated_Code #added for RIA/Silverlight projects 110 | 111 | # Backup & report files from converting an old project file to a newer 112 | # Visual Studio version. Backup files are not needed, because we have git ;-) 113 | _UpgradeReport_Files/ 114 | Backup*/ 115 | UpgradeLog*.XML 116 | 117 | 118 | 119 | ############ 120 | ## Windows 121 | ############ 122 | 123 | # Windows image file caches 124 | Thumbs.db 125 | 126 | # Folder config file 127 | Desktop.ini 128 | 129 | 130 | ############# 131 | ## Python 132 | ############# 133 | 134 | *.py[co] 135 | 136 | # Packages 137 | *.egg 138 | *.egg-info 139 | dist 140 | build 141 | eggs 142 | parts 143 | bin 144 | var 145 | sdist 146 | develop-eggs 147 | .installed.cfg 148 | 149 | # Installer logs 150 | pip-log.txt 151 | 152 | # Unit test / coverage reports 153 | .coverage 154 | .tox 155 | 156 | #Translations 157 | *.mo 158 | 159 | #Mr Developer 160 | .mr.developer.cfg 161 | 162 | # Mac crap 163 | .DS_Store 164 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Данный класс не охватывает весь спектр возможностей API робокассы, однако он упрощает такие базовые задачи работы с ним, как: 2 | * инициализация оплаты 3 | * проверка оплаты у себя на сервере 4 | 5 | # Использование 6 | Примеры применения класса можно посмотреть в папке `examples`, весь код прокоментирован. 7 | 8 | ## Параметры класса 9 | * `OutSum` - Сумма для оплаты в условных единицах(по умолчанию - рубли) 10 | * `IncCurrLabel` - Валюта для проведения платежа(по умолчанию - рубли) 11 | * `InvId` - Номер заказа. Используется для идентификации трансакции на вашем сервере. Если не указать - будет сгенерирован на сервере Робокассы автоматически. 12 | * `Desc` - Описание платежа 13 | * `Email` - Email пользователя. Может быть изменен в процессе оплаты. 14 | * `Culture` - Язык интерфейся формы оплаты. По умолчанию - `ru` 15 | 16 | 17 | ## Методы класса 18 | * `addCustomValues` - Добавление других параметров к запросу. Принимает в качестве параметра именованный массив с данными. Все индексы в массиве должны быть с префиксом `shp_`, иначе Робокасса их проигнорирует 19 | * `getRedirectURL` - Генерирует URL для переадресации пользователя на страницу оплаты. 20 | * `checkHash` - Проверяет цифровую подпись запроса. Принимает в качестве параметра переданный роботом Робокассы POST параметр `SignatureValue` -------------------------------------------------------------------------------- /examples/payment_initialization.php: -------------------------------------------------------------------------------- 1 | OutSum = 500; 21 | $kassa->IncCurrLabel = 'WMRM'; 22 | $kassa->Desc = 'Тестовая оплата'; 23 | 24 | $kassa->addCustomValues(array( 25 | 'shp_user' => $userId, // все ключи массива должны быть с префиксом shp_ 26 | 'shp_someData' => 'someValue' 27 | )); 28 | 29 | /* редирект на сайт робокассы */ 30 | header('Location: ' . $kassa->getRedirectURL()); -------------------------------------------------------------------------------- /examples/payment_validation.php: -------------------------------------------------------------------------------- 1 | OutSum = $_POST['OutSum']; 21 | $kassa->InvId = $_POST['InvId']; 22 | 23 | /* добавление кастомных полей из запроса */ 24 | $kassa->addCustomValues(array( 25 | 'shp_user' => $_POST['shp_user'], 26 | 'shp_someData' => $_POST['shp_someData'] 27 | )); 28 | 29 | /* проверка цифровой подписи запроса */ 30 | if($kassa->checkHash($_POST['SignatureValue'])) 31 | echo 'Оплата проведена успешно!'; 32 | else 33 | echo 'Валидация не пройдена'; -------------------------------------------------------------------------------- /robokassa.class.php: -------------------------------------------------------------------------------- 1 | login = $login; 37 | $this->password1 = $pass1; 38 | $this->password2 = $pass2; 39 | 40 | if($test) $this->endpoint = 'http://test.robokassa.ru/Index.aspx?'; 41 | } 42 | 43 | /** 44 | * Добавление пользовательских значений в запрос 45 | * 46 | * @param array $vars именованный массив с переменными(названия указывать с суффиксом shp_) 47 | * @return none 48 | */ 49 | public function addCustomValues($vars) 50 | { 51 | if(!is_array($vars)) throw new Exception('Function `addCustomValues` take only array`s'); 52 | 53 | foreach($vars as $k => $v) 54 | $this->customVars[$k] = $v; 55 | 56 | } 57 | 58 | /** 59 | * Получение URL для запроса 60 | * 61 | * @return string $url 62 | */ 63 | public function getRedirectURL() 64 | { 65 | $customVars = $this->getCustomValues(); 66 | $hash = md5("{$this->login}:{$this->OutSum}:{$this->InvId}:{$this->password1}{$customVars}"); 67 | $invId = ($this->InvId !== '') ? '&InvId=' . $this->InvId : ''; 68 | $IncCurrLabel = ($this->IncCurrLabel !== '') ? '&IncCurrLabel=' . $this->IncCurrLabel : ''; 69 | $Email = ($this->Email !== '') ? '&Email=' . $this->Email : ''; 70 | 71 | return $this->endpoint . 'MrchLogin=' . $this->login 72 | . '&OutSum=' . (float) $this->OutSum 73 | . $invId 74 | . '&Desc=' . urlencode($this->Desc) 75 | . '&SignatureValue=' . $hash 76 | . $IncCurrLabel 77 | . $Email 78 | . '&Culture=' . $this->Culture 79 | . $this->getCustomValues($url = true); 80 | } 81 | 82 | /** 83 | * Проверка исполнения операции. Сравнение хеша 84 | * 85 | * @param string $hash значение SignatureValue, переданное кассой на Result URL 86 | * @param boolean $checkSuccess проверка параметров в скрипте завершения операции (SuccessURL) 87 | * @return boolean $hashValid 88 | */ 89 | public function checkHash($hash, $checkSuccess = false) 90 | { 91 | $customVars = $this->getCustomValues(); 92 | $password = $checkSuccess ? $this->password1 :$this->password2; 93 | $hashGenerated = md5("{$this->OutSum}:{$this->InvId}:{$password}{$customVars}"); 94 | 95 | return (strtolower($hash) == $hashGenerated); 96 | } 97 | 98 | /** 99 | * Проверка завершения операции (проверка оплаты). Сравнение хеша 100 | * 101 | * @param string $hash значение SignatureValue, переданное кассой на Result URL 102 | * @return boolean $hashValid 103 | */ 104 | public function checkSuccess($hash) { 105 | return $this->checkHash($hash, true); 106 | } 107 | 108 | /** 109 | * Получение строки с пользовательскими данными для шифрования 110 | * 111 | * @param boolean $url генерация строки для использования в URL true/false 112 | * @return string 113 | */ 114 | private function getCustomValues($url = false) 115 | { 116 | $out = ''; 117 | $customVars = array(); 118 | if(!empty($this->customVars)) 119 | { 120 | foreach($this->customVars as $k => $v) 121 | $customVars[$k] = $k . '=' . $v; 122 | 123 | sort($customVars); 124 | 125 | if($url === TRUE) 126 | $out = '&' . join('&', $customVars); 127 | else 128 | $out = ':' . join(':', $customVars); 129 | } 130 | 131 | return $out; 132 | } 133 | 134 | } 135 | --------------------------------------------------------------------------------