核心流程概述
- 创建订单:用户在你的网站上选择商品,点击“去结算”或“提交订单”,网站生成一个唯一的订单号,并将订单信息(金额、商品、用户等)存入数据库的
dede_addonshop或自定义的订单表。 - 跳转支付:用户点击“立即支付”,网站后台根据你配置的支付方式(如支付宝),调用相应的接口,生成一个支付请求(通常是包含参数的URL或表单)。
- 用户支付:用户被重定向到支付宝或微信支付的官方页面,完成扫码或输入密码付款。
- 支付回调:用户支付成功后,支付宝/微信支付服务器会主动向你的网站服务器发送一个“异步通知”(Webhook),这是最关键的一步,用于保证支付结果的可靠性。
- 处理通知:你的网站接收到通知后,会验证通知的真实性,然后更新数据库中对应订单的状态(从“待支付”改为“已支付”)。
- 显示结果:网站根据订单状态的更新,给用户显示“支付成功”的页面,并触发后续流程(如发货、发送邮件通知等)。
准备工作
在开始之前,你需要准备好以下东西:

- 一个可以正常访问的 DedeCMS 网站:建议在本地测试成功后,再部署到服务器。
- 注册第三方支付平台账号:
- 支付宝:https://www.alipay.com/ 注册并完成实名认证。
- 微信支付:https://pay.weixin.qq.com/ 注册并完成认证(需要企业资质)。
- 申请应用并获取配置信息:
- 支付宝:登录支付宝商家中心,创建一个“网页应用”或“移动应用”,获取 APPID,在“接口加密方式”中申请 应用私钥 和下载 支付宝公钥。
- 微信支付:登录微信支付商户平台,在“产品中心”申请一个“Native支付”产品,获取 商户号,在“账户中心” > “API安全”中设置 API密钥。
- 一个拥有公网 IP 的服务器:支付平台的回调通知需要能访问到你的服务器,本地测试可以使用内网穿透工具(如 ngrok)。
实现方式
主要有两种实现方式:
-
使用成熟的 DedeCMS 支付插件(推荐)
- 优点:简单、快速、稳定,通常已经处理好了各种细节(如签名验证、异常处理)。
- 缺点:功能可能比较固定,有潜在的安全风险(如果插件来源不明)。
-
使用官方 SDK 进行二次开发
- 优点:灵活可控,安全性高,可以完全按照自己的业务逻辑定制。
- 缺点:开发周期长,需要具备一定的 PHP 编程能力。
下面我将分别详细介绍这两种方式。

