Страницы

среда, 17 июля 2013 г.

PHP urlencode на JavaScript.

Сегодня тестировал один API. Там такая хитрая авторизация: берем массив параметров запроса в виде "ключ=значение", сортируем по алфавиту, собираем запрос, добавляем пару "password=пароль", получаем md5 от полученной строки и добавляем к запросу подпись в виде "signature=md5". Я решал на Node.js, а в документации к API приведен пример функции создания подписи на PHP. В примере значения параметров кодируются с помощью функции urlencode.



Пишу функцию создания подписи на JavaScript, параметры кодирую с помощью encodeURIComponent.
Отправляю запрос серверу - получаю ошибку авторизации.
Короче через некоторое время я начал подозревать, что urlencode() в PHP != encodeURIComponent() в JavaScript.
Решил с помощью следующего костыля:
function urlencode (str) {  
  str = (str + '').toString();
  return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
      replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}

Нашел здесь. Хозяйкам на заметку :).