核心思路
织梦本身不包含具体的支付逻辑,它提供了一个灵活的插件系统,接入支付的核心就是开发一个符合织梦规范的支付插件,这个插件负责:

(图片来源网络,侵删)
- 在前端:生成支付按钮,并收集用户订单信息。
- 在后台:接收来自支付平台(如支付宝、微信)的支付结果通知。
- 处理逻辑:根据支付结果,更新订单状态(如“已支付”、“未支付”)。
第一步:准备工作(至关重要)
在开始编码之前,你必须完成以下准备工作:
-
注册并开通支付服务:
-
获取关键参数:
- 应用ID (APPID):你的应用在支付平台的唯一标识。
- 商户私钥 (Private Key):用于对请求进行签名,请务必妥善保管,不要泄露。
- 支付宝公钥 / 微信支付平台证书:用于验证支付平台返回数据的签名,确保数据来源可信。
- 接口加签密钥 (Key):用于某些接口的验证。
- 异步通知地址 (Notify URL):这是支付成功后,支付平台会主动访问你的织梦网站的一个URL地址,用于通知你支付结果,这个地址必须是 公网可以访问的,
http://www.yourdomain.com/notify.php。
-
了解织梦插件结构:
(图片来源网络,侵删)- 一个标准的织梦插件通常位于
/dede/目录下的payment/文件夹中。 - 每个支付方式一个独立的文件夹,
alipay/、wechatpay/。 - 文件夹内包含
config.php(配置文件)、lib.php(核心逻辑文件)等。
- 一个标准的织梦插件通常位于
第二步:创建织梦支付插件
下面以接入 支付宝手机网站支付 为例,讲解如何创建一个插件。
创建插件目录和文件
在 /dede/payment/ 目录下,创建一个新文件夹,alipay_mobile,然后在该文件夹中创建以下文件:
alipay_mobile/config.php(插件配置信息)lib.php(支付核心逻辑)notify.php(接收异步通知的入口文件)
编写 config.php (配置文件)
这个文件用于在织梦后台显示支付方式的配置项。
<?php
/*
** 支付宝手机网站支付插件配置文件
*/
return array(
'name' => '支付宝手机网站支付', // 插件显示名称
'version' => '1.0', // 插件版本
'author' => 'Your Name', // 作者
'website' => 'http://www.yourdomain.com', // 网站地址
// 支付方式配置项
'cfgs' => array(
array(
'name' => 'app_id', // 配置项名称
'title' => '应用APPID', // 配置项标题
'type' => 'text', // 配置项类型 (text, password, textarea, radio, select等)
'value' => '', // 默认值
'description' => '请填写您的支付宝开放平台应用APPID'
),
array(
'name' => 'private_key', // 配置项名称
'title' => '商户私钥', // 配置项标题
'type' => 'password', // 密码类型,输入时显示为***
'value' => '',
'description' => '请填写您的应用私钥'
),
array(
'name' => 'public_key', // 配置项名称
'title' => '支付宝公钥', // 配置项标题
'type' => 'textarea', // 文本域,用于粘贴多行公钥
'value' => '',
'description' => '请填写支付宝公钥'
),
array(
'name' => 'notify_url', // 配置项名称
'title' => '异步通知地址', // 配置项标题
'type' => 'text',
'value' => 'http://www.yourdomain.com/notify.php', // 默认值,用户可修改
'description' => '支付成功后,支付宝会向此地址发送通知,请确保此地址外网可访问'
)
)
);
编写 lib.php (核心逻辑文件)
这是插件最核心的部分,包含了生成支付表单和处理返回的逻辑。

