PayPal WebHook 事件异步通知
另一个文章 https://www.bahjeez.com/validating-paypal-webhooks-offline-almost/ ,阐述了如何实现
PayPal WebHook
即 paypal 异步通知功能,订阅了相应的事件后,当发生了订阅的事件,paypal 会 post 一个 json 格式的数据到所配置的地址上。
配置 WebHook 地址和订阅事件
https://developer.paypal.com/developer/applications
选择查看应用详情后拉到最下面的 Webhook 配置,输入通知地址和订阅事件,点击保存后,会生成一个 Webhook ID(在验证 Webhook 信息的时候用到)。
checkout order 相关的事件:https://developer.paypal.com/docs/checkout/apm/reference/subscribe-to-webhooks/
所有事件:https://developer.paypal.com/api/rest/webhooks/event-names/
需要响应 200 状态码表示处理成功,否则会在 3 天内最多发送 10 次。
Webhook 事件
- CHECKOUT.ORDER.APPROVED:客户授权支付,此时可收款。
- PAYMENT.CAPTURE.COMPLETED:收款完成,即交易完成。
- PAYMENT.CAPTURE.PENDING:交易需要审核。
- PAYMENT.CAPTURE.DENIED:拒绝了收款。
- PAYMENT.CAPTURE.REFUNDED:退款。
- CUSTOMER.DISPUTE.CREATED:客户发起争议,此时也会收到 RISK.DISPUTE.CREATED 消息,内容一致。
- CUSTOMER.DISPUTE.RESOLVED:争议解决。
接收并验证 Webhook 消息
为了保证 webhook 消息的真实性,需要对消息进行验证,避免处理假消息。参考文档地址:https://developer.paypal.com/api/rest/webhooks/
需要用到的 header:
- PAYPAL-TRANSMISSION-ID: Http 传输的唯一 ID
- PAYPAL-TRANSMISSION-TIME:时间
- PAYPAL-CERT-URL:Public key 地址
- PAYPAL-TRANSMISSION-SIG:签名
- PAYPAL-AUTH-ALGO:签名算法
方式一:调接口获取 webhook 详情
文档地址:https://developer.paypal.com/docs/api/webhooks/v1/#webhooks-events_get
GET https://api.paypal.com/v1/notifications/webhooks-events/{EVENT_ID}
验证方式二:调用验签 API
调用 paypal 的验签 API,文档地址:https://developer.paypal.com/docs/api/webhooks/v1/#verify-webhook-signature_post
POST https://api.paypal.com/v1/notifications/verify-webhook-signature
payload
response
验证方式三:自己手动验证
验证签名,输入的字符串为:
其他说明
- IPN 收款信息中含有:Payment Type, PayPal Payer Address Status, PayPal Payer Status 等字段,但是 webhook 信息中没有这些字段。