PayPal Payflow Gateway UTF-8字符

问题描述:

我在收到PayPal Payflow Gateway接受我的HTTPS POST时出现问题,其中包含非US-ASCII字符。无论我用这些特殊字符发布什么,它似乎只想接受US-ASCII编码的字节。如果我发送UTF-8编码的字节,它仍然有效,但无法解析某些请求NVP值。我知道这是可能的,因为我已经将其他开发人员的测试页发布到我的帐户(http://ccaples.com/ NVP快速测试),并且该帖子似乎保留了特殊字符。PayPal Payflow Gateway UTF-8字符

下面是一个例子。我已经尝试了许多不同的Content-Type标头和Accept/Accept-Charset值,包括在文本/名称值之后的Content-Type中指定“; charset = UTF-8”或“; charset = utf-8”。

POST https://pilot-payflowpro.paypal.com/ HTTP/1.1 
Content-Type: text/namevalue 
User-Agent: KLMS Payflow API for Java 
X-VPS-Request-ID: 36A4ED051A8B492ABF70E6BE51CB13D5 
X-VPS-CLIENT-TIMEOUT: 20 
Connection: close 
X-VPS-VIT-INTEGRATION-PRODUCT: KLMS Payflow API for Java 
X-VPS-VIT-INTEGRATION-VERSION: 2.0.008 
X-VPS-VIT-PROXY: Y 
X-VPS-VIT-RUNTIME-VERSION: 20.45-b01 
X-VPS-VIT-OS-ARCHITECTURE: amd64 
X-VPS-VIT-OS-VERSION: 6.1 
X-VPS-VIT-OS-NAME: Windows 7 
Cache-Control: no-cache 
Pragma: no-cache 
Host: pilot-payflowpro.paypal.com 
Content-Length: 694 

USER[8]=XXXXXXXX&VENDOR[13]=XXXXXXXXXXXXX&PARTNER[6]=PayPal&PWD[8]=XXXXXXXX&VERBOSITY[4]=HIGH&BILLTOEMAIL[28][email protected]&TRXTYPE[1]=A&TENDER[1]=C&ACCT[16]=4111111111111111&EXPDATE[4]=1117&CVV2[3]=123&BILLTOFIRSTNAME[4]=Josè&BILLTOLASTNAME[7]=Elkjærd&BILLTOSTREET[14]=123 Elm Street&BILLTOCITY[9]=Elm Creek&BILLTOSTATE[2]=VA&BILLTOZIP[5]=22203&BILLTOCOUNTRY[2]=US&BILLTOPHONENUM[12]=763-221-5593&CUSTBROWSER[108]=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36&CUSTHOSTNAME[12]=192.168.1.10&CUSTIP[12]=192.168.1.10&AMT[6]=600.00&CURRENCY[3]=USD&COMMENT1[26]=Law Enforcement Curriculum&COMMENT2[16]=Standard Version 

HTTP/1.1 200 OK 
Connection: close 
Server: VPS-3.033.00 
X-VPS-Request-ID: 36A4ED051A8B492ABF70E6BE51CB13D5 
Date: Sun, 25 Jan 2015 17:45:05 GMT 
Content-type: text/namevalue 
Content-length: 199 

RESULT=104&PNREF=B70P7B6EBAE7&RESPMSG=Timeout waiting for Processor response&TRANSTIME=2015-01-25 09:44:47&BILLTOFIRSTNAME=Jos &BILLTOLASTNAME=NotProvided&AMT=600.00&ACCT=1111&EXPDATE=1117&CARDTYPE=0 

现在忽略104超时。 PayPal正在努力。你可以看到BILLTOFIRSTNAME是Jos(奇怪的字符不是è),而BILLTOLASTNAME中的字符必须导致服务器的NVP分析算法完全无法解析,因为它表示NotProvided。

这里是一个转换的NVP格式化的形式字节Java字符串代码:

 final byte[] requestBytes = requestString.getBytes(Charsets.UTF_8); 

任何想法的字符编码服务器端NVP分析器默认情况下寻找,或如何告诉它什么字符编码我正在发送POST的主体?

+0

[PayFlow网关文档:(https://developer.paypal.com/webapps/developer/docs/classic/payflow/integration-guide/#supported-languages)'的Payflow网关仅支持客户输入以及使用常规ASCII(英文)字符的API参数值。 Payflow目前不支持扩展ASCII字符或任何其他字符集,而不支持常规ASCII。 – EdSF 2015-01-27 01:48:32

我找到了解决方案。看起来它不支持Payflow Gateway Docs。文档似乎已过时并需要更新。我使用PayPal支持,看起来Payflow Gateway支持UTF-8。这里有个技巧:要么你不需要在你提交的名称/值对中指定长度参数(即BILLTOFIRSTNAME =Josè),或者你必须在长度参数中指定长度不是CHARACTERS的长度(即不是value.length( )),但是UTF-8编码的字节流的字节流的BYTES实际长度为value(即value.getBytes(“UTF-8”).length)。此事务处理完毕后,存储UTF-8字符并正确显示在PayPal管理器中,并且在Payflow Gateway响应的名称/值对中返回了适当的值。正如您所看到的,与上面的区别在于BILLTOFIRSTNAME和BILLTOLASTNAME长度标记现在更大,并且以字节为单位指定长度而不是字符长度。 Josè[4个字符但5个字节:4A 6F 73 C3 A8]和Elkjærd&Grün[14个字符但是16字节:45 6C 6B 6A C3 A6 72 64 20 26 20 47 72 C3 BC 6E]。

POST https://pilot-payflowpro.paypal.com/ HTTP/1.1 
Content-Type: text/namevalue 
Connection: close 
User-Agent: KLMS Payflow for Java/2.0.008 
X-VPS-Request-ID: B8DABD9BDFE246EC909B4CF741030133 
X-VPS-CLIENT-TIMEOUT: 20 
X-VPS-VIT-INTEGRATION-PRODUCT: KLMS Payflow for Java 
X-VPS-VIT-INTEGRATION-VERSION: 2.0.008 
X-VPS-VIT-PROXY: Y 
X-VPS-VIT-RUNTIME-VERSION: 20.45-b01 
X-VPS-VIT-OS-ARCHITECTURE: amd64 
X-VPS-VIT-OS-VERSION: 6.1 
X-VPS-VIT-OS-NAME: Windows 7 
Cache-Control: no-cache 
Pragma: no-cache 
Host: pilot-payflowpro.paypal.com 
Content-Length: 771 

USER[8]=XXXXXXXX&VENDOR[13]=XXXXXXXXXXXXX&PARTNER[6]=PayPal&PWD[8]=XXXXXXXX&VERBOSITY[4]=HIGH&BILLTOEMAIL[28][email protected]&TRXTYPE[1]=A&TENDER[1]=C&ACCT[16]=4111111111111111&EXPDATE[4]=0216&CVV2[3]=123&BILLTOFIRSTNAME[5]=Josè&BILLTOLASTNAME[16]=Elkjærd & Grün&BILLTOSTREET[14]=123 Elm Street&BILLTOSTREET2[10]=Elm & Vine&BILLTOCITY[9]=Elm Creek&BILLTOSTATE[2]=VA&BILLTOZIP[5]=12345&BILLTOCOUNTRY[2]=US&BILLTOPHONENUM[12]=763-221-5593&CUSTBROWSER[108]=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36&CUSTHOSTNAME[12]=192.168.1.10&CUSTIP[12]=192.168.1.10&AMT[6]=600.00&CURRENCY[3]=USD&COMMENT1[45]=Victim Advocate Curriculum (Standard Version)&COMMENT2[36]=Purchased for J.C. Hamlin (jchamlin) 

HTTP/1.1 200 OK 
Connection: close 
Server: VPS-3.033.00 
X-VPS-Request-ID: B8DABD9BDFE246EC909B4CF741030133 
Date: Wed, 28 Jan 2015 01:45:29 GMT 
Content-type: text/namevalue 
Content-length: 209 

RESULT=104&PNREF=B10P7D2F1643&RESPMSG=Timeout waiting for Processor response&TRANSTIME=2015-01-27 17:45:12&BILLTOFIRSTNAME=Josè&BILLTOLASTNAME[16]=Elkjærd & Grün&AMT=600.00&ACCT=1111&EXPDATE=0216&CARDTYPE=0 
+0

在Java中,'value.length'不能指示字符串中的字符数。它仅仅报告了16位代码单元的数量,这是一个非常无用和低级的细节。要对字符进行计数,您必须对整个代码点进行计数,而不是使用此编码或其编码下的各个组件。 – tchrist 2015-01-28 04:24:56

+0

String.length()工作,但不完全准确。误导的是String.length()是Payflow的Java SDK payflow.jar传递给服务器的东西。此外,Payflow Java SDK通过调用String.getBytes()和新的String(字节)来使用系统默认编码。在这两种情况下,payflow.jar都是错误的(即两种情况都是Payflow Java SDK实现中的实际错误,并且与Payflow Gateway服务器不兼容)。 – 2015-01-30 20:43:24