这几天在使用webview进行postUrl的时候出现参数丢失的问题。
最近公司的项目,进行对接第三方支付。具体流程是客户端请求后台接口,把后台返回的参数拼接到Url后与第三方支付进行交互,用webview展示第三方的页面,webview需要post来传递一些参数:
String HfSubmitUrl = ();
String HfPostData = "Version=" + () + "&CmdId="
+ () + "&MerCustId=" + ()
+ "&RetUrl=" + () + "&BgRetUrl="
+ () + "&UsrId=" + ()
+ "&UsrName=" + () + "&IdType="
+ () + "&IdNo=" + () + "&MerPriv="
+ () + "&PageType=" + ()
+ "&ChkValue=" + ();
(HfSubmitUrl,(HfPostDatas, "base64"));
但是不同的账号请求后台返回的参数里会不同,在于第三方支付交互的时候出现了问题,参数明明传的没有问题。从后台解析中发现是参数错误。
仔细查看过后,原来是在数据进行base64加密的时候出现了问题,参数中带有"+"号的全都不翼而飞了,变成了空格,第三方接收到的参数不对,页面也就会报错。
随后在网上查了资料,上面说"+"号在url中属于特殊符号可能在服务器端无法获得正确的参数值,包括还有“=”、空格、“%”、“&”、“#”。于是
try {
postData = ((), "utf-8");
}
catch (UnsupportedEncodingException e)
{
();
}
URLEncoder就对字符进行了比较好的处理了。
但是,有些情况是可以这么处理,如果处理一整串,那就会把其他的字符也换转换,参数又会错误。所以最终的办法就是用replaceAll把带有“+”号的地方全部替换成“%2B”String HfPostDatas = ("\\+", "%2B");
这样就能完美的解决这个问题了。
附加:
+ URL 中+号表示空格 %2B
空格 URL中的空格可以用+号或者编码 %20
/ 分隔目录和子目录 %2F
? 分隔实际的URL和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
& URL 中指定的参数间的分隔符 %26
= URL 中指定参数的值 %3D