文章目录:
1.项目背景,整理问题
2.分析/分解问题,排查原因
3.描述问题,搜索关键词
4.解决问题
5.记录问题
1.项目背景,整理问题
目前正在做一款理财 APP,需要访问第三方银行的H5页面。本来使用 WKWebView
实现,但是传递参数时遇到一些问题。查了几个解决方法不是很友好,于是换成 UIWebView
实现。参数可以传递了,但是第三方一直提示 “验签错误Signature length not correct: got 252 but was expecting 256”
。
2.分析/分解问题,排查原因
H5 和安卓都是可以正常访问的,所以问题应该出在 iOS 端。为了验证猜测,后台同事帮忙写了一个空H5页面用来测试。交互流程:
步骤1:获取签名
iOS --请求
-- 后台 --请求
-- 第三方 --返回sign
-- 后台 --返回sign
-- iOS
步骤2:使用签名
iOS --获取sign
--转码sign
--发送sign
-- 第三方--加载页面出错opps!
--iOS
iOS --获取sign
--转码sign
--发送sign
-- 第三方 --成功加载页面bingo!
-- iOS
经过比对发现参数 sign 的字符串中,“
+”
变成了空格。
3.描述问题,搜索关键词
高效检索是程序员必备技能,高效前提需要准确的描述问题。搜索关键字:POST 加号变空格
,很快找到一篇对应这个问题的博客,于是有了下面的解决办法。
4.解决问题
传递参数前,我对参数进行了转码处理:
NSString *sign = [respDataDic[@"sign"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
正常情况下地址中的加号应该被转码成%2B,但是使用以上方法编码时并没有对加号进行处理。将上面方法替换如下:
NSString *sign = [respDataDic[@"sign"] stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet characterSetWithCharactersInString:@"#%<>[\\]^`{|}\"]+"].invertedSet];
另外,方法characterSetWithCharactersInString:
后面接的参数,用户可自定义,代表的意思是需要对这些特殊字符进行转码。把加号添加进去问题就解决了。除了自定义,IOS也提供了几个枚举值,代表的特殊字符以及调用方法如下:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
网友评论