PHP动态网站实现在线支付必须接入微信支付、支付宝等合规第三方网关,完整走通统一下单→生成JSAPI参数→前端调起支付→接收异步通知四步;验签须用官方公钥、原始POST数据及绝对路径证书;SSL错误应配置CA证书而非禁用验证。

PHP 动态网站要实现在线支付,不能靠自己造轮子处理银行卡或微信/支付宝的加密签名、异步通知、订单状态同步这些事——必须接入合规的第三方支付网关,比如微信支付(wechatpay-v3)、支付宝(alipay-sdk-php)或聚合支付平台(如 Ping++、PayJS)。自己拼接 URL、手动验签、裸写回调接口,99% 会卡在 INVALID_SIGNATURE 或收不到 notify_url 回调。
用微信支付 JSAPI 实现公众号内下单
适用于用户在微信公众号里访问你的 PHP 网站并付款的场景。关键不是“调用接口”,而是完整走通「统一下单 → 生成 JSAPI 参数 → 前端调起支付 → 后端接收支付结果通知」这四步,缺一不可。
-
appid、mch_id、key(API 密钥)和apiclient_cert.pem/apiclient_key.pem必须从微信商户平台下载,且证书路径在 PHP 中要用绝对路径(/var/www/html/cert/apiclient_cert.pem),相对路径会失败 - 统一下单接口(
https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi)要求请求头带Authorization: WECHATPAY2-SHA256-RSA2048签名,不能用curl_setopt($ch, CURLOPT_POSTFIELDS, $data)直传数组,必须是 JSON 字符串 + 正确的Content-Type: application/json - 前端调起
WeixinJSBridge.invoke('getBrandWCPayRequest', ...)时,timeStamp必须是字符串类型(不是 int),且与后端生成签名时用的时间戳一致,否则报错invalid time stamp
支付宝支付回调验签总失败?检查这几个点
支付宝的 notify_url 回调不是“收到就更新订单”,第一步永远是验签。常见失败不是代码写错,而是环境或配置没对齐。
- 验签用的公钥必须是支付宝提供的
alipay_public_key.pem,不是你自己的应用私钥,也不是网关返回的alipay_public_key字段值 - 验签前必须用
file_get_contents('php://input')原始读取 POST 数据,不能用$_POST—— 因为支付宝发的是application/x-www-form-urlencoded但含特殊字符,$_POST会自动 urldecode 二次破坏原始签名串 - 支付宝回调可能重复发送(网络超时重试),你的
notify.php必须先查数据库判断该out_trade_no是否已处理,避免重复发货或扣款
用 cURL 调支付接口时 SSL 报错:cURL error 60
这是 PHP 请求微信/支付宝 HTTPS 接口最常卡住的地方,本质是 OpenSSL 不信任对方证书链,而不是“关掉 SSL 验证”就能解决。
立即学习“PHP免费学习笔记(深入)”;
- 不要设
CURLOPT_SSL_VERIFYPEER => false,这会让支付请求被中间人劫持,生产环境禁止 - 正确做法是下载最新 CA 证书包(如
https://curl.se/ca/cacert.pem),然后在php.ini中设置curl.cainfo = "/path/to/cacert.pem",或在代码中用curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem') - 如果服务器是 CentOS 7 且 PHP 是 yum 安装的,优先用系统自带证书:
curl_setopt($ch, CURLOPT_CAINFO, '/etc/pki/tls/certs/ca-bundle.crt')
真正难的不是写完支付逻辑,而是把「用户点击下单 → 支付成功页面跳转 → 后台异步通知到账 → 订单状态原子更新」这整条链路在各种异常下(网络中断、重复通知、签名过期、时钟不同步)都稳住。微信和支付宝的文档里藏了很多隐性约束,比如微信要求通知接口响应必须在 5 秒内返回 success 字符串,多一个空格都不行。











