先确认订单系统可用,再对接支付接口;支付宝网页用alipaytradepagepayrequest、h5用alipaytradewappayrequest;return_url仅展示结果,notify_url须公网https且无参数;签名必须rsa2;微信v3验签需原生body+指定请求头+时效校验;notify收不到回调常因ua被拦截或配置错误。

别从“学支付接口”开始,先确认你手上有能跑通的订单系统——没订单号、没金额校验、没状态机,直接对接支付宝或微信,90% 的问题都出在自己这层。
支付宝 SDK 用 AlipayTradePagePayRequest 还是 AlipayTradeWapPayRequest
PC 网页跳转收银台用 AlipayTradePagePayRequest,手机浏览器 H5 支付必须用 AlipayTradeWapPayRequest。两者参数几乎一样,但网关地址和用户端体验不同:前者走 pc.alipay.com,后者走 wap.alipay.com;若在手机上错用 Page 版,部分安卓机型会提示“无法打开”,iOS 则可能直接白屏。
-
return_url是同步跳转地址,仅用于展示结果页面,不能更新订单状态 -
notify_url必须是公网可访问的 HTTPS 地址,且不能带查询参数(如?type=alipay),否则支付宝服务器回调会失败 - 签名算法必须设为
RSA2,支付宝已下线 RSA1,硬编码sign_type=RSA会导致INVALID_SIGNATURE错误
微信支付 V3 回调验签为什么总失败
不是私钥错了,大概率是没按 V3 规则解析原始 body。微信 V3 回调发的是纯 JSON(不是 $_POST),且要求用 file_get_contents('php://input') 读取原始流,再结合 WECHATPAY-Serial、WECHATPAY-Timestamp、WECHATPAY-Nonce 三者拼接验签。用 $_POST 或 json_decode(file_get_contents('php://input'), true) 后再拼,签名值就对不上。
- 证书序列号(
serial_no)必须和请求头中的WECHATPAY-Serial完全一致,大小写敏感 - 验签前要先验证
WECHATPAY-Timestamp是否在 5 分钟有效期内,超时直接拒收 - 回调处理脚本开头必须加
header('Content-Type: text/plain; charset=utf-8');,否则微信服务器认为响应异常,会反复重推
为什么 notify_url 收不到支付宝回调
最常见原因是服务器防火墙或 Nginx 配置拦截了非标准 User-Agent。支付宝回调请求头带 User-Agent: AlipayServer,有些安全插件或 WAF 会默认屏蔽该 UA,导致请求根本到不了 PHP 脚本。
- 先用
curl -v -X POST https://yourdomain.com/notify.php --data "test=1"测试路由是否可达 - 在
notify.php开头加file_put_contents('/tmp/alipay.log', print_r($_SERVER, true) . "\n" . file_get_contents('php://input') . "\n", FILE_APPEND);,确认请求是否抵达 - 检查 Nginx 的
client_max_body_size,支付宝回调 body 较大(含签名字段),设太小会返回 413 - 确保 PHP 没开启
always_populate_raw_post_data(PHP 5.6+ 已废弃),否则php://input为空
真正卡住人的从来不是签名算法或证书路径,而是回调请求连服务器都没进到——先抓包看请求是否发出、是否被中间件截断、是否被日志系统过滤,比对着文档一行行改代码快得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