(图片来源网络,侵删)
<?php
/*
** 支付宝手机网站支付插件核心逻辑
*/
require_once 'alipay-sdk/AopSdk.php'; // 假设你已经将支付宝的SDK放在此目录下
class alipay_mobile
{
// 插件信息
public $cfg = array();
// 构造函数,加载配置
public function __construct($cfg)
{
$this->cfg = $cfg;
}
// 生成支付代码(前端会调用此方法)
public function get_code($order)
{
// 1. 加载支付宝SDK
$aop = new AopClient();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = $this->cfg['app_id'];
$aop->rsaPrivateKey = $this->cfg['private_key'];
$aop->alipayrsaPublicKey = $this->cfg['public_key'];
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset = 'UTF-8';
$aop->format = 'json';
// 2. 构造请求参数
$request = new AlipayTradeWapPayRequest();
$request->setReturnUrl($this->cfg['return_url']); // 同步跳转地址(可选)
$request->setNotifyUrl($this->cfg['notify_url']); // 异步通知地址
// 订单信息($order 是织梦传递过来的订单数据,包含订单号、金额等)
$bizContent = json_encode(array(
'out_trade_no' => $order['order_sn'], // 织梦订单号
'total_amount' => $order['price'], // 订单金额
'subject' => $order['name'], // 订单名称
'product_code' => 'QUICK_WAP_WAY' // 手机网站产品码
), JSON_UNESCAPED_UNICODE);
$request->setBizContent($bizContent);
// 3. 发起请求并获取表单
$response = $aop->pageExecute($request, 'GET');
return $response; // 返回支付宝的表单HTML,前端直接输出即可
}
// 处理异步通知(后台自动调用)
public function notify($get, $post)
{
// 1. 验证签名
$aop = new AopClient();
$aop->alipayrsaPublicKey = $this->cfg['public_key'];
$flag = $aop->rsaCheckV1($post, null, 'RSA2');
if ($flag) {
// 2. 验证业务参数
$out_trade_no = $post['out_trade_no']; // 织梦订单号
$trade_no = $post['trade_no']; // 支付宝交易号
$trade_status = $post['trade_status']; // 交易状态
// 判断交易状态是否为TRADE_SUCCESS或TRADE_FINISHED
if ($trade_status == 'TRADE_SUCCESS' || $trade_status == 'TRADE_FINISHED') {
// 3. 在这里更新你的订单状态为“已支付”
// 调用织梦的订单更新函数
// $this->updateOrderStatus($out_trade_no, '1'); // '1'代表已支付
// 记录日志
file_put_contents('alipay_notify.log', date('Y-m-d H:i:s') . " - notify success - order: $out_trade_no\n", FILE_APPEND);
echo 'success'; // 必须返回 success 给支付宝,否则会重复通知
return true;
}
}
echo 'fail';
return false;
}
}
编写 notify.php (通知入口)
这个文件非常简单,它的作用是实例化支付插件,并调用其 notify 方法。
<?php
/*
** 支付宝异步通知入口
*/
define('DEDEINC', '../..'); // 根据你的实际目录结构调整
require_once DEDEINC . '/dedeapi.class.php';
require_once DEDEINC . '/payment/alipay_mobile/lib.php'; // 引入核心逻辑
// 从织梦配置中读取支付方式设置
$cfg = $dsql->GetOne("SELECT * FROM `#@__payment` WHERE `mcode` = 'alipay_mobile'");
// 实例化支付插件
$pay = new alipay_mobile(unserialize($cfg['config']));
// 处理通知
$pay->notify($_GET, $_POST);
第三步:在织梦后台启用支付插件
- 上传插件:将你创建的
alipay_mobile文件夹通过FTP上传到/dede/payment/目录下。 - 登录织梦后台:进入 “系统” -> “支付插件管理”。
- 启用插件:你应该能看到 “支付宝手机网站支付” 插件,点击 “设置”,填入你在支付宝开放平台获取的
APPID、私钥、公钥和异步通知地址。 - 设为默认:设置完成后,可以将其设为默认支付方式。
第四步:调用支付
当用户在你的织梦网站上提交订单并选择支付时,织梦系统会自动调用你插件中的 get_code 方法,并将订单信息传递过去,你只需要在前台模板的相应位置,输出支付代码即可。
<!-- 在订单确认页面或支付页面 -->
<div class="payment-method">
<!-- ... 其他支付方式 ... -->
<!-- 调用支付宝支付 -->
{dede:payform order_sn='$ordersn' price='$price' name='商品名称'/}
<!-- 这里的 {dede:payform} 是织梦系统提供的标签,它会自动加载你启用的支付插件并调用 get_code 方法 -->
<!-- 你需要确保这个标签被正确放置,并且织梦的订单系统会传递正确的参数 -->
</div>
重要注意事项和最佳实践
- 使用官方SDK:强烈建议从支付宝/微信官方下载最新的SDK,而不是自己从头写签名和请求逻辑,这能避免很多坑,将SDK文件放在你的插件目录中。
- 安全第一:
- 私钥绝对不能泄露。
- 异步通知地址必须使用
https,确保数据传输安全。 - 在处理通知时,务必验证签名,防止伪造的通知。
- 订单幂等性:在
notify方法中更新订单状态时,要先检查该订单是否已经支付过,避免重复支付导致的问题。 - 日志记录:无论是成功还是失败的通知,都做好日志记录,这对于排查问题至关重要。
- 错误处理:在
get_code方法中,要加入对网络请求、SDK调用等可能出现的异常进行捕获和处理。 - 测试环境:支付宝和微信都提供沙箱环境,务必在沙箱环境充分测试,确认流程无误后再切换到生产环境。
接入支付是一个需要细心和耐心的工作,核心在于:
- 理清支付平台的流程(申请参数、请求、回调)。
- 遵循织梦的插件规范,编写
config.php和lib.php。 - 确保异步通知的安全性和可靠性。
如果你对PHP开发不太熟悉,可以考虑寻找现成的织梦支付插件,或者聘请有经验的开发者来完成这项工作。
