FIDO 认证#
在以下两种场景中,EVO Cloud 支持 FIDO 认证:什么是 FIDO 认证#
FIDO 认证由 FIDO 联盟制定。FIDO 联盟基于公钥密码学制定全球认证标准。
令牌认证(Token Authentication)是一套符合 FIDO 标准的方案,支持用通行密钥(passkey)完成用户认证。
支持场景概览#
| 商户场景 | 支持方式 | 是否支持 FIDO 通行密钥 |
|---|
| 原生 App(iOS) | ASWebAuthenticationSession(推荐) SafariViewController(有限支持) | ✅ |
| 原生 App(Android) | Chrome Custom Tab | ✅ |
| 网站(PC 浏览器) | Chrome、Safari、Edge、Firefox | ✅ |
| 网站(移动浏览器) | 主流移动浏览器 | ✅ |
| App 内嵌 WebView | iOS WKWebView、Android WebView | ❌ 不支持 |
FIDO 方案#
符合 FIDO 认证条件的交易,会根据用户设备上是否已存有对应的通行密钥,走注册流程或身份识别流程。FIDO 认证注册流程#
用户首次将令牌与设备绑定并使用 FIDO 认证时,需要先完成身份验证(例如 3DS 认证)。认证成功后,页面会提示持卡人把通行密钥保存到设备上,供后续认证使用。FIDO 认证注册流程适用于两种情况:通过 paymentMethod 请求创建令牌;通过 payment 请求在支付时创建令牌。
FIDO 认证身份识别流程#
用户使用已绑定通行密钥的令牌发起交易时,FIDO 会直接通过生物识别技术验证用户身份。FIDO 认证接入#
步骤 1:采集附加参数#
除了支付 / 令牌化中采集的基础参数,还需要向用户采集额外信息以完成 FIDO 认证。详见 章节的步骤 2。步骤 2:发起支付或令牌化#
采集到附加参数后,从服务端向 EVO Cloud 发起 HTTP POST 请求。/g2/v1/payment/mer/{sid}/payment/g2/v1/payment/mer/{sid}/paymentMethodFIDO 认证需要在请求中额外携带以下参数(M = 必填,O = 可选,C = 条件必填):| Body 参数 | 是否必填 | 说明 |
|---|
| authentication | M | 支付或令牌化前用于用户认证的信息。 |
| transInitiator | C | 支付时必填。 支付或令牌化前用于用户认证的信息。 |
| userInfo | C | 支付时必填。 支付或令牌化前用于用户认证的信息。 |
| returnURL | M | 用户完成认证后,重定向回商户的 URL。 |
| allowAuthentication | O | 门店配置为可选认证时适用。用于 POST /g2/v1/payment/mer/{sid}/payment 或 POST /g2/v1/payment/mer/{sid}/paymentMethod 请求,表示该笔支付是否需要认证。 |
1.
authentication.type:该笔支付使用的认证模式,可选。需要设为 FIDOPage、threeDSPageOrFIDOPage 或 threeDSIntegratorOrFIDOPage,告知 EVO Cloud 使用 FIDO 认证的重定向方案。| authentication.type | 说明 |
|---|
| FIDOPage | 该交易使用 EVO Cloud 认证页面,进行 Mastercard SCOF(Secure Card on File,安全卡信息存储)TAS(Token Authentication Services,令牌认证服务)认证。 |
| threeDSPageOrFIDOPage | 该交易使用 EVO Cloud 认证页面进行 3DS 认证,或使用 EVO Cloud 认证页面进行 Mastercard SCOF TAS 认证。具体采用哪种由 EVO Cloud 自动判断。 |
| threeDSIntegratorOrFIDOPage | 该交易通过与 EVO Cloud 的全 API 对接进行 3DS 认证,或使用 EVO Cloud 认证页面进行 Mastercard SCOF TAS 认证。具体采用哪种由 EVO Cloud 自动判断。 |
1.
transInitiator.userCreateIP:用于标识设备的唯一字符串,支持 IPv4 或 IPv6。
2.
transInitiator.latitude 和 transInitiator.longitude:可选,填写用户发起支付时所用设备的纬度和经度。FIDO 认证时必填,除非用户拒绝共享位置。
1.
userInfo.mobilePhone:用户手机号。未提供邮箱(userInfo.email)时必填。
2.
userInfo.email:用户邮箱地址。未提供手机号(userInfo.mobilePhone)时必填。
以下示例为一笔需要 FIDO 认证、使用网关令牌支付的 10 USD 交易:如果应答中没有 action 对象,使用 result.code 和 payment.status / paymentMethod.token.status 向用户展示支付 / 令牌化结果。如果有 action 对象,说明还需要额外步骤才能完成支付 / 令牌化:把 action 对象发给 Web 前端或客户端 App,然后进入下一步。以下为需要重定向的支付应答示例:步骤 3:处理 redirectUser#
在 FIDOPage 重定向方案下,应答中收到的 action.type 通常是 redirectUser。这表示你需要使用同一应答中的 action.redirectData,把用户重定向到 EVO Cloud 托管页面完成 FIDO 认证。A. 将用户重定向到 EVO Cloud 托管页面#
按 action.redirectUser.method 指定的 HTTP 方法,把用户重定向到 action.redirectUser.url。以下为 action.redirectUser.method 为 GET 时,在前端执行 redirectUser 操作的示例:原生 App 接入时,标准 WebView 不支持 FIDO 认证。建议在 App 内用以下方式打开认证页面。iOS App 接入#
✅ 推荐方案:ASWebAuthenticationSessionAndroid App 接入#
用户随后会进入 EVO Cloud 托管页面,由 EVO Cloud 与用户及卡组织完成后续的 FIDO 认证流程。B. 用户完成认证后重定向回商户#
EVO Cloud 会把用户重定向回你的 returnURL,你可以用应答中的 merchantTransID 参数匹配首次请求。如果应答中的 status 参数为 finished,可视为 FIDO 认证成功。此时需要调用 GET 接口或接收 EVO Cloud 的通知来获取交易详情。
如果 10 分钟内没有收到任何应答,或 status 参数不是 finished,可视为 FIDO 认证失败。此时同样需要调用 GET 接口或接收 EVO Cloud 的通知来获取交易详情。
步骤 4:展示结果#
用户完成支付或令牌化,且前端或客户端 App 无需进一步操作后,使用 result.code 和 payment.status / paymentMethod.status 告知用户支付或令牌化的状态。| 结果码 | 说明 |
|---|
S0000 | 成功 |
V0007 | Missing field {} when {...}(在 {...} 条件下缺少字段 {}) |
B0025 | 认证未完成 |
B0026 | 不支持该 3DS 版本 |
其他可能的 result.code 值及建议向用户展示的提示信息,见 EVO Cloud API 规范附录。如果 result.code 为 S0000,还需要检查 payment.status / paymentMethod.status,确定支付或令牌化的状态并告知用户。| 状态(payment) | 说明 |
|---|
| Authorised | 用于卡交易,表示交易授权已成功,等待完成(商户可发起撤销)。 |
| Captured | 卡交易表示授权和完成均已成功。 |
| Failed | 支付失败。 |
| 状态(paymentMethod) | 说明 |
|---|
| Success | 令牌已创建。 |
| Failed | 令牌创建失败。 |
其他可能的 payment.status / paymentMethod.status 值及说明,见 EVO Cloud API 规范中的 payment.status / paymentMethod.status 部分。异常处理#
向 EVO Cloud 发起的 HTTP POST 请求:建议请求发出后至少等待 45 秒。如果在这段时间内没有收到应答,需要主动向 EVO Cloud 查询结果,查询方式见“支付 / 令牌化”章节的步骤 6。向 EVO Cloud 发起的 HTTP PUT 请求:HTTP PUT 请求是幂等的。如果在一定时间内(例如 45 秒)没有收到 EVO Cloud 的应答,可以用完全相同的请求报文重新发送。多次重发仍未收到应答时,可以改为发起一笔新的支付 / 令牌化请求。