Скорее всего, вы испортили базовую строку подписи. То, как вы строите свои параметры, пытается укорочить и изменить некоторые шаги, и, похоже, отсутствует уровень кодирования. Вы строите список параметров элементов, таких как:
E(k) + E('=') + E(v)
затем сортирует их по объединенной кодированной строке пары ключ-значение, затем объединяет все эти строки, например
P_{i} + E('&') + P_{i + 1}
Это пропускает уровень кодирования для пар, потому что то, что вы должны получить для той части базовой строки сигнатуры, которая соответствует параметрам, на самом деле (для простоты предполагается две пары ключ-значение):
E(E(k) + '=' + E(v) + '&' + E(k2) + '=' + E(v2))
=
E(E(k)) + E('=') + E(E(v)) + E('&') + E(E(k2)) + E('=') + E(E(v2))
Это означает, что знаки %
в символах с экранированием процентов клавиш и значений сами по себе экранированы, поэтому #
сначала превращается в %23
, а затем в %2523
, поскольку E('%') = '%25'
.
Если вы будете следовать стандартным пошаговым инструкциям, у вас все будет хорошо. Если вы отступите от стандарта без подтверждения эквивалентности, вы, скорее всего, ошибетесь.