Большая проблема заключается в том, что вам нужно преобразовать hashedApiData QByteArray в шестнадцатеричный код:
QString APIMD5Signature(hashedApiData.toHex());
Это может сделать это для вас, но вы все равно можете вызвать проблемы с преобразованием туда и обратно в строки, которые вам на самом деле не нужны.
Вот как я справляюсь, создавая подпись и делая пост в Facebook. m_argMap
содержит пары для POST (например, <"format", "XML">), за исключением секрета, который не нужен для POST, но необходим для sig. (Я использую QVariant там из-за некоторой предварительной обработки, которая происходит с этим QMap, прежде чем он попадет сюда).
QByteArray sigByteArray;
QByteArray postArgs;
// QMap is automatically sorted by keys
QMapIterator<QString, QVariant> i(m_argMap);
while (i.hasNext()) {
i.next();
sigByteArray.append(i.key() + "=" + i.value().toString() );
postArgs.append(i.key() + "=" + i.value().toString() + "&");
}
sigByteArray.append(m_userInfo->getSecret());
QByteArray sig = QCryptographicHash::hash(sigByteArray,QCryptographicHash::Md5 );
postArgs.append("sig=");
postArgs.append(sig.toHex());
QByteArray exclude("&=");
QByteArray include;
postArgs = postArgs.toPercentEncoding(exclude,include,'%');
// qDebug() << postArgs;
QUrl url("http://api.facebook.com/restserver.php");
QNetworkRequest nr;
nr.setUrl(url);
nr.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
m_reply = m_manager->post(nr,postArgs);