2016-08-09 187 views
2

Ich versuche, dies zu Amazon mit Artikelsuche aufrufen und eine Liste von Artikeln zurückgeben, dann was ich tun möchte, ist die Rückkehr Artikel von einem bestimmten Verkäufer.ColdFusion Amazon Artikel Suche

<cfscript> 
    test = ItemLookup(ItemId="B00R6T0PLM",AWSAccessKeyId=request.awsaccesskeyid,AssociateTag=request.AssociateTag,secretkey=request.secretkey); 
</cfscript> 



<cffunction name="ItemLookup" hint="AZ lookup by PID"> 
    <cfargument name="ItemId"> 
    <cfargument name="AWSAccessKeyId" required="false" default="XXXXXXXXXXXXX"> 
    <cfargument name="AssociateTag" required="false" default="zzzzz-"> 
    <cfargument name="secretkey" required="false" default="YYYYYYYYYYYYYYYYYYY"> 
    <cfargument name="ResponseGroup" required="false" default="Medium"> 
    <cfset ts = '#DateFormat(now(), "YYYY-MM-DD")#T'> 
    <cfset tt = '#TimeFormat(now(), "HH:mm:ss")#Z'> 
    <cfset encts = '#ts#' & urlencodedFormat('#tt#')> 
    <cfset p = arraynew(1)> 
    <cfset p[4] = 'Service=AWSECommerceService'> 
    <cfset p[8] = 'AWSAccessKeyId=#arguments.AWSAccessKeyId#'> 
    <cfset p[3] = 'Operation=ItemLookup'> 
    <cfset p[2] = 'ItemId=#arguments.ItemId#'> 
    <cfset p[5] = 'Timestamp=#encts#'> 
    <cfset p[6] = 'AssociateTag=#arguments.AssociateTag#'> 
    <cfset p[7] = 'Version=2011-08-01'> 
    <cfset p[1] = 'ResponseGroup=#arguments.ResponseGroup#'> 
    <cfset ArraySort(p,"text","asc")> 
    <cfset req_params = '#p[1]#&#p[2]#&#p[3]#&#p[4]#&#p[5]#&#p[6]#&#p[7]#&#p[8]#'> 
    <cfset lineBreak = Chr(10)> 
    <cfset tosign = 'GET#lineBreak#webservices.amazon.in#lineBreak#/onca/xml#lineBreak##req_params#'> 
    <cfset signed = URLEncodedFormat(ToBase64(HMAC_SHA256(tosign,"#arguments.secretkey#")))> 
    <cfset req = 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&Operation=ItemSearch&AWSAccessKeyId=arguments.AWSAccessKeyId&AssociateTag=arguments.AssociateTag&SearchIndex=Apparel&Keywords=Shirt&Timestamp=#ts##tt#&Signature=#signed#'> 
    <cfhttp url='#req#' method="get" result="res"/> 

    <cfreturn res.filecontent> 
    <cfreturn tosign> 

</cffunction> 

<cffunction name="HMAC_SHA256" returntype="binary" access="public" output="no" hint="Sign for AZ request"> 
    <cfargument name="signMessage" type="string" required="true" /> 
    <cfargument name="signKey" type="string" required="true" /> 
    <cfset local.jMsg = JavaCast("string",arguments.signMessage).getBytes("iso-8859-1") /> 
    <cfset local.jKey = JavaCast("string",arguments.signKey).getBytes("iso-8859-1") /> 
    <cfset local.key = createObject("java","javax.crypto.spec.SecretKeySpec") /> 
    <cfset local.mac = createObject("java","javax.crypto.Mac") /> 
    <cfset local.key = local.key.init(local.jKey,"HmacSHA256") /> 
    <cfset local.mac = local.mac.getInstance(local.key.getAlgorithm()) /> 
    <cfset local.mac.init(local.key) /> 
    <cfset local.mac.update(local.jMsg) /> 
    <cfreturn local.mac.doFinal() /> 
</cffunction> 

<cfdump var="#test#"> 

Der Fehler, den ich zurück ist ...

immer am
<?xml version="1.0"?> <ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/"><Error><Code>RequestExpired</Code><Message>Request has expired. Timestamp date is 2016-08-09T11:42:19Z.</Message></Error><RequestId>c5852914-b6a1-474a-9977-28a20dcb5029</RequestId></ItemSearchErrorResponse> 
+0

nichts mit der Frage zu tun, aber vergessen Sie nicht, zu 'var/local' Umfang * alle * die Funktion lokale Variablen (ts, tt, p, und so weiter). Wenn Sie CF10 + verwenden, ist [HMAC() jetzt eine Kernfunktion] (https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-h-im/hmac.html). – Leigh

+0

* 'var/local' Bereich alle lokalen Variablen der Funktion * ... um mögliche Wettlaufbedingungen zu vermeiden. – Leigh

Antwort

3

Die error message bedeutet wahrscheinlich genau das, was es sagt. Der Zeitstempel-Wert ist zu alt:

RequestExpired - Die Anfrage erreichte den Dienst mehr als 15 Minuten nach dem Datum Stempel auf Antrag oder mehr als 15 Minuten nach der Anforderung Ablaufdatum (wie vorher -signierte URLs) oder der Datumsstempel auf die Anfrage ist mehr als 15 Minuten in der Zukunft. Wenn Sie temporäre Sicherheitsanmeldeinformationen verwenden, kann dieser Fehler auch auftreten, wenn die Anmeldeinformationen abgelaufen sind.

Dies kann auf Zeitzonen zurückzuführen sein. Da Ihre Timestamp-Zeichenfolge Z, it will be considered UTC time verwendet. Wenn die tatsächliche Zeitzone Ihrer JVM etwas anderes ist, senden Sie möglicherweise ein Datum und eine Uhrzeit, die bereits verstrichen sind oder zu weit in der Zukunft liegen (jedenfalls in UTC). Versuchen Umwandlung now() zu UTC zuerst:

<cfset utcNow = dateConvert("local2utc", now())> 
<cfset ts = DateFormat(utcNow , "YYYY-MM-DD")&"T"> 
<cfset tt = TimeFormat(utcNow , "HH:mm:ss")&"Z"> 
0

Ich denke, die Verwendung von Now() als die Basis der Zeitstempel die Anforderung bedeutet, ist bereits abgelaufen, wenn sie es geschickt.

Versuchen und fügen Sie 30 Minuten zum Now() Wert:

<cfset ts = '#DateFormat(DateAdd("n", 30, Now()), "YYYY-MM-DD")#T'> 
<cfset tt = '#TimeFormat(DateAdd("n", 30, Now()), "HH:mm:ss")#Z'>