アマゾンのフルフィルメントの確認
元記事はこちらです。
■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>