PHP 支付宝扫码支付怎么接:从配置到回调一次讲清

编程狮(w3cschool.cn) 2026-09-07 16:00:54 浏览数 (27)
反馈

你接好 PHP 后台,前端要挂一个支付宝付款码,用户打开 App 扫一下就能付钱,可文档里的 app_id、应用私钥、支付宝公钥绕得人头晕。直接给你答案:PHP 支付宝扫码支付的核心其实就两步——用 app_id 加应用私钥调下单接口拿到付款二维码,再用支付宝公钥对异步通知做验签确认到账。今天这篇文章,编程狮从申请应用到回调验证一次讲清,帮你把这条支付链路真正跑通。

PHP 支付宝扫码支付怎么接:从配置到回调一次讲清封面图

一、先搞懂支付宝扫码支付的交互流程

动手写代码前,先把整条链路在脑子里过一遍,否则很容易对着文档不知道下一步该填什么。支付宝扫码支付本质是「商家先下单,平台返回二维码,用户扫码付款,平台再通知商家」四步。

第一步,你的 PHP 服务端调用支付宝的下单接口,告诉它「这笔订单多少钱、卖什么」;第二步,支付宝返回一个二维码内容(一串网址),你把它生成图片摆在页面上;第三步,用户用支付宝 App 扫码并确认付款;第四步,支付宝主动请求你事先填好的通知地址,带上付款结果。

这里最关键的认知是:钱不是你 PHP 程序收的,而是支付宝收,它再通过「异步通知」告诉你「这笔到账了」。所以你的代码只做两件事——发起下单、验证通知。想打牢 PHP 基础再上手,可以先过一遍 PHP 教程,把超全局变量、curl 请求和签名这些前置知识理顺。

二、申请应用并拿到 app_id 与密钥

要接支付宝,先得在支付宝开放平台创建一个应用。登录开放平台后进入「控制台—开发中心—网页/移动应用」,按提示创建应用并通过审核,应用通过后会拿到一串 app_id,它相当于你这个应用的身份证。

密钥是新手第一个坑。支付宝这套用的是非对称加密:你本地生成一对 RSA2 密钥,把「应用公钥」填到开放平台,平台回给你「支付宝公钥」,而你自己留着「应用私钥」绝对不能外泄。下单时用应用私钥签名,验通知时用支付宝公钥验签,两套钥各管一端,逻辑上不能混。

很多人卡在「平台给的公钥和我自己生成的搞反了」,记住一句话:自己生成的私钥只用来签名,平台给的公钥只用来验签。把这三样东西(app_id、应用私钥、支付宝公钥)稳妥存到配置文件里,别写死在每处代码。

三、构造支付二维码:下单接口怎么调

配置齐了,就开始写下单。支付宝扫码支付用的接口是 alipay.trade.precreate,你用应用私钥对请求参数签名后,POST 到支付宝网关,平台就会返回 qr_code,那就是用户要扫的付款码内容。

<?php
// 支付宝扫码支付:构造下单请求(编程狮 www.w3cschool.cn 示例,密钥请换成你自己的)
$params = [
    'app_id'      => '你的app_id',
    'method'      => 'alipay.trade.precreate',
    'charset'     => 'utf-8',
    'sign_type'   => 'RSA2',
    'timestamp'   => date('Y-m-d H:i:s'),
    'notify_url'  => 'https://www.w3cschool.cn/notify',
    'biz_content' => json_encode([
        'out_trade_no' => 'ORDER_' . time(),
        'total_amount' => '0.01',
        'subject'      => '测试商品',
    ]),
];
// 用应用私钥对 $params 签名得到 sign,再 POST 到网关,返回 qr_code 即付款码
echo "待签名参数已就绪,下一步用应用私钥生成 sign 并请求网关";

这段先把必备参数组装好,其中 out_trade_no 是你自己的订单号,必须唯一;notify_url 是等会儿接收通知的地址。想看完整可跑的封装写法,这篇 PHP 支付宝扫码支付 把签名和请求都整理成了现成函数,照着套能省不少事。

四、异步通知验签:新手最容易卡的地方

下单拿到二维码只是上半场,真正决定你能不能放心发货的是异步通知验签。用户付完款,支付宝会 POST 一大串参数到你的 notify_url,里面带着 sign 签名。你必须用「支付宝公钥」校验这个签名,确认确实是支付宝发的、没被篡改,才能把订单标记为已支付。

<?php
// 支付宝异步通知验签:用支付宝公钥校验签名,防止伪造回调
function verify_notify($post, $alipayPublicKey) {
    $sign = $post['sign'];
    unset($post['sign'], $post['sign_type']);
    ksort($post);
    $wait = urldecode(http_build_query($post));
    return openssl_verify($wait, base64_decode($sign), $alipayPublicKey, OPENSSL_ALGO_SHA256) === 1;
}
// 验签通过后再处理订单状态,切勿先发货后验签

这段先把 sign 摘出来,把其余参数按字典序排序拼成待签串,再用支付宝公钥验。验签过了,还要再查一次订单状态或比对金额,确认无误才发货。常用函数记不住时,翻 PHP 速查手册 能随时查数组、排序和加密相关用法。

五、和微信支付的区别,别混着配置

不少同学同时接微信支付和支付宝,结果把两套密钥抄串了。这里把区别一次性说清:支付宝用 app_id 标识应用,配合应用私钥签名、支付宝公钥验签;微信支付用 appid 加商户号(mch_id),配合 API 密钥做 MD5 或 HMAC 签名。两者体系完全不同,配置文件务必分开,别把支付宝私钥填进微信的坑里。

另一个常见混淆是「公钥是谁的」。支付宝公钥是平台给你的、用来验通知;应用公钥是你上传给平台的、用来让它验你发的请求。微信那边没有这套不对称结构,更多是商户自己保管一个 key。理清这套关系,支付宝扫码支付和微信支付就能各自安稳跑通,互不干扰。

支付宝扫码支付常见卡点对应的处理方式

总结

回到开头:PHP 支付宝扫码支付怎么接?记住两件事就通了——下单阶段用 app_id 加应用私钥调 precreate 拿到二维码,回调阶段用支付宝公钥对异步通知验签确认到账。配置上最关键的坑是三样东西(app_id、应用私钥、支付宝公钥)别填反、别泄露;和微信支付并接时更要分清楚 app_id 与 appid、应用私钥与商户密钥。下一步建议你先在沙箱环境用小额定额跑通整条链路,再上生产。

延伸学习

想把这块知识系统补齐,可以按这个顺序来:

  1. 先跟着 PHP 零基础入门课程 把 PHP 语法和 curl、签名这些前置能力打牢;
  2. 想看蚂蚁金服侧更完整的接入思路,这篇 支付宝开发详解文档 从申请到联调都讲到了,和本文互补;
  3. 联调时拿不准二维码对不对,用 在线二维码解码工具 扫一下内容做核对,免登录就能用。

常见问题

Q:app_id 和应用私钥必须一一对应吗?

必须对应。app_id 来自你在开放平台创建的应用,应用私钥是同一应用下你本地生成的密钥对中的私钥,填错任何一个都会签名失败或验签不过。

Q:异步通知一直收不到怎么办?

先确认 notify_url 是公网可访问的地址,且返回的是纯文本「success」而非跳转页。本地 localhost 收不到通知,需用内网穿透或部署到测试服务器再联调。

Q:验签总是失败,最可能的原因是什么?

最常见是用了错误的公钥——应该用「支付宝公钥」而不是你自己的应用公钥;其次是参数没按字典序拼接,或把 sign、sign_type 也算进了待签串。逐项核对基本能解决。

0 人点赞