PayPal Payflow 网关 UTF-8 字符

J.C*_*lin 5 paypal utf-8 payment-gateway character-encoding payflowpro

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

这是一个例子。我尝试了许多不同的 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]=XXXXXXXX@kineticlearning.com&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
Run Code Online (Sandbox Code Playgroud)

暂时忽略 104 超时。贝宝正在为此努力。您可以看到 BILLTOFIRSTNAME 是 Jos(不是 è 的奇怪字符),并且 BILLTOLASTNAME 中的 æ 字符一定导致服务器的 NVP 解析算法完全无法解析,因为它说 NotProvided。

下面是将 NVP 格式的 Java 字符串转换为字节的代码:

        final byte[] requestBytes = requestString.getBytes(Charsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

知道服务器端 NVP 解析器默认寻找什么字符编码,或者如何告诉它我发送 POST 正文的字符编码是什么?

J.C*_*lin 4

我已经找到了解决方案。看来它不被支持Payflow Gateway 文档。这些文档似乎已经过时,需要更新。我与 PayPal 支持人员合作,发现 Payflow Gateway 确实支持 UTF-8。这里有一个技巧:要么您不需要在您提交的名称/值对中指定长度参数(即 BILLTOFIRSTNAME=Jos\xc3\xa8),要么您必须在长度参数中指定为不是 CHARACTERS 中的长度(即不是value.length()),而是该值的 UTF-8 编码字节流的实际长度(以 BYTES 为单位)(即 value.getBytes("UTF-8").length)。该交易成功,存储了 UTF-8 字符并在 PayPal 管理器中正确显示,并且在 Payflow Gateway 响应的名称/值对中返回了正确的值。正如您所看到的,与上面的区别在于 BILLTOFIRSTNAME 和 BILLTOLASTNAME 长度标记现在更大,并指定以字节为单位的长度而不是以字符为单位的长度。Jos\xc3\xa8 [4 个字符但 5 个字节:4A 6F 73 C3 A8] 和 Elkj\xc3\xa6rd & Gr\xc3\xbcn [14 个字符但 16 个字节:45 6C 6B 6A C3 A6 72 64 20 26 20 47 72 C3 BC 6E]。

\n\n
POST https://pilot-payflowpro.paypal.com/ HTTP/1.1\nContent-Type: text/namevalue\nConnection: close\nUser-Agent: KLMS Payflow for Java/2.0.008\nX-VPS-Request-ID: B8DABD9BDFE246EC909B4CF741030133\nX-VPS-CLIENT-TIMEOUT: 20\nX-VPS-VIT-INTEGRATION-PRODUCT: KLMS Payflow for Java\nX-VPS-VIT-INTEGRATION-VERSION: 2.0.008\nX-VPS-VIT-PROXY: Y\nX-VPS-VIT-RUNTIME-VERSION: 20.45-b01\nX-VPS-VIT-OS-ARCHITECTURE: amd64\nX-VPS-VIT-OS-VERSION: 6.1\nX-VPS-VIT-OS-NAME: Windows 7\nCache-Control: no-cache\nPragma: no-cache\nHost: pilot-payflowpro.paypal.com\nContent-Length: 771\n\nUSER[8]=XXXXXXXX&VENDOR[13]=XXXXXXXXXXXXX&PARTNER[6]=PayPal&PWD[8]=XXXXXXXX&VERBOSITY[4]=HIGH&BILLTOEMAIL[28]=XXXXXX@kineticlearning.com&TRXTYPE[1]=A&TENDER[1]=C&ACCT[16]=4111111111111111&EXPDATE[4]=0216&CVV2[3]=123&BILLTOFIRSTNAME[5]=Jos\xc3\xa8&BILLTOLASTNAME[16]=Elkj\xc3\xa6rd & Gr\xc3\xbcn&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)\n\nHTTP/1.1 200 OK\nConnection: close\nServer: VPS-3.033.00\nX-VPS-Request-ID: B8DABD9BDFE246EC909B4CF741030133\nDate: Wed, 28 Jan 2015 01:45:29 GMT\nContent-type: text/namevalue\nContent-length: 209\n\nRESULT=104&PNREF=B10P7D2F1643&RESPMSG=Timeout waiting for Processor response&TRANSTIME=2015-01-27 17:45:12&BILLTOFIRSTNAME=Jos\xc3\xa8&BILLTOLASTNAME[16]=Elkj\xc3\xa6rd & Gr\xc3\xbcn&AMT=600.00&ACCT=1111&EXPDATE=0216&CARDTYPE=0\n
Run Code Online (Sandbox Code Playgroud)\n