アマゾンのフルフィルメントの確認

元記事はこちらです。

■Application.cfm

<cfprocessingdirective pageEncoding = "UTF-8">
<cfsetting enableCFoutputOnly="yes">

<cfapplication name="#hash( getCurrentTemplatePath() )#"
    sessionmanagement="yes"
    sessiontimeout=#CreateTimeSpan(1, 0, 0, 0)# >

<cfset request.proxyServer  = "">
<cfset request.proxyPort    = "80">


<cfset request.amDev        = "xxx">      <!-- amazon developer's token -->
<cfset request.amSecretKey  = "yyy">      <!-- amazon SecretKey -->

■index.cfm

<!--- デバック表示させない --->
<cfsetting showDebugOutput="no">

<cfset isFBA = false>
<cfparam name="url.asin" default="">
<cfif url.asin neq "">
    <cftry>
        <cfset isFBA = exec(url.asin)>
        <cfcatch>
<!---
            <cfdump var="#cfcatch#">
--->
        </cfcatch>
    </cftry>
</cfif>
<cfoutput>#isFBA#</cfoutput>
<!---===============================
exec
================================--->
<cffunction name="exec" access="public" returnType="boolean" output="no">
    <cfargument name="asin" type="string" required="yes">

    <cfset var local = structNew()>
    <cfset local.page = 1>

    <cfset local.xml = getData(arguments.asin, local.page)>
    <cfset local.TotalOfferPages = local.xml.ItemLookupResponse.Items.Item.Offers.TotalOfferPages.XmlText>

    <cfset local.isFBA = false>
    <cfloop index="local.page" from="1" to="#local.TotalOfferPages#">
        <!--- 2page以降 --->
        <cfif (local.page neq 1)>
            <cfset local.xml = getData(arguments.asin, local.page)>
        </cfif>

        <cfset local.ary = XmlSearch(local.xml, "ItemLookupResponse/Items/Item/Offers/Offer")>

        <cfloop index="local.idx" array="#local.ary#">
            <cfif (local.idx.OfferListing.IsEligibleForSuperSaverShipping.XmlText eq "1")>
                <cfreturn true>
            </cfif>
        </cfloop>
    </cfloop>

    <cfreturn false>
</cffunction>
<!---===============================
getData
================================--->
<cffunction name="getData" access="public" returnType="any" output="no">
    <cfargument name="asin" type="string" required="yes">
    <cfargument name="page" type="string" required="yes">

    <cfset var local = structNew()>

    <cfset local.url = "http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=#request.amDev#&Operation=ItemLookup&ItemId=#arguments.asin#&Condition=Used&MerchantId=All&ResponseGroup=Small,Offers&OfferPage=#arguments.page#">
    <cfset local.tmp = chgAmUrl(local.url, request.amSecretKey)>

    <cfhttp 
        timeout="60"
        url="#local.tmp#"
        proxyServer="#request.proxyServer#"
        proxyPort="#request.proxyPort#"
        method = "get">

        <!--- 名前空間部分を削除 --->
        <cfset local.xml = REReplace(cfhttp.fileContent, "\s*xmlns=""[^""]*""", "", "all")>

        <cfset local.xml= XmlParse(local.xml)>

    <cfreturn local.xml>
</cffunction>
<!---===============================
chgAmUrl
================================--->
<cffunction name="chgAmUrl" access="public" returnType="string" output="no">
    <cfargument name="url" type="string" required="yes">
    <cfargument name="key" type="string" required="yes">

    <cfset var local = structNew()>

    <cfset local.url = arguments.url>
    <cfset local.dateTimeString = GetHTTPTimeString(Now())>
    <cfset local.Timestamp = DateFormat(local.dateTimeString, "yyyy-mm-dd") & "T" & TimeFormat(local.dateTimeString, "HH:mm:ss") & "Z">

    <cfif not FindNoCase("Timestamp=",local.url)>
        <cfset local.url = local.url & "&Timestamp=#local.Timestamp#">
    </cfif>

    <cfset local.urlBefore  = ListGetAt(local.url, 1, "?")>
    <cfset local.urlAfter   = ListGetAt(local.url, 2, "?")>

    <!--- リクエスト内のコンマ (,) およびコロン (:) をURLエンコード --->
    <cfset local.urlAfter = Replace(local.urlAfter, ",", "%2C", "all")>
    <cfset local.urlAfter = Replace(local.urlAfter, ":", "%3A", "all")>

    <cfset local.ary        = ListToArray(local.urlAfter, "&")>
    <cfset local.arySort    = ArraySort(local.ary, "text")>
    <cfset local.list       = ArrayToList(local.ary, "&")>

    <cfset local.amHead = "GET,#ListGetAt(local.urlBefore,2,"/")#,/#ListGetAt(local.urlBefore,3,"/")#/#ListGetAt(local.urlBefore,4,"/")#">

    <cfset local.tmp = "">
    <cfloop index="local.idx" list="#local.amHead#">
        <cfset local.tmp = local.tmp & local.idx & chr(10)>
    </cfloop>
    <cfset local.tmp = local.tmp & local.list>

    <!--- 変換 --->
    <cfset local.sig = HMAC_SHA256(arguments.key, local.tmp)>
    <cfset local.sigg = BinaryEncode(local.sig, "base64")>

    <!--- 署名に含まれているプラス (+) とイコール (=) をURLエンコードする。--->
    <cfset local.sigg = Replace(local.sigg, "+", "%2B", "all")>
    <cfset local.sigg = Replace(local.sigg, "=", "%3D", "all")>

    <cfreturn local.urlBefore & "?" & local.list & "&Signature=#local.sigg#">
</cffunction>

<!---===============================
HMAC_SHA256
================================--->
<cffunction name="HMAC_SHA256" returntype="binary" access="private" output="false" hint="NSA SHA-256 Algorithm">
    <cfargument name="signKey" type="string" required="true" />
    <cfargument name="signMessage" type="string" required="true" />

    <cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("utf-8") />
    <cfset var jKey = JavaCast("string",arguments.signKey).getBytes("utf-8") />
    <cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec") />
    <cfset var mac = createObject("java","javax.crypto.Mac") />

    <cfset key = key.init(jKey,"HmacSHA256") />
    <cfset mac = mac.getInstance(key.getAlgorithm()) />
    <cfset mac.init(key) />
    <cfset mac.update(jMsg) />

    <cfreturn mac.doFinal() />
</cffunction>