PayPal Payflow网关UTF-8字符

PayPal Payflow网关UTF-8字符,utf-8,paypal,character-encoding,payment-gateway,payflowpro,Utf 8,Paypal,Character Encoding,Payment Gateway,Payflowpro,我在让PayPal Payflow网关接受包含非US-ASCII字符的HTTPS帖子时遇到问题。不管我用这些特殊字符发布什么,它似乎只接受US-ASCII编码的字节。如果我发送UTF-8编码的字节,它仍然可以工作,但无法解析一些请求NVP值。我知道这是可能的,因为我已经将另一个开发人员的测试页面发布到我的帐户(NVP Quick test),并且该帖子似乎保留了特殊字符 这里有一个例子。我尝试了许多不同的内容类型标题和接受/接受字符集值,包括在文本/名称值之后的内容类型中指定“Charset=U

我在让PayPal Payflow网关接受包含非US-ASCII字符的HTTPS帖子时遇到问题。不管我用这些特殊字符发布什么,它似乎只接受US-ASCII编码的字节。如果我发送UTF-8编码的字节,它仍然可以工作,但无法解析一些请求NVP值。我知道这是可能的,因为我已经将另一个开发人员的测试页面发布到我的帐户(NVP Quick test),并且该帖子似乎保留了特殊字符

这里有一个例子。我尝试了许多不同的内容类型标题和接受/接受字符集值,包括在文本/名称值之后的内容类型中指定“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
暂时忽略104超时。贝宝正在努力。您可以看到,BILLTOFIRSTNAME是Jos(不为è的奇怪字符),BILLTOLASTNAME中的æ字符一定导致服务器的NVP解析算法完全无法解析,因为它说NotProvided

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

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

知道服务器端NVP解析器在默认情况下需要什么字符编码吗,或者知道如何告诉它我在发送帖子正文时使用了什么字符编码吗?

我找到了解决方案。似乎不受支持。这些文件似乎已经过时,需要更新。我与PayPal支持部门合作过,Payflow网关似乎支持UTF-8。诀窍在于:要么不需要在提交的名称/值对(即BILLTOFIRSTNAME=Josè)中指定长度参数,要么必须在长度参数中指定值(即value.getBytes(“UTF-8”)的UTF-8编码字节流的实际字节长度,而不是字符长度(即NOT value.length()).长度)。该事务正常工作,存储UTF-8字符并在PayPal Manager中正确显示,并且在Payflow网关响应的名称/值对中返回正确的值。如您所见,与上面的不同之处在于,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 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]=XXXXXX@kineticlearning.com&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

对于其他遇到这个问题的人,我遇到了与Devin相同的问题,在Payflow中查找交易时,è字符被è替换。我必须将编码转换为ISO-8859-1。我使用的是c#而不是java,所以这可能不一样,但它与在流编写器中指定编码一样简单

using (StreamWriter sw = new StreamWriter(requestStream, Encoding.GetEncoding("ISO-8859-1")))

此处可以找到关于为什么需要这样做的解释:

Payflow网关仅支持以常规ASCII(英语)字符表示的客户输入和API参数值。Payflow目前不支持扩展ASCII字符或除常规ASCII以外的任何其他字符集。在Java中,
value。length
不显示字符串中的字符数。它只报告16位代码单元的数量,这是一个非常无用的低级细节。要对字符进行计数,必须对整个代码点进行计数,而不是在这种或那种编码下对其各个组件进行计数。String.length()可以工作,但并不完全准确。误导的是,String.length()是Payflow的Java SDK Payflow.jar传递给服务器的内容。Payflow Java SDK还通过调用String.getBytes()和new String(bytes)使用系统默认编码。在这两种情况下,payflow.jar都是错误的(即,这两个东西都是payflow Java SDK实现中的真正错误,并且与payflow网关服务器不兼容)。在经过广泛测试后,这在我这方面似乎不起作用。我看到JosèElkjærd&Grün显示为“JosèElkjÃrd&GrÃn”