dede如何调用支付宝支付?

99ANYc3cd6
预计阅读时长 30 分钟
位置: 首页 DEDE建站 正文
  1. 官方推荐方式:使用支付宝提供的即时到账交易接口 (旧版),这是最传统、最稳定的方式,通过在模板中嵌入一段 JavaScript 代码来生成支付表单。注意:这是旧版接口,虽然能用,但新项目建议使用更现代的方式。
  2. 现代方式:使用 DedeCMS 的插件市场或第三方开发的支付模块,这种方式更规范,通常提供后台管理界面,配置起来更方便,且可能支持新版支付宝接口。

下面我将详细介绍这两种方法的实现步骤。

dede 调用支付宝
(图片来源网络,侵删)

使用支付宝即时到账接口 (传统方式)

这种方法的核心是:在需要支付的页面(如订单确认页)放置一段由支付宝官方生成的 JS 代码,并修改其中的参数以适应你的网站。

步骤 1:获取支付宝接口信息

  1. 登录 支付宝开放平台
  2. 进入 沙箱环境 (强烈建议先在沙箱环境测试),沙箱环境是模拟真实交易,不会产生真实资金流动。
  3. 在沙箱环境中,创建一个应用,并申请 “手机网站支付”“电脑网站支付” 的接口权限,对于 DedeCMS 这种 PC 站点,选择 电脑网站支付
  4. 在应用的接口详情页面,找到并记录下以下关键信息:
    • 合作者身份ID (partner_id):这是你的商户ID。
    • 支付宝公钥 (alipay_public_key):用于验证支付宝返回的数据。
    • 应用私钥 (private_key):用于向支付宝发送请求时签名。
    • 接口地址 (notify_url):这是支付宝服务器在支付成功后会主动通知你网站的地址,你需要提前在网站后台创建这个处理脚本。
    • 返回地址 (return_url):这是用户在支付宝App/网站完成支付后,跳转回你网站的页面。

步骤 2:在 DedeCMS 后台配置支付参数

  1. 登录你的 DedeCMS 后台。
  2. 进入 系统 -> 系统基本参数 -> 支付网关设置
  3. 这里通常有多个支付方式的配置项,你可以选择一个不常用的(如“其他支付”)来存放支付宝的配置,或者直接修改模板文件,为了清晰,我们直接修改模板。
  4. 记录下这些配置,或者直接在模板文件中使用。

步骤 3:修改 DedeCMS 模板文件

假设你的订单确认页模板是 templets/default/order_confirm.htm

  1. 下载并修改支付宝 JS 代码: 前往支付宝开放平台,找到“电脑网站支付”的“即时到账”接口文档,复制官方提供的 “页面跳转同步通知” 示例代码,它通常是一个 <form> 表单,外面被一个 <script> 标签包裹。

  2. 修改 JS 代码中的参数: 你需要将代码中的静态参数替换为动态的,比如订单号、金额等,这些变量通常来自你的订单系统。

    dede 调用支付宝
    (图片来源网络,侵删)

    修改前的示例代码片段:

    <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>
  3. 整合到 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_urlreturn_url:这两个 URL 必须是你的网站域名下的绝对地址。

    整合后的模板片段示例:

    dede 调用支付宝
    (图片来源网络,侵删)
    <!-- 假设你通过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 请求,通知你支付结果。你的网站必须处理这个通知,并更新订单状态。

  1. 创建一个 notify.php 文件,放在你的网站根目录下。

  2. 在这个文件里,你需要做以下几件事:

    • 接收支付宝POST过来的数据
    • 验证签名:用你保存的 alipay_public_key 来验证支付宝发来的数据是否真实有效,防止伪造。
    • 验证业务参数:检查 out_trade_no(订单号)是否在你的系统中存在,total_fee(金额)是否与订单一致。
    • 更新订单状态:如果一切验证通过,将订单状态更新为“已支付”。
    • 告诉支付宝处理结果:无论成功失败,都必须向支付宝响应 successfail,否则支付宝会重复通知。

    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)

这个页面是用户在支付宝页面手动点击“返回商家”后跳转回来的页面。这个页面的通知不可靠,因为用户可能不点击返回,所以不能用它来判断支付是否成功。 它的主要作用是给用户一个友好的提示,并引导用户去查看订单状态。

  1. 创建 return.php 文件。
  2. 在这个文件里,你可以:
    • 接收支付宝返回的参数(如 out_trade_no)。
    • 提示用户“您已成功支付,正在跳转到订单详情页...”。
    • 然后用 JavaScript 或 meta 标签跳转到订单详情页。
    • 重要:这个页面不能直接将订单状态改为“已支付”,必须依赖 notify.php 的异步通知。

使用第三方支付模块 (推荐)

对于不熟悉开发或者希望快速集成的用户,使用现成的模块是最佳选择。

  1. 寻找模块

    • 去 DedeCMS 的官方论坛、插件市场搜索“支付宝支付”、“在线支付”等关键词。
    • 一些知名的 DedeCMS 开发者或团队会提供这类模块,有些是免费的,有些是付费的。
  2. 安装模块

    • 下载模块包,通常是压缩文件。
    • 按照模块的说明文档,将其上传到 DedeCMS 的 plus 目录或指定目录。
    • 在 DedeCMS 后台 “模块” -> “上传新模块” 或通过 “插件管理” 进行安装。
  3. 配置模块

    • 进入模块的设置界面。
    • 像方法一一样,填入你在支付宝开放平台获取的 partner_idkey公钥异步通知地址同步返回地址 等。
    • 模块通常会自动处理好模板的修改和脚本的创建,你只需要在后台配置即可。
  4. 测试

    在沙箱环境下测试整个购买和支付流程,确保一切正常。

总结与建议

特性 方法一 (手动集成) 方法二 (使用模块)
优点 完全自定义,灵活性高,不依赖第三方代码。 安装配置简单,快速上线,通常有详细文档和售后支持。
缺点 技术门槛高,需要编写和修改模板、处理复杂的签名和异步通知逻辑,容易出错。 可能存在代码安全风险,模块可能过时或不兼容你的 DedeCMS 版本。
适用人群 有 PHP 开发经验,希望深度定制支付流程的开发者。 普通站长,追求效率和稳定,不想深入技术细节的用户。

给新手的建议:

  • 强烈推荐使用方法二,找一个评价好、更新及时的付费模块,虽然需要一些成本,但能为你节省大量时间和精力,并且通常更稳定、更安全。
  • 如果选择方法一,务必先在支付宝沙箱环境进行完整测试,不要直接在生产环境测试。
  • 异步通知 (notify.php) 是重中之重,一定要确保它能正确处理支付结果并更新订单状态,这是防止订单支付后状态不正确的关键。
  • 签名验证逻辑非常复杂,强烈建议直接使用支付宝官方提供的 SDK,而不是自己尝试实现。
-- 展开阅读全文 --
头像
dede扣取金币代码
« 上一篇 04-12
C语言与Haskell,范式差异如何影响编程思维?
下一篇 » 04-12

相关文章

取消
微信二维码
支付宝二维码

目录[+]