2017-01-04 45 views
0

我目前正在尝试创建一个C++程序来跟踪一堆ASIN的价格。 我使用C++与Qt(5.5版),通过Xcode(5.1.1)在Mac OSX上编译。 编译时,它正在运行但没有输出。我已经不是下面的警告消息(我加密ACCESSKEY & AssociateTag隐私的原因为“/////////////”)AWS查询通过Qt(mac-OSX)没有得到任何结果

*QUrl("http://ecs.amazonaws.com/onca/xml?AWSAccessKeyId=///////////////&AssociateTag=/////////////&ItemId=B00181T20O&Operation=ItemLookup&ResponseGroup=OfferSummary&Service=AWSECommerceService&Signature=1K69SLmTkZ9hZwwt5ualR4uDRwY%3D&SignatureMethod=HmacSHA1&Timestamp=2017-01-04T10%3A21%3A46Z") 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
qt.network.ssl: Error receiving trust for a CA certificate 
"<?xml version=\"1.0\"?>\n<ItemLookupErrorResponse 
xmlns=\"http://ecs.amazonaws.com/doc/2005-10-05/\"><Error> 
<Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated 
does not match the signature you provided. Check your AWS Secret Access Key and 
signing method. Consult the service documentation for details.</Message></Error> 
<RequestId>f4626242-a110-43f1-9b56-b8a696b3f299</RequestId> 
</ItemLookupErrorResponse>" 

RET: 
("", "")* 

要再次测试它,我复制URL(第一几行警告消息),我也遇到同样的错误: “我们计算的请求签名与您提供的签名不匹配,请检查您的AWS秘密访问密钥和签名方法。 “。

任何人都可以给我一个URL的错误提示吗? 在此先感谢!

+0

您能否给我们提供一个基本的代码示例? –

+0

我尝试输入看起来与我最相关的部分(我无法嵌入整个.zip文件) – Starver

+0

错误应该在SignatureMethod上,根据我的A | B测试,但无法找到使用哪种方法。 – Starver

回答

0

这是代码中最相关的部分。我怀疑我无法嵌入.zip文件

AWSQueryRequest::AWSQueryRequest(QObject *parent) : 
    QObject(parent) 
{ 
    m_netManager = new QNetworkAccessManager(this); 
} 

QString AWSQueryRequest::hmacSha1(QByteArray key, QByteArray baseString) 
{ 
    int blockSize = 64; // HMAC-SHA-1 block size, defined in SHA-1 standard 
    if (key.length() > blockSize) 
    { 
     // if key is longer than block size (64), reduce key length with SHA-1 compression 
     key = QCryptographicHash::hash(key, QCryptographicHash::Sha1); 
    } 

    QByteArray innerPadding(blockSize, char(0x36)); // initialize inner padding with char "6" 
    QByteArray outerPadding(blockSize, char(0x5c)); // initialize outer padding with char "quot; 
    // ascii characters 0x36 ("6") and 0x5c ("quot;) are selected because they have large 
    // Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance) 

    for (int i = 0; i < key.length(); i++) 
    { 
     innerPadding[i] = innerPadding[i]^key.at(i); // XOR operation between every byte in key and innerpadding, of key length 
     outerPadding[i] = outerPadding[i]^key.at(i); // XOR operation between every byte in key and outerpadding, of key length 
    } 

    // result = hash (outerPadding CONCAT hash (innerPadding CONCAT baseString)).toBase64 
    QByteArray total = outerPadding; 
    QByteArray part = innerPadding; 
    part.append(baseString); 
    total.append(QCryptographicHash::hash(part, QCryptographicHash::Sha1)); 
    QByteArray hashed = QCryptographicHash::hash(total, QCryptographicHash::Sha1); 
    return hashed.toBase64(); 
} 

QByteArray AWSQueryRequest::getTimeStamp() 
{ 
    QDateTime dateTime = QDateTime::currentDateTimeUtc(); 
    return dateTime.toString(Qt::ISODate).toUtf8(); 
} 

QByteArray AWSQueryRequest::createSignature(const QMap<QString,QString> & queryItems) 
{ 
    QUrl url(END_POINT); 
    QString stringToSign = "GET\n"; 
    stringToSign.append(url.host() + "\n"); 
    stringToSign.append(url.path() + "\n"); 

    QList<QString> keys = queryItems.keys(); 
    for(int i=0; i < keys.count() ; ++i) 
    { 
     stringToSign.append(keys[i]+"="+queryItems[keys[i]]); 
     if(i != keys.count() -1 ) 
      stringToSign.append("&"); 
    } 
    QString signature = hmacSha1(AWS_PASS, stringToSign.toUtf8()); 
    return QUrl::toPercentEncoding(signature); 
} 
#if 0 
QByteArray AWSQueryRequest::createSignature(const QList< QPair<QString,QString> > & queryItems) 
{ 
    QUrl url(END_POINT); 
    QString stringToSign = "GET\n"; 
    stringToSign.append(url.host() + "\n"); 
    stringToSign.append(url.path() + "\n"); 

    for (int i=0; i<queryItems.count(); ++i) 
    { 
     QPair<QString,QString> pairValue = queryItems[i]; 
     stringToSign.append(pairValue.first+"="+pairValue.second); 
     if(i != queryItems.count() -1) 
      stringToSign.append("&"); 
    } 

    QString signature = hmacSha1(AWS_PASS, stringToSign.toUtf8()); 
    return QUrl::toPercentEncoding(signature); 
} 
#endif 
QUrl AWSQueryRequest::createUrl(const QMap< QString,QString >& queryItems) 
{ 
    QUrl url(END_POINT); 
    QUrlQuery query; 
    QMapIterator<QString, QString> it(queryItems); 
    while (it.hasNext()) 
    { 
     it.next(); 
     query.addQueryItem(it.key().toUtf8(), it.value().toUtf8()); 
    } 
    url.setQuery(query); 
    return url; 

}