DedeCMS 是一个基于 PHP+MySQL 的网站管理系统,广泛应用于内容管理系统(CMS)。微信支付是腾讯公司提供的在线支付平台,支持多种支付方式,包括公众号支付、扫码支付、JSAPI 支付等。
原因: 签名错误通常是由于参数拼接错误或密钥配置不正确导致的。
解决方法:
示例代码:
<?php
// 假设已经获取到必要的参数
$appid = 'your_appid';
$mch_id = 'your_mch_id';
$nonce_str = md5(uniqid(microtime(true), true));
$sign_type = 'MD5';
$body = 'test';
$out_trade_no = '123456789';
$total_fee = 1;
$spbill_create_ip = $_SERVER['REMOTE_ADDR'];
$notify_url = 'http://yourdomain.com/notify.php';
$trade_type = 'JSAPI';
// 拼接字符串
$sign_str = "appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type&key=your_api_key";
// 计算签名
$sign = strtoupper(md5($sign_str));
// 生成 XML 请求数据
$xml_data = "<xml>
<appid>$appid</appid>
<mch_id>$mch_id</mch_id>
<nonce_str>$nonce_str</nonce_str>
<sign>$sign</sign>
<sign_type>$sign_type</sign_type>
<body>$body</body>
<out_trade_no>$out_trade默哀</out_trade_no>
<total_fee>$total_fee</total_fee>
<spbill_create_ip>$spbill_create_ip</spbill_create_ip>
<notify_url>$notify_url</notify_url>
<trade_type>$trade_type</trade_type>
</xml>";
// 发送请求
$response = postXmlCurl($xml_data, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
// 处理响应
if (strpos($response, 'SUCCESS') !== false) {
// 支付请求成功
} else {
// 支付请求失败
}
function postXmlCurl($xml, $url, $useCert = false, $second = 30) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
if ($useCert == true) {
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLCERT, 'path/to/cert.pem');
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLKEY, 'path/to/key.pem');
}
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$data = curl_exec($ch);
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
throw new Exception("curl出错,错误码:$error");
}
}
?>
参考链接:
通过以上步骤,可以解决 DedeCMS 集成微信支付时遇到的签名错误问题。