织梦本身不带支付功能,所以我们需要通过二次开发来实现,集成微信支付主要有两种方式:

(图片来源网络,侵删)
- 使用第三方支付插件(最推荐,最简单):市面上有很多成熟的织梦微信支付插件,购买后按照说明安装即可,优点是省时省力,经过市场验证,稳定可靠,缺点是需要付费。
- 自主开发或定制开发(灵活,但需要技术能力):如果你懂PHP和微信支付API,可以自己动手开发,优点是完全可控,可以深度定制,缺点是开发周期长,需要处理各种异常情况,且对技术要求高。
下面我将分别详细介绍这两种方法,并重点讲解自主开发的核心步骤,因为这是理解其原理的关键。
使用第三方支付插件(推荐新手)
这是最简单、最快速的方式。
操作步骤:
- 寻找插件:在织梦的官方论坛、DedeCMS吧、或者一些知名的织梦模板网站上搜索“织梦微信支付插件”或“DedeCMS 微信商城插件”,你会找到很多商业插件。
- 购买和下载:选择一个评价好、销量高、支持版本与你织梦系统匹配的插件,然后购买并下载。
- 安装插件:通常插件会提供详细的安装说明(
readme.txt),一般步骤是:- 备份你的网站数据库和文件。
- 将插件文件上传到织梦程序的指定目录(通常是
/plus/或/include/)。 - 访问织梦后台的“模块” -> “上传新模块”,上传插件包进行安装。
- 根据提示进行配置。
- 配置微信支付参数:在后台找到插件的设置页面,填入你的微信支付信息:
- 微信支付商户号:在微信商户平台获取。
- API密钥:在微信商户平台“账户中心” -> “API安全” -> “API密钥(32位)”设置和获取。
- API证书:部分插件可能需要上传证书文件(从商户平台下载)。
- 支付回调URL:插件通常会自动生成,你只需确保这个地址可以被微信服务器访问(公网IP)。
- 测试:在前台生成一个测试订单,选择微信支付,看是否能正常跳转到微信支付界面,并能成功支付和回调。
优点:

