我正在尝试实现Amazon,即coldfusion中的V2 ( am 2016/windows),它利用了亚马逊文档和.jar文件提供的JAVA代码。(https://github.com/amzn/amazon-pay-api-sdk-java#readme)
我写了一个cfc,打算在会议中使用。我实例化WebstoreClient对象,设置Pay配置并生成按钮代码。单击页面上的按钮,打开一个窗口,登录沙箱,关闭窗口并转到URL中带有会话it的第二个签出页(保持简单),当单击按钮时,amazon创建签出会话,所有本地方法都是到amazon服务器的GET/POST/补丁操作--够简单了。不懂java,但通常能够遵循代码,看起来一切都在那里。
这里是我遇到麻烦的地方。我不能getCheckoutSession(会话is )我得到的错误是
未找到getCheckoutSession方法。要么没有具有指定方法名称和参数类型的方法,要么getCheckoutSession方法重载了ColdFusion无法可靠解密的参数类型。ColdFusion找到了与提供的参数匹配的0种方法。如果这是一个Java对象,并且您验证了该方法的存在,那么使用javacast函数来减少歧义。
我的第一个结账页面是这样的,很好。
<cfset session.amazonPayClient=createObject('component', 'cfc.amazon').init(dsn='xyz',env='dev')>
<cfoutput>#session.amazonPayClient.renderButton()#</cfoutput>第二个页面有以下内容,这就是我获得错误-方法未找到的地方。
<cfset session.amazonPayClient.getCheckoutSess(url.amazonCheckoutSessionId)>这就是我创建对象的方式--它发生在cfc的init()中。
<cffunction name="setClient" access="private" returntype="void" hint="this creates the client used to initialize the checkout" output="no">
<cfset region=createObject("java", "com.amazon.pay.api.types.Region")>
<cffile action="read" file="#variables.PEM_PATH#" variable="pem">
<cfset variables.oPayConfiguration = createObject("java", "com.amazon.pay.api.PayConfiguration")
.setPublicKeyId("#variables.amazonProperties.publicKeyID#")
.setPrivateKey("#pem#")
.setRegion(Region.NA)
.setEnvironment(variables.Environment.SANDBOX)
>
<cfset variables.oClient=createObject("java", "com.amazon.pay.api.WebstoreClient").init(variables.oPayConfiguration)>
</cffunction>这2与按钮签名一起工作--我认为它在其他地方使用(最终)
<cffunction name="genButtonSignature" access="private" returntype="string" hint="this generates the button signature used to create the checkoutsession" output="no">
<cfset signature = variables.oClient.generateButtonSignature(variables.amazonProperties.buttonPayload)>
<cfreturn trim(signature)>
</cffunction>
<cffunction name="getButtonSignature" access="private" returntype="string" output="no">
<cfreturn trim(variables.amazonProperties.buttonSignature)>
</cffunction>这个按钮显示得很好。
<cffunction name="renderButton" access="public" returntype="string" output="no">
<cfset var buttonCode="">
<cfsavecontent variable="buttonCode">
<div id="AmazonPayButton"></div>
<script src="<cfoutput>#variables.amazonProperties.payScript#</cfoutput>"></script>
<script type="text/javascript" charset="utf-8">
amazon.Pay.renderButton('#AmazonPayButton', {
// set checkout environment
merchantId: '<cfoutput>#variables.amazonProperties.merchantID#</cfoutput>',
publicKeyId: '<cfoutput>#variables.amazonProperties.publicKeyID#</cfoutput>',
ledgerCurrency: 'USD',
// customize the buyer experience
checkoutLanguage: 'en_US',
productType: 'PayAndShip',
placement: 'Cart',
buttonColor: 'Gold',
createCheckoutSessionConfig: {
<cfoutput>payloadJSON:'#variables.amazonProperties.buttonPayload#',
signature:'#getButtonSignature()#'</cfoutput>
}
});
</script>
</cfsavecontent>
<cfreturn buttonCode>
</cffunction>而这正是它失败的地方。当使用亚马逊ScratchPad时,它所需要的只是checkoutSessionId,所以我在这一点上完全迷失了方向。
<cffunction name="getCheckoutSess" access="public" returntype="any">
<cfargument name="sessionID" type="string" required="true">
<cfreturn variables.oClient.getCheckoutSession(checkoutSessionId=arguments.sessionID)>
</cffunction>该方法在WebStoreClient中存在
/**
* The GetCheckoutSession operation is used to get checkout session details that contain
* all session associated details.
*
* @param checkoutSessionId Checkout Session ID provided by Checkout v2 service
* @param header Map<String, String> containining key-value pair of required headers (e.g., keys such as x-amz-pay-idempotency-key, x-amz-pay-authtoken)
* @return The response from the GetCheckoutSession service API, as
* returned by Amazon Pay.
* @throws AmazonPayClientException When an error response is returned by Amazon Pay due to bad request or other issue
*/
public AmazonPayResponse getCheckoutSession(final String checkoutSessionId, final Map<String, String> header) throws AmazonPayClientException {
final URI checkoutSessionURI = Util.getServiceURI(payConfiguration, ServiceConstants.CHECKOUT_SESSIONS);
final URI getCheckoutSessionURI = checkoutSessionURI.resolve(checkoutSessionURI.getPath() + "/" + checkoutSessionId);
return callAPI(getCheckoutSessionURI, "GET", null, "", header);
}
/**
* The GetCheckoutSession operation is used to get checkout session details that contain
* all session associated details.
*
* @param checkoutSessionId Checkout Session ID provided by Checkout v2 service
* @return The response from the GetCheckoutSession service API, as
* returned by Amazon Pay.
* @throws AmazonPayClientException When an error response is returned by Amazon Pay due to bad request or other issue
*/
public AmazonPayResponse getCheckoutSession(final String checkoutSessionId) throws AmazonPayClientException {
return getCheckoutSession(checkoutSessionId, null);
}我真的希望在读完这些之后,有人能说,哦,这很简单,你不懂一些基本的东西。
发布于 2022-07-07 14:05:52
您使用的是什么版本的ColdFusion?你在使用javacast吗?如果函数/方法需要INT或其他特定的数据类型,则需要确保显式转换或java将抛出相同的错误,因为数据类型不匹配。(注意:有些数据类型可能是非标准的CFML类型。我已经开始转换查询返回的值,因为有时CFML-字符串不是java-字符串。
https://stackoverflow.com/questions/72892289
复制相似问题