在通过第三方支付对接微信支付时,App
端需要接入通过 Universal Links
实现支付完成跳转回 App
的逻辑。
关于 Universal Links
的接入这里就不详细深入了,因为属于前端的工作,这里将将相关的对接文档贴出来:
服务端需要做的处理就是:
- 将
App
端准备的apple-app-site-association
文件放入文件服务器 - 可以通过
Url
直接访问这个文件,访问的地址是https:{domain}/apple-app-site-association
或https:{domain}/.well-known/apple-app-site-association
,其中地址必须是域名,不能是IP
,并且只能通过https
访问。*关于访问地址必须是域名这个问题,在苹果官方文档中并没有找到相关的说明,但是文档中通篇提到的访问地址都是domain
这个词,它的中文释义就是 域名。另外,在 Universal Link 填坑 这篇博客中提到了必须使用域名:*而我们
App
端页测试了使用Ip
来接入的情况,并没有生效。 - 文件可以直接在浏览器阅览而无需下载(返回的
ContentType = application/json
)
上面第3步操作卡了我很久,下面就详细说说。
存在的问题
在服务器上添加 apple-app-site-association
文件后,在浏览器中打开 https://xyz.example.com/apple-app-association-file
提示要下载,查看对应的 Response Content-Type
,如下:
在 Apple - Universal Links配置 中提到,apple-app-site-association
文件的 mime type
需要配置为 application/json
这样配置后,输入文件对应的访问 Url
就可以直接在浏览器预览而无需下载,以 bilibili
的 apple-app-site-association
文件为例,地址 bilibili apple-app-site-association 地址
针对这个问题,先去搜寻了相关的解决办法,找到的方案有如下几个:
- iOS 配置通用链接(Universal Link)服务端和开发者后台都配置好了,还是跳转不到App该方案是将文件上传到
OSS
服务器上,通过OSS
服务器提供的配置来处理 - nginx - 添加 apple-app-site-association 的 application/json该方案的文件服务是通过
Nginx
搭建的,因此可以在Nginx
中直接配置
但上面两种方案并不能用到我们的项目中,我们的文件服务是通过 SpringBoot
来搭建的。而搜寻了相关博客,并没有找到相关的解决办法。因此只能针对文件服务单独处理,首先想到的处理办法是,访问的是文件 Url
时,手动更改 Request
或 Response
对应的 ContentType
,但是尝试之后发现并没有生效,这里将处理办法贴出来,以供后面备忘,拦截 Request
和 Response
的方法并没有 代码如下:
拦截 Request
和 Response
手动修改 ContentType
- 未生效
修改 Request
的 ContentType
参考文档:SpringBoot之过滤器Filter详解及登录校验
原理就是通过 Filter
拦截对应的请求,然后将手动将 Request
的 ContentType
修改为 application/json
,代码如下:
新增 RequestFilterConfig.java
1 |
|
新增 CustomHttpServletRequestWrapper.java
:
1 | public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { |
在启动类中增加 @ServletComponentScan
,通过这个注解来开启 SpringBoot
项目对于 Servlet
组件的支持:
1 |
|
这个新增的 Filter
处理类成功拦截了 https://{domain}/.well-known/apple-app-site-association
请求,Request
的 ContentType
也被修改了,但是在浏览器中的表现仍然是弹出了下载页面,没有直接展示 apple-app-site-association
文件的内容。
修改 Response
的 ContentType
代码如下:
1 |
|
与上面一样,这个处理成功拦截到了对应的请求,并修改了 Response
的 ContentType
,但最终仍然没有达到预期的效果。
重定向文件
参考文档:Host apple-app-association-file in tomcat web server - StackOverFlow
解决方法是访问指定链接时,重定向到另一个文件,访问 xxx/.well-known/apple-app-association-file
时,实际上返回的是服务器中的 apple-app-association-file.json
文件,代码如下:
1 | // 苹果 apple-app-site-association 配置文件,如果请求的是 apple-app-site-association,则返回实际的文件 apple-app-site-association.json,以便在浏览器直接展示 |