使用 DedeCMS 支付插件(以支付宝为例)
这是最简单快捷的方法。
-
寻找插件:
- 访问 DedeCMS 的官方论坛、插件市场或一些知名的 DedeCMS 资源网站。
- 搜索关键词如 “DedeCMS 支付宝插件”、“DedeCMS 微信支付插件”。
- 选择一个下载量高、评价好的插件。注意:务必从可信来源下载,以防后门。
-
安装插件:
- 解压下载的插件包。
- 按照插件的说明文档,通常需要将文件上传到 DedeCMS 的
plus/目录或指定目录。 - 登录 DedeCMS 后台,在“模块” -> “模块管理”中找到插件,点击“安装”。
-
配置插件:
- 在后台找到已安装的支付模块,进入配置页面。
- 将你准备好的支付宝 APPID、应用私钥、支付宝公钥 等信息填写到对应的配置项中。
- 设置 异步通知地址:这个地址非常重要,必须是你的网站上一个可以公开访问的 PHP 文件。
http://www.yourdomain.com/plus/alipay/notify_url.php,插件通常会自动生成这个文件。 - 设置 同步跳转地址:支付成功后用户会跳转到的页面,
http://www.yourdomain.com/plus/alipay/return_url.php。
-
在前台调用:
- 打开你的订单确认页面(通常是
archives_shop.php或你自定义的模板文件)。 - 找到“立即支付”的按钮或链接。
- 修改其
href属性,指向支付插件的处理页面,并带上订单 ID 参数。<a href="/plus/alipay/pay.php?order_sn=<?php echo $ordersn; ?>">立即支付</a>
- 当用户点击这个链接时,就会触发插件流程,跳转到支付宝支付页面。
- 打开你的订单确认页面(通常是
使用官方 SDK 进行二次开发(以支付宝为例)
这种方式更灵活,适合有一定开发能力的用户。
-
下载官方 SDK:
- 访问支付宝开放平台:https://opendocs.alipay.com/
- 在“开发中心” -> “SDK下载”中,找到“PHP”版本的 SDK 并下载。
-
集成 SDK 到你的项目:
- 将下载的 SDK 压缩包解压,把其中的
AopSdk.php和lib目录上传到你的 DedeCMS 网站根目录下的一个安全位置,/alipay_sdk/。
- 将下载的 SDK 压缩包解压,把其中的
-
创建支付请求页面 (
pay.php):- 在你的网站根目录下创建一个新文件,
/alipay/pay.php。 - 编写 PHP 代码,调用 SDK 生成支付链接或表单。
<?php // 引入 SDK require_once '../alipay_sdk/AopSdk.php'; // 1. 获取订单信息 // 假设订单号是通过 URL 参数传递的,你需要从数据库中查询这个订单的详细信息 $order_sn = $_GET['order_sn']; // '20251027123456' // 这里你需要连接你的数据库,查询订单金额等 // 伪代码: // $order_info = $dsql->GetOne("SELECT * FROM `#@__addonshop` WHERE ordersn='$order_sn'"); // if (!$order_info) { // die('订单不存在'); // } // $total_amount = $order_info['price']; // 订单金额 // 为了演示,我们直接写死一个金额 $total_amount = '0.01'; // 单位:元 // 2. 配置参数 $config = array( 'app_id' => '你的APPID', 'merchant_private_key' => '你的应用私钥', 'notify_url' => 'http://www.yourdomain.com/alipay/notify.php', // 异步通知地址 'return_url' => 'http://www.yourdomain.com/alipay/return.php', // 同步跳转地址 'alipay_public_key' => '你的支付宝公钥' ); // 3. 创建请求参数 $aop = new \AopClient(); $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do'; $aop->appId = $config['app_id']; $aop->rsaPrivateKey = $config['merchant_private_key']; $aop->format = 'json'; $aop->charset = 'UTF-8'; $aop->signType = 'RSA2'; $aop->alipayPublicKey = $config['alipay_public_key']; $request = new \AlipayTradePagePayRequest(); $request->setReturnUrl($config['return_url']); $request->setNotifyUrl($config['notify_url']); // 设置业务参数 $bizContent = json_encode([ "out_trade_no" => $order_sn, // 你的网站订单号 "product_code" => "FAST_INSTANT_TRADE_PAY", "total_amount" => $total_amount, "subject" => "DedeCMS订单支付", // 订单名称 "body" => "订单号:".$order_sn, // 订单描述 ]); $request->setBizContent($bizContent); // 4. 发起请求 $response = $aop->pageExecute($request, 'GET'); // 5. 输出支付表单 echo $response; ?> - 在你的网站根目录下创建一个新文件,
-
创建异步通知处理页面 (
notify.php):- 这个页面是支付成功后支付宝服务器会调用的,用户不会看到。
- 它的核心任务是验证通知的真实性,然后更新订单状态。
<?php require_once '../alipay_sdk/AopSdk.php'; $config = array( 'app_id' => '你的APPID', 'merchant_private_key' => '你的应用私钥', 'notify_url' => 'http://www.yourdomain.com/alipay/notify.php', 'return_url' => 'http://www.yourdomain.com/alipay/return.php', 'alipay_public_key' => '你的支付宝公钥' ); $aop = new \AopClient(); $aop->alipayPublicKey = $config['alipay_public_key']; // 获取POST过来的数据 $post_data = $_POST; // 验证签名 $result = $aop->rsaCheckV1($post_data, null, 'RSA2'); if ($result) { // 验证成功,处理业务逻辑 $out_trade_no = $post_data['out_trade_no']; // 你的网站订单号 $trade_no = $post_data['trade_no']; // 支付宝交易号 $trade_status = $post_data['trade_status']; // 交易状态 // 只处理 TRADE_SUCCESS 或 TRADE_FINISHED 状态 if ($trade_status == 'TRADE_SUCCESS' || $trade_status == 'TRADE_FINISHED') { // 1. 查询订单,防止重复处理 // $order_info = $dsql->GetOne("SELECT * FROM `#@__addonshop` WHERE ordersn='$out_trade_no'"); // if ($order_info && $order_info['paystatus'] == 0) { // 0代表未支付 // 2. 更新订单状态为已支付 // $dsql->ExecuteNoneQuery("UPDATE `#@__addonshop` SET paystatus=1, tradeno='$trade_no' WHERE ordersn='$out_trade_no'"); // 3. 这里可以添加其他业务逻辑, // - 发送订单确认邮件/短信 // - 自动发货(如果是虚拟商品) // - 增加用户积分等 echo 'success'; // 必须输出 success,支付宝才会认为通知成功 // } } } else { // 验证失败 echo 'fail'; } ?> -
创建同步跳转页面 (
return.php):- 用户支付成功后,会被重定向到这个页面。
- 注意:这个页面的信息仅供参考,最终的支付结果应以异步通知为准,因为用户可能关闭浏览器或网络问题导致异步通知失败。
<?php // 同样需要验证,但不可靠 // 为了安全,这里最好只是提示用户支付成功,然后让他去“我的订单”页面查看最终状态。 // 获取订单号 $out_trade_no = $_GET['out_trade_no']; // 可以在这里做一个简单的查询,并显示给用户 // echo "您的订单({$out_trade_no})支付成功,正在跳转..."; // 然后跳转到订单列表页 header("Location: /member/order_list.php"); exit; ?>
总结与建议
| 特性 | 插件 | SDK |
|---|---|---|
| 上手难度 | 低,配置即可 | 高,需要编程 |
| 开发速度 | 快 | 慢 |
| 灵活性 | 差,受限于插件功能 | 高,完全自定义 |
| 安全性 | 取决于插件来源 | 高,可控性强 |
| 适用人群 | 普通站长、非技术人员 | 开发者、有定制需求的用户 |
给你的建议:
- 如果你只是想快速让网站支持支付功能,并且对插件来源有信心,强烈推荐使用方式一。
- 如果你对支付流程有特殊要求,或者对安全性要求极高,并且有开发人员,选择方式二,使用官方 SDK 是最稳妥、最灵活的方案。
无论选择哪种方式,异步通知 (notify_url.php) 的处理都是整个支付流程中最核心、最关键的一环,务必保证其逻辑的正确性和健壮性。