(图片来源网络,侵删)
- 即插即用,几分钟就能搞定。
- 功能通常比较完善,支持多种场景(扫码支付、JSAPI支付等)。
- 有技术支持,遇到问题可以找作者。
缺点:
- 需要付费。
- 插件质量参差不齐,可能存在安全漏洞或与你的模板不兼容。
自主开发(适合有一定PHP基础的开发者)
这里我们以最常见的 “扫码支付” 为例,讲解其核心开发流程,扫码支付流程相对简单,用户在手机上用微信扫描网站上的二维码即可完成支付。
开发前准备
- 注册微信商户平台:登录 微信商户平台。
- 获取关键信息:
- 商户号 (MCH_ID):如
1234567890。 - API密钥 (API_KEY):在“账户中心” -> “API安全” -> “API密钥(32位)”中设置和获取。这个密钥非常重要,千万不要泄露!
- 申请产品:在“产品中心” -> “产品功能”中,申请开通“扫码支付”,选择“被扫”(用户扫描你网站的二维码)模式。
- 配置支付目录:在“账户中心” -> “API安全” -> “支付授权目录”中,添加你的网站域名,
https://www.yourdomain.com。这是必须步骤,否则无法支付!
- 商户号 (MCH_ID):如
核心开发步骤
创建订单页面(order.php)
这个页面用于生成订单,并将订单信息提交给微信支付API。
- 获取订单信息:从你的订单表中读取订单总金额、订单号等信息。
- 调用微信统一下单API:
- 需要向微信的统一下单接口
https://api.mch.weixin.qq.com/pay/unifiedorder发送一个POST请求。 - 请求参数是XML格式,包含
appid,mch_id,nonce_str,body,out_trade_no,total_fee,spbill_create_ip,notify_url,trade_type等。 trade_type我们选择NATIVE(扫码支付)。notify_url是支付成功后微信服务器通知你网站的地址,必须公网可访问。total_fee是金额单位,必须为分,1元 = 100。
- 需要向微信的统一下单接口
- 生成支付二维码:
- 统一下单成功后,微信会返回一个
code_url。 - 使用这个
code_url可以生成一个二维码图片,你可以使用PHP的QR码库(如Endroid\QRCode)来生成,或者直接将code_url交给前端JS库(如qrcode.js)来渲染。
- 统一下单成功后,微信会返回一个
示例代码片段(order.php核心逻辑):
<?php
require_once(dirname(__FILE__)."/../include/config.inc.php");
require_once(DEDEINC.'/payment/wechatpay/WxPay.Api.php'); // 假设你把微信支付SDK放在这里
require_once(DEDEINC.'/payment/wechatpay/WxPay.Notify.php');
// 1. 获取你的订单信息
$order_sn = 'DZ'.date('YmdHis').rand(1000, 9999); // 生成一个唯一的订单号
$total_fee = 100; // 1元,单位是分
// 2. 调用统一下单API
$input = new WxPayUnifiedOrder();
$input->SetBody("织梦商城商品"); // 商品描述
$input->SetOut_trade_no($order_sn); // 商户订单号
$input->SetTotal_fee($total_fee); // 总金额
$input->SetSpbill_create_ip($client_ip); // 用户终端IP
$input->SetNotify_url("https://www.yourdomain.com/payment/notify.php"); // 回调地址
$input->SetTrade_type("NATIVE"); // 交易类型
$order = WxPayApi::unifiedOrder($input);
// 3. 获取二维码链接并传递给前端
$code_url = $order['code_url'];
// 将订单号和金额存入你的订单表,并更新状态为“待支付”
$db->Execute("INSERT INTO `#@__orders` (order_sn, total_fee, status) VALUES ('$order_sn', '$total_fee', '0')");
// 在模板中显示二维码
$tpl->assign('code_url', $code_url);
$tpl->display('order_qrcode.htm');
?>
创建支付回调页面(notify.php)
这个页面是核心中的核心,微信支付成功后,会主动向这个页面发送POST请求,通知支付结果。
- 接收通知:
notify.php接收微信服务器发送的XML数据。 - 验证签名:必须先验证签名! 确保通知确实来自微信,防止伪造,使用你之前设置的API密钥进行验证。
- 处理业务逻辑:
- 如果签名验证通过,说明支付成功。
- 从通知数据中获取
out_trade_no(你的订单号)和transaction_id(微信支付订单号)。 - 根据订单号,更新你的订单表,将订单状态改为“已支付”,并记录微信支付订单号。
- 注意:这里的事务处理要非常小心,确保数据库操作万无一失。
- 响应微信:处理完成后,必须向微信服务器返回一个特定的XML
<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>,告诉微信“我已收到通知,不要重复发了”,如果返回FAIL,微信会重试通知。
示例代码片段(notify.php核心逻辑):
<?php
require_once(dirname(__FILE__)."/../include/config.inc.php");
require_once(DEDEINC.'/payment/wechatpay/WxPay.Api.php');
require_once(DEDEINC.'/payment/wechatpay/WxPay.Notify.php');
// 继承WxPayNotify类,方便处理
class PayNotifyCallBack extends WxPayNotify
{
// 重写回调处理函数
public function NotifyProcess($data, $msg)
{
if($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS'){
// 1. 验证签名(SDK内部会做,但你最好再检查一次)
// 2. 业务逻辑处理
$out_trade_no = $data['out_trade_no']; // 你的订单号
$transaction_id = $data['transaction_id']; // 微信支付单号
// TODO: 在这里更新你的订单状态
// $db->Execute("UPDATE `#@__orders` SET status='1', transaction_id='$transaction_id' WHERE order_sn='$out_trade_no'");
// 记录日志
// file_put_contents('notify.log', date('Y-m-d H:i:s')." 支付成功: {$out_trade_no}\n", FILE_APPEND);
return true;
} else {
// 支付失败
file_put_contents('notify.log', date('Y-m-d H:i:s')." 支付失败: {$msg}\n", FILE_APPEND);
return false;
}
}
}
// 初始化回调处理对象
$notify = new PayNotifyCallBack();
// 调用处理方法
$notify->Handle(false);
?>
前端页面(order_qrcode.htm)
这个页面负责显示二维码和支付状态。
<!DOCTYPE html>
<html>
<head>订单支付</title>
<script src="https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js"></script>
</head>
<body>
<h1>请支付</h1>
<p>订单号:{dede:var.name='order_sn'/}</p>
<p>金额:{dede:var.name='total_fee'/} 分</p>
<div id="qrcode" style="width:200px; height:200px; margin:20px auto;"></div>
<p id="status">等待支付...</p>
<script>
new QRCode(document.getElementById("qrcode"), {
text: "{dede:var.name='code_url'/}",
width: 200,
height: 200,
colorDark : "#000000",
colorLight : "#ffffff",
correctLevel : QRCode.CorrectLevel.H
});
// 轮询检查支付状态
function checkPayStatus() {
fetch(`/api/check_order_status.php?order_sn={dede:var.name='order_sn'/}`)
.then(response => response.json())
.then(data => {
if (data.status === 'paid') {
document.getElementById('status').innerText = '支付成功!正在跳转...';
clearInterval(intervalId);
// 跳转到订单成功页
window.location.href = '/pay_success.php?order_sn={dede:var.name='order_sn'/}';
}
})
.catch(error => console.error('Error:', error));
}
var intervalId = setInterval(checkPayStatus, 3000); // 每3秒检查一次
</script>
</body>
</html>
创建检查支付状态的接口(check_order_status.php)
这个简单的API被前端轮询调用,用于检查订单是否已经更新为“已支付”状态。
<?php
require_once(dirname(__FILE__)."/../include/config.inc.php");
$order_sn = isset($_GET['order_sn']) ? trim($_GET['order_sn']) : '';
if(empty($order_sn)){
exit(json_encode(['status' => 'error', 'msg' => '订单号不能为空']));
}
// 查询订单状态
$row = $dsql->GetOne("SELECT status FROM `#@__orders` WHERE order_sn='$order_sn'");
if($row){
if($row['status'] == '1'){
exit(json_encode(['status' => 'paid']));
} else {
exit(json_encode(['status' => 'unpaid']));
}
} else {
exit(json_encode(['status' => 'error', 'msg' => '订单不存在']));
}
?>
总结与注意事项
- 安全第一:回调通知的签名验证是重中之重,绝对不能省略。
- 金额单位:微信支付API的金额单位是分,在前后端传递时务必注意转换,避免出现10倍或0.1倍的错误。
- 回调地址:必须配置为公网可访问的URL,且不能带任何参数。
- 日志记录:在关键节点(如下单、回调、查询状态)都做好日志记录,方便排查问题。
- 错误处理:网络请求、数据库操作都可能失败,要有完善的错误处理和重试机制。
- 证书:如果你的商户平台要求使用API证书(如退款、企业付款等功能),需要下载证书并配置到SDK中。
- 沙箱环境:在正式上线前,务必在微信商户平台的“沙箱环境”中进行完整测试,确保所有流程都走通。
对于大多数站长来说,使用第三方插件是性价比最高的选择,如果你有特殊需求或者想深入学习支付系统的原理,那么自主开发将是一个非常有价值的实践。
