2016-08-09 4 views
2

私はアイテム検索でアマゾンを呼び出し、アイテムのリストを返すようにしようとしています。したいことは、特定の売り手のアイテムを返すことです。タイムスタンプの基礎としてColdFusion Amazonアイテムの検索

<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#"> 

私は)私は(今の使用を考えて帰ってきた...

<?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

何が、関数の*すべて*ローカル変数(TS、TT、P、エトセトラ) 'VAR/local'の範囲には忘れないでください:最初のUTCへnow()を変換してみません。また、CF10 +を使用している場合、[HMAC()はコア機能になりました](https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-h-im/hmac.html)。 – Leigh

+0

* 'var/local'はすべての関数ローカル変数をスコープします* ...可能な競合状態を避けるためです。 – Leigh

答えて

3

error messageを、おそらくそれが言う正確に何を意味しています。 - 要求は15分以上の要求や、事前のためとして要求 有効期限後15分以上(上の日付 スタンプ後のサービスに達し

RequestExpired:タイムスタンプ値が古すぎます署名されたURL)、または にある日付スタンプは、今後15分以上かかることがあります。 一時的なセキュリティ資格情報を使用している場合は、 資格情報の有効期限が切れている場合にもこのエラーが発生することがあります。

これはタイムゾーンの可能性があります。あなたのタイムスタンプ文字列はZit will be considered UTC timeを使用しています。 JVMの実際のタイムゾーンが異なる場合は、すでに過ぎているか、あまりにも遠すぎる日付と時刻を提出している可能性があります(少なくともUTCではとにかく)。質問を行うには

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

を取得していますエラーは、それが送信されたときに、要求がすでに期限切れになっていることを意味します。

試してみて、今()の値に30分を追加します。

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