- 官方推荐方式:使用支付宝提供的即时到账交易接口 (旧版),这是最传统、最稳定的方式,通过在模板中嵌入一段 JavaScript 代码来生成支付表单。注意:这是旧版接口,虽然能用,但新项目建议使用更现代的方式。
- 现代方式:使用 DedeCMS 的插件市场或第三方开发的支付模块,这种方式更规范,通常提供后台管理界面,配置起来更方便,且可能支持新版支付宝接口。
下面我将详细介绍这两种方法的实现步骤。

使用支付宝即时到账接口 (传统方式)
这种方法的核心是:在需要支付的页面(如订单确认页)放置一段由支付宝官方生成的 JS 代码,并修改其中的参数以适应你的网站。
步骤 1:获取支付宝接口信息
- 登录 支付宝开放平台。
- 进入 沙箱环境 (强烈建议先在沙箱环境测试),沙箱环境是模拟真实交易,不会产生真实资金流动。
- 在沙箱环境中,创建一个应用,并申请 “手机网站支付” 或 “电脑网站支付” 的接口权限,对于 DedeCMS 这种 PC 站点,选择 电脑网站支付。
- 在应用的接口详情页面,找到并记录下以下关键信息:
- 合作者身份ID (partner_id):这是你的商户ID。
- 支付宝公钥 (alipay_public_key):用于验证支付宝返回的数据。
- 应用私钥 (private_key):用于向支付宝发送请求时签名。
- 接口地址 (notify_url):这是支付宝服务器在支付成功后会主动通知你网站的地址,你需要提前在网站后台创建这个处理脚本。
- 返回地址 (return_url):这是用户在支付宝App/网站完成支付后,跳转回你网站的页面。
步骤 2:在 DedeCMS 后台配置支付参数
- 登录你的 DedeCMS 后台。
- 进入 系统 -> 系统基本参数 -> 支付网关设置。
- 这里通常有多个支付方式的配置项,你可以选择一个不常用的(如“其他支付”)来存放支付宝的配置,或者直接修改模板文件,为了清晰,我们直接修改模板。
- 记录下这些配置,或者直接在模板文件中使用。
步骤 3:修改 DedeCMS 模板文件
假设你的订单确认页模板是 templets/default/order_confirm.htm。
-
下载并修改支付宝 JS 代码: 前往支付宝开放平台,找到“电脑网站支付”的“即时到账”接口文档,复制官方提供的 “页面跳转同步通知” 示例代码,它通常是一个
<form>表单,外面被一个<script>标签包裹。 -
修改 JS 代码中的参数: 你需要将代码中的静态参数替换为动态的,比如订单号、金额等,这些变量通常来自你的订单系统。
(图片来源网络,侵删)修改前的示例代码片段:
<script> function doredirect(){ document.alipaysubmit.submit(); } </script> <form id="alipaysubmit" name="alipaysubmit" action="https://openapi.alipay.com/gateway.do?..." method="get"> <input type="hidden" name="out_trade_no" value="2025032000001001" /> <input type="hidden" name="subject" value="测试商品" /> <input type="hidden" name="total_fee" value="0.01" /> <input type="hidden" name="body" value="这是测试商品描述" /> <input type="hidden" name="notify_url" value="http://www.yourdomain.com/notify.php" /> <input type="hidden" name="return_url" value="http://www.yourdomain.com/return.php" /> <input type="hidden" name="partner" value="2088102146225611" /> <input type="hidden" name="_input_charset" value="utf-8" /> <!-- ... 其他参数 ... --> </form> <body onload="doredirect();"> </body> -
整合到 DedeCMS 模板: 在你的
order_confirm.htm文件中,找到合适的位置(立即支付”按钮旁边),将上述代码放进去,并进行修改。修改后的关键点:
out_trade_no(订单号):必须是你系统里唯一的订单号,DedeCMS 订单号通常存储在#@_archives或自定义的订单表里,你需要通过 PHP 获取当前订单号。<input type="hidden" name="out_trade_no" value="<?php echo $order_id; ?>" />。total_fee(金额):必须是数字,不能包含货币符号,同样,通过 PHP 从订单数据中获取。<input type="hidden" name="total_fee" value="<?php echo $order_amount; ?>" />。subject(商品名称):可以是固定的,也可以是动态的。partner(合作者ID):替换成你从支付宝后台获取的partner_id。key(安全校验码):这个参数非常重要,用于签名,替换成你在支付宝后台配置的key。notify_url和return_url:这两个 URL 必须是你的网站域名下的绝对地址。
整合后的模板片段示例:
(图片来源网络,侵删)<!-- 假设你通过PHP已经获取了订单信息 --> <?php // 这里应该是你从数据库获取订单数据的逻辑 $order_id = 'DZ'.time(); // 示例订单号 $order_amount = 99.00; // 示例金额 $alipay_partner = '2088102146225611'; // 你的 partner_id $alipay_key = 'your_alipay_key'; // 你的 key $notify_url = 'http://www.yourdomain.com/notify.php'; $return_url = 'http://www.yourdomain.com/return.php'; ?> <!-- 支付宝表单 --> <script> function doredirect(){ document.alipaysubmit.submit(); } </script> <form id="alipaysubmit" name="alipaysubmit" action="https://openapi.alipay.com/gateway.do?service=create_direct_pay_by_user" method="get"> <input type="hidden" name="out_trade_no" value="<?php echo $order_id; ?>" /> <input type="hidden" name="subject" value="DedeCMS订单支付" /> <input type="hidden" name="total_fee" value="<?php echo $order_amount; ?>" /> <input type="hidden" name="body" value="订单号:<?php echo $order_id; ?>" /> <input type="hidden" name="notify_url" value="<?php echo $notify_url; ?>" /> <input type="hidden" name="return_url" value="<?php echo $return_url; ?>" /> <input type="hidden" name="partner" value="<?php echo $alipay_partner; ?>" /> <input type="hidden" name="payment_type" value="1" /> <input type="hidden" name="seller_id" value="<?php echo $alipay_partner; ?>" /> <input type="hidden" name="_input_charset" value="utf-8" /> <input type="hidden" name="sign" value="<?php echo md5("partner={$alipay_partner}&...&key={$alipay_key}"); ?>" /> <!-- 注意:签名算法更复杂,请参考官方文档 --> <input type="hidden" name="sign_type" value="MD5" /> </form> <p>正在跳转到支付宝支付页面,请稍候...</p> <body onload="doredirect();"> </body>注意:上面的
sign签名只是示意,真实的签名过程非常复杂,需要对所有参数按字典序排序后,再与key进行 MD5 运算,强烈建议参考支付宝官方提供的签名示例代码。
步骤 4:创建服务器异步通知处理脚本 (notify.php)
这是支付流程中最关键的一步,支付宝在用户支付成功后,会立即向这个 notify_url 发送一个 POST 请求,通知你支付结果。你的网站必须处理这个通知,并更新订单状态。
-
创建一个
notify.php文件,放在你的网站根目录下。 -
在这个文件里,你需要做以下几件事:
- 接收支付宝POST过来的数据。
- 验证签名:用你保存的
alipay_public_key来验证支付宝发来的数据是否真实有效,防止伪造。 - 验证业务参数:检查
out_trade_no(订单号)是否在你的系统中存在,total_fee(金额)是否与订单一致。 - 更新订单状态:如果一切验证通过,将订单状态更新为“已支付”。
- 告诉支付宝处理结果:无论成功失败,都必须向支付宝响应
success或fail,否则支付宝会重复通知。
notify.php文件核心逻辑示例:<?php // 1. 引入支付宝SDK或核心验签类 (支付宝官方提供) // require_once 'path/to/alipay_notify.class.php'; // $alipayNotify = new AlipayNotify($alipay_config); // 2. 获取POST数据 $post_data = $_POST; // 3. 验证签名 (这是最核心的步骤,务必使用官方SDK) // $verify_result = $alipayNotify->verifyNotify($post_data); // if($verify_result) { // 4. 验证业务逻辑 $out_trade_no = $post_data['out_trade_no']; // 获取订单号 $trade_status = $post_data['trade_status']; // 获取交易状态 // 检查订单是否存在且未支付 // $order_info = get_order_info_from_db($out_trade_no); // if ($order_info && $order_info['status'] == 'unpaid') { // 根据交易状态处理 if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') { // 更新订单状态为已支付 // update_order_status($out_trade_no, 'paid'); // 可以在这里执行发货等操作 echo 'success'; // 必须输出 success exit; } // } // } else { // 签名验证失败 echo 'fail'; exit; // } ?>
步骤 5:创建页面跳转同步处理脚本 (return.php)
这个页面是用户在支付宝页面手动点击“返回商家”后跳转回来的页面。这个页面的通知不可靠,因为用户可能不点击返回,所以不能用它来判断支付是否成功。 它的主要作用是给用户一个友好的提示,并引导用户去查看订单状态。
- 创建
return.php文件。 - 在这个文件里,你可以:
- 接收支付宝返回的参数(如
out_trade_no)。 - 提示用户“您已成功支付,正在跳转到订单详情页...”。
- 然后用 JavaScript 或 meta 标签跳转到订单详情页。
- 重要:这个页面不能直接将订单状态改为“已支付”,必须依赖
notify.php的异步通知。
- 接收支付宝返回的参数(如
使用第三方支付模块 (推荐)
对于不熟悉开发或者希望快速集成的用户,使用现成的模块是最佳选择。
-
寻找模块:
- 去 DedeCMS 的官方论坛、插件市场搜索“支付宝支付”、“在线支付”等关键词。
- 一些知名的 DedeCMS 开发者或团队会提供这类模块,有些是免费的,有些是付费的。
-
安装模块:
- 下载模块包,通常是压缩文件。
- 按照模块的说明文档,将其上传到 DedeCMS 的
plus目录或指定目录。 - 在 DedeCMS 后台 “模块” -> “上传新模块” 或通过 “插件管理” 进行安装。
-
配置模块:
- 进入模块的设置界面。
- 像方法一一样,填入你在支付宝开放平台获取的
partner_id、key、公钥、异步通知地址、同步返回地址等。 - 模块通常会自动处理好模板的修改和脚本的创建,你只需要在后台配置即可。
-
测试:
在沙箱环境下测试整个购买和支付流程,确保一切正常。
总结与建议
| 特性 | 方法一 (手动集成) | 方法二 (使用模块) |
|---|---|---|
| 优点 | 完全自定义,灵活性高,不依赖第三方代码。 | 安装配置简单,快速上线,通常有详细文档和售后支持。 |
| 缺点 | 技术门槛高,需要编写和修改模板、处理复杂的签名和异步通知逻辑,容易出错。 | 可能存在代码安全风险,模块可能过时或不兼容你的 DedeCMS 版本。 |
| 适用人群 | 有 PHP 开发经验,希望深度定制支付流程的开发者。 | 普通站长,追求效率和稳定,不想深入技术细节的用户。 |
给新手的建议:
- 强烈推荐使用方法二,找一个评价好、更新及时的付费模块,虽然需要一些成本,但能为你节省大量时间和精力,并且通常更稳定、更安全。
- 如果选择方法一,务必先在支付宝沙箱环境进行完整测试,不要直接在生产环境测试。
- 异步通知 (
notify.php) 是重中之重,一定要确保它能正确处理支付结果并更新订单状态,这是防止订单支付后状态不正确的关键。 - 签名验证逻辑非常复杂,强烈建议直接使用支付宝官方提供的 SDK,而不是自己尝试实现。
