вы signature шифруете хешем MD5?
тело запроса использует attachment, перед отправкой, все символы attachment нужно кодировать в url формат
на php
$encode_attachment = urlencode($attachment);
на js
var encode_attachment = encodeURIComponent(attachment);
на c#
string encode_attachment = HttpUtility.UrlEncode(attachment);
где attachment - ваш attachment до кодирования
encode_attachment - attachment после кодирования в url
и encode_attachment уже отправляете в MediaPost
на c# примерно выглядит так (работает)
h0 = "application_key=" + OK.APPK + "attachment=" + attachments + "format=jsongid=" + gid + "method=mediatopic.posttype=GROUP_THEME" + OK.SSK;
g = GetMD5Hash(string.Format("{0}", h0));
attachments = HttpUtility.UrlEncode(attachments);
request_path = "https://api.ok.ru/fb.do?application_key=" + OK.APPK + "&attachment=" + attachments + "&format=json&gid=" + gid + "&method=mediatopic.post&type=GROUP_THEME&sig=" + g + "&access_token=" + OK.AccessToken;
string req = Response(request_path, sender);
п.с. в подписе нужно использовать attachment до кодирования, а в самом запросе attachment кодированый
п.с.с. бывают некоторые энкодеры (на С# например есть...) которые не все символы обрабатывают.. если у вас не получается, хотя делаете всё верно - попробуйте сменить на аналогичный енкодер
п.с.с.с. MD5
для js (
тык)
для php
$hash = md5($str);
для c#
public static string GetMD5Hash(string input)
{
var x = new System.Security.Cryptography.MD5CryptoServiceProvider();
var bs = Encoding.UTF8.GetBytes(input);
bs = x.ComputeHash(bs);
var s = new StringBuilder();
foreach (var b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
return s.ToString();
}