2016-08-09 2 views
2

아마존을 아이템 검색으로 호출하고 아이템 목록을 반환하려고합니다. 그러면 내가하고 싶은 것은 특정 판매자의 아이템을 반환하는 것입니다.ColdFusion 아마존 아이템 검색

<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

아무것도하지만, VAR/local' 범위'로 잊지 마세요 * 모든 * 함수 지역 변수 (TS, TT, P, 등등)의. 또한 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 분이 넘지 않습니다. 임시 보안 자격 증명을 사용하는 경우 자격 증명이 만료 된 경우에도이 오류가 발생할 수 있습니다.

이것은 시간대 때문일 수 있습니다. 타임 스탬프 문자열은 Z, it will be considered UTC time을 사용합니다. JVM의 실제 시간대가 다른 경우 이미 통과했거나 앞으로 너무 먼 날짜와 시간을 제출할 수 있습니다 (적어도 UTC에서는 어쨌든). 첫째 UTC에 now() 변환 시도하지 : 질문과는

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