步骤1:创建 Payment Intent
根据拿到支付方式的时机不同,有两种做法:- 直接支付
- 延迟确认
步骤2:处理响应
根据响应中的intent_status 字段决定下一步动作:
成功响应示例
步骤3:处理客户动作
当intent_status 为 REQUIRES_CUSTOMER_ACTION 时,next_action 字段会告诉你客户需要做什么。
3DS 重定向
如果卡需要 3D Secure 身份验证,next_action 会携带一个重定向 URL:
return_url。详细的 3DS 集成说明见:
展示二维码
对于电子钱包支付(AlipayCN、WeChatPay 等),next_action 可能会携带一个二维码:
步骤4:获取支付结果
使用下列一种或两种方式来确认最终支付状态:Webhooks(推荐)
配置你的服务端接收来自 UQPAY 的异步通知。这是最可靠的方式。 关键 webhook 事件:acquiring.payment_intent.succeeded—— 支付已完成acquiring.payment_attempt.failed—— payment attempt 失败。注意:acquiring.payment_intent.failed只在 PI 超时自动关闭(30 分钟过期)时触发,单次尝试失败不会触发它。acquiring.payment_attempt.capture_requested—— 请款已提交。收到这个事件也意味着支付已成功。
Retrieve 接口(轮询)
直接查询支付状态:电子钱包支付
同一套 API 也支持电子钱包支付方式。把payment_method 对象替换成对应的钱包类型即可:
AlipayCN 二维码示例
AlipayCN 二维码示例
next_action.display_qr_code 供客户扫码。AlipayCN 付款码示例(线下)
AlipayCN 付款码示例(线下)
预授权与手动请款
使用预授权前,确认账户和支付渠道支持此能力。请通过直接API使用card或card_present;Hosted Payment Page和Payment Links不支持预授权。
- 在创建或确认PaymentIntent时,将
authorization_type设为pre_authorization,并将payment_method.card.auto_capture或payment_method.card_present.auto_capture设为false。若支付方式内也提供授权类型,两处值必须一致。确认时不能将预授权PaymentIntent改为普通授权。 - 授权后检查
intent_status、authorization_expires_at和available_to_capture。在PaymentIntent为REQUIRES_CAPTURE且尚未到期时请款,不要假定固定授权期限。 - 每笔授权只请款一次。省略
final_capture或设为true;false会被拒绝。省略amount_to_capture时请款全部可用金额,也可提供不超过该额度的正数金额。部分金额的最终请款要求渠道支持。零金额、空字符串和null均会被拒绝。剩余授权额度由系统释放,不要用第二次请款或零金额请款释放余额。 - 保存返回的
capture_id和merchant_capture_order_id,通过查询PaymentIntent检查capture_records。请款受理以及PaymentIntent的聚合金额不代表渠道已完成处理。每条记录的channel_capture_status为:0待处理、1处理中、2完成、3失败。
请款单号与重试
使用账户内唯一、最多64个字符的merchant_capture_order_id。省略时使用PaymentIntent的merchant_order_id。传输失败后重试相同请求时,复用同一X-Idempotency-Key。在缓存响应之外再次提交已记录的请款单号会被拒绝,不会作为另一笔请款执行。进一步操作前,先查询已有PaymentIntent确认结果。请款失败也不能针对同一授权再次请款。
撤销与退款
尚未发生请款且授权未过期时,若渠道支持,可撤销预授权。请款后通过退款流程退回已请款资金。available_to_void大于零不代表一定允许撤销。
PaymentIntent的captured_amount表示聚合请款金额;PaymentAttempt没有请款金额字段。单笔请款使用capture_records[].capture_amount及其处理状态。
