【发布时间】:2014-03-23 22:39:05
【问题描述】:
我正在尝试从使用托管页面的传统 Payflow Link 转移到使用 ColdFusion 的安全令牌方法(仍然是 PayFlow Link),但已经碰壁了。我想我已经通过 Stack 上的所有东西,并且尝试了所有这些,仍然没有快乐 - 太棒了。
我创建了一个表单,只是简单的 HTML,它按预期工作
<cfscript>
variables.pfl_user="suppressed";
variables.pfl_vendor = "suppressed";
variables.pfl_partner = "PayPal";
variables.pfl_pwd = "suppressed";
variables.pfl_host_addr = "https://payflowlink.paypal.com";
//variables.pfl_gettoken_host_addr = "https://pilot-payflowpro.paypal.com";
variables.pfl_gettoken_host_addr = "https://payflowpro.paypal.com";
</cfscript>
<cfoutput>
<form method="post" action="#variables.pfl_gettoken_host_addr#">
<input type="text" name="USER" value="#variables.pfl_user#" />
<input type="text" name="VENDOR" value="#variables.pfl_vendor#" />
<input type="text" name="PARTNER" value="#variables.pfl_partner#" />
<input type="text" name="PWD" value="#variables.pfl_pwd#" />
<input type="text" name="CREATESECURETOKEN" value="Y" />
<input type="text" name="SECURETOKENID" value="#key#" />
<input type="text" name="TRXTYPE" value="S" />
<input type="text" name="AMT" value="24.95" />
<input type="text" name="CURRENCY" value="USD" />
<input type="submit" />
</form>
</cfoutput>
这很好用,给了我我正在寻找的东西。但是...下面的 cfhttp 代码只返回我的 securetokenId 和一个没有意义的错误代码..
结果代码 4 表示我的 AMT 格式不正确
RESULT=4&SECURETOKENID=08646BF7E5BC88E8A44015803CCF54&RESPMSG=金额无效
<cfhttp method="post" url="#pfl_gettoken_host_addr#" useragent="Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.7 (KHTML, like Gecko) Chrome/5.0.391.0 Safari/533.7" >
<cfhttpparam name="USER" type="formField" value="#variables.pfl_user#">
<cfhttpparam name="VENDOR" type="formField" value="#variables.pfl_vendor#">
<cfhttpparam name="PARTNER" type="formField" value="#variables.pfl_partner#">
<cfhttpparam name="PWD" type="formField" value="#variables.pfl_pwd#">
<cfhttpparam name="CREATESECURETOKEN" type="formField" value="Y">
<cfhttpparam name="SECURETOKENID" type="formField" value="#rStr.newTokenKey#">
<cfhttpparam name="TRXTYPE" type="formField" value="S">
<cfhttpparam name="AMT" type="formField" value="24.95">
<cfhttpparam name="CURRENCY" type="formfield" value="USD">
<cfhttpparam type="header" name="X-VPS-REQUEST-ID" value="#gettickcount()#" >
<cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate, sdch, x-gzip, compress, x-compress" >
<cfhttpparam type="header" name="X-VPS-CLIENT-TIMEOUT" value="10" >
<cfhttpparam type="header" name="Accept" value="application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5">
<cfhttpparam type="header" name="Accept-Language" value="en-US,en;q=0.8">
<cfhttpparam type="header" name="Accept-Charset" value="ISO-8859-1,utf-8;q=0.7,*;q=0.3">
<cfhttpparam type="header" name="content-type" value="text/name value">
</cfhttp>
有人有什么想法吗?所有 Header 的想法都来自 PayPal Docs 和我在 Stack 上找到的东西。
我必须做点什么,我有一些使用我的 PayPal 帐户来测试他/她被盗的信用卡的屏幕截图。所以我已经关闭了 PayPal,直到我做出改变。我必须通过帖子“保护”我的凭据来首先调用服务器端
先回答显而易见的问题:
- 是的,我正在生成一个新密钥
- 是的,我的帐户中的所有设置都正确(根据 PayPal)
- 是的,我对两个请求都使用了相同的变量(新生成的 SECURETOKENID 除外)
M
**解决方法很简单;尽管找到实际问题需要一些工作。对于所有 CFHTTPPARAM type=formfield 标签,选择 encoded="no"
**
【问题讨论】:
-
可能会尝试使用Fiddler 之类的工具或在jvm 通过
-Djavax.net.debug=all。只是看看有没有明显的区别。 -
原来问题在于 cfhttp 正在对金额进行 urlencoding。金额中的整数工作fin,加上一个小数,你得到结果= 4。我发现的方法是将 cfhttp 转到服务器上的另一个页面,在该页面上我执行了 GetHttpRequestData() 并将结果转储到文件中。现在要弄清楚如何绕过 CF 让它对我来说“简单”..
-
不好意思承认,但这似乎是 !RTFM 的情况。执行此操作的正确方法是将
encoded="no"添加到每个 cfhttpparam 表单字段调用中。 (假设您有 CF9 或更高版本)。我将编辑问题以包含此信息,以防其他人遇到此问题。 -
我会继续并将其作为单独的“答案”发布,因此遇到相同问题的任何人都会更容易看到解决方案。
标签: paypal coldfusion payflowpro payflowlink