То, что у вас есть, скорее всего, «отрезано» от URL-адреса, и оно находится в кодированной форме URL. Таким образом, чтобы получить строку Base64, вы должны сначала ее декодировать, для этого вы можете использовать url.PathUnescape()
.
Получив неэкранированную строку, вы можете декодировать ее с помощью кодера base64.StdEncoding
. Обратите внимание, что только потому, что он является / был частью URL, это не делает его строкой base64, в которой использовался алфавит безопасной для URL версии Base64.
Кроме того, знаки +
в центре этого на самом деле просто "мусор". Они не должны быть там, во-первых, так что перепроверьте, как вы получаете свой вклад, но теперь, когда они есть, вы должны удалить их. Для этого вы можете использовать strings.Replace()
.
Окончательный код для декодирования вашего неверного ввода:
s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"
s = strings.Replace(s, "+", "", -1)
var err error
if s, err = url.PathUnescape(s); err != nil {
panic(err)
}
out, err := base64.StdEncoding.DecodeString(s)
if err != nil {
panic(err)
}
fmt.Println(string(out))
Полный вывод (попробуйте на Go Playground ):
{"threeDSServerTransID":"13fe71d4-d10d-4220-a216-2006d1dd4cb8",
"acsTransID":"d7c45f99-9478-44a6-b1f2-100000003366","messageType":"CReq",
"messageVersion":"2.1.0","challengeWindowSize":"02"}
Обратите внимание, что знак +
является действительным символом в алфавите стандартного Base64, и вы даже можете декодировать Base64, не удаляя символы +
, но тогда вы получите ненужные данные, оставшиеся в ключах JSON в результат.