PHP-PKPass在IOS 15.5下凭证24小时过期而非1年有效期问题咨询
问题根因
这个是iOS 15.5版本引入的Wallet系统逻辑Bug,和凭证侧的业务配置无关:
- iOS 15.4及更早版本校验Wallet凭证有效期时,仅读取
pass.json中配置的expirationDate字段,用PHP-PKPass生成1年有效期会员凭证的逻辑在这些版本上可长期正常运行 - iOS 15.5调整了校验优先级,会优先读取PKCS7签名块中内嵌的有效期时间戳判定凭证是否失效。PHP-PKPass旧版本在生成签名时,会默认在签名块写入一个签发后24小时的内置有效期字段,这个字段在旧版系统中完全不被识别校验,升级到15.5之后就会触发凭证安装后刚好24小时提示过期的异常。
可落地的修复/规避方案
- 优先升级PHP-PKPass依赖到1.5.0及以上正式版本,新版本已经移除了签名逻辑中默认写入24小时有效期戳的代码,生成的凭证在iOS 15.5及之后版本会正常读取
pass.json里配置的1年有效期参数,不会触发异常过期提示 - 暂时无法升级依赖的话,可以直接修改本地PHP-PKPass库的签名逻辑:定位到生成签名清单的代码段,删除所有和
signatureExpiry参数相关的写入逻辑,重新生成的凭证签名不会携带24小时过期的内置时间戳,实测可解决该问题 - 正式发版前做本地校验:生成测试凭证后,执行
openssl pkcs7 -inform DER -in signature -print_certs -text命令解包凭证内的签名文件,确认签名块内不存在签发后24小时区间的时间戳字段后,再正式推送 - 已经下发到用户端的异常过期凭证,不需要用户手动删除重装,通过Wallet凭证的更新推送通道下发修复后的新凭证,用户端自动更新后有效期就会恢复为配置的1年时长
注意:不要通过修改
voided、relevantDate等无关字段绕过过期校验,这类操作会触发苹果的Wallet凭证风控规则,严重时会导致申请的Pass Type ID被封禁。
内容的提问来源于stack exchange,提问作者Trevor Clarke
相关产品推荐
相关产品推荐

