1.微信支付sdk
Wxpay.php
<?php
require_once "wxpay/lib/WxPay.Api.php";
require_once 'wxpay/lib/MyWxPay.Config.php';
require_once 'wxpay/lib/WxPay.Notify.php';
require_once 'wxpay/lib/MyWxPay.NativePay.php';
require_once 'wxpay/example/log.php';
if (!defined('IN_ECS'))
{
die('Hacking attempt');
}
$payment_lang = ROOT_PATH . 'languages/' .$GLOBALS['_CFG']['lang']. '/payment/wxpay.php';
if (file_exists($payment_lang))
{
global $_LANG;
include_once($payment_lang);
}
/* 模塊的基本信息 */
if (isset($set_modules) && $set_modules == TRUE)
{
$i = isset($modules) ? count($modules) : 0;
/* 代碼 */
$modules[$i]['code'] = basename(__FILE__, '.php');
/* 描述對應的語言項 */
$modules[$i]['desc'] = 'alipay_desc';
/* 是否支持貨到付款 */
$modules[$i]['is_cod'] = '0';
/* 是否支持在線支付 */
$modules[$i]['is_online'] = '1';
/* 作者 */
$modules[$i]['author'] = 'ECSHOP TEAM';
/* 網址 */
$modules[$i]['website'] = 'http://www.alipay.com';
/* 版本號 */
$modules[$i]['version'] = '1.0.2';
/* 配置信息 */
$modules[$i]['config'] = array(
array('name' => 'appid', 'type' => 'text', 'value' => ''),
array('name' => 'mchid', 'type' => 'text', 'value' => ''),
array('name' => 'appsecret', 'type' => 'text', 'value' => '')
);
return;
}
/**
* 類
*/
class wxpay
{
/**
* 構造函數
*
* @access public
* @param
*
* @return void
*/
function wxpay()
{
}
function __construct()
{
$this->wxpay();
}
function _config( $payment )
{
$myconfig = new MyWxPayConfig();
$myconfig->SetAppId($payment['appid']);
$myconfig->SetMerchantId($payment['mchid']);
$myconfig->SetKey($payment['appsecret']);
return $myconfig;
}
/**
* 生成支付代碼
* @param array $order 訂單信息
* @param array $payment 支付方式信息
*/
function get_code($order, $payment)
{
$config = $this->_config($payment);
$order_amount = round($order['order_amount'], 2);
$order_amount = $order_amount*100;
// addError('發送金額',$order_amount);
$setbody = $order['order_sn'];
$input = new WxPayUnifiedOrder();
$input->SetBody($setbody);
$input->SetAttach($order['order_sn']);
$input->SetOut_trade_no($order['order_sn'] . $order['log_id']);
$input->SetTotal_fee($order_amount);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("http://xxxmart.com/respond.php/code/wxpay");
$input->SetTrade_type("NATIVE");
$input->SetProduct_id("123456789");
$notify = new MyNativePay();
$result = $notify->GetPayUrl($input,$config);
$url2 = null;
$err = '出錯了';
if( $result["return_code"] == 'FAIL'){
$err = $result["return_msg"];
}else{
$url2 = $result["code_url"];
}
$html = '<button type="button" onclick="javascript:alert(\''. $err .'\')">微信支付</button>';
if($url2 != NULL)
{
$code_url = $url2;
$html = "<div style=\"text-align:center;color:#A00000;\"><b>掃描下方二維碼支付訂單</b></div>";
$html .= '<div class="wx_qrcode" style="text-align:center">';
$html .= $this->getcode($code_url);
$html .= "</div>";
$html .= "<div style=\"text-align:center\">支付後點擊<a href=\"user.php?act=order_list\" style=\"color:red\">此處</a>查看我的訂單</div>";
$html .='<script type="text/javascript">
function get_wxpay_native_status( id ){
Ajax.call("user.php", "act=wxpay_native_query&id="+id, return_wxpay_order_status, "GET", "JSON");
}
function return_wxpay_order_status( result ){
if ( result.error == 0 && result.is_paid == 1 ){
window.location.href = result.url;
}
}
window.setInterval(function(){ get_wxpay_native_status("'. $order['log_id'] .'"); }, 2000);
</script>';
}
return $html;
}
function getcode($url)
{
if (file_exists(ROOT_PATH . 'includes/phpqrcode.php')) {
include(ROOT_PATH . 'includes/phpqrcode.php');
}
// 糾錯級別:L、M、Q、H
$errorCorrectionLevel = 'Q';
// 點的大小:1到10
$matrixPointSize = 5;
// 生成的文件名
$tmp = ROOT_PATH . 'images/qrcode/';
if (!is_dir($tmp)) {
@mkdir($tmp);
}
$filename = $tmp . $errorCorrectionLevel . $matrixPointSize . '.png';
QRcode::png($url, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
return '<img src="' . $GLOBALS['ecs']->url() . 'images/qrcode/' . basename($filename) . '" />';
}
/**
* 響應操作
*/
function respond()
{
$xml = file_get_contents('php://input');
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
$asign = $arr['sign'];
unset($arr['sign']);
$sign = http_build_query($arr);
$payment = get_payment('wxpay');
$config = $this->_config($payment);
$signstr = $sign . '&key='.$config->GetKey();
//md5處理
$sign = md5($signstr);
//轉大寫
$sign = strtoupper($sign);
if ( $sign === $asign) {
$order_sn = str_replace( $arr['attach'], '', $arr['out_trade_no']);
$order_sn = trim($order_sn);
// addError('order_sn',$order_sn);
$total_fee = $arr['total_fee']/100;
// addError('金額',$total_fee);
/* 檢查支付的金額是否相符 */
if (!check_money($order_sn, $total_fee))
{
addError('失敗金額不對',$total_fee);
return false;
}
if($arr['return_code'] == 'SUCCESS' || $arr['result_code'] == 'SUCCESS'){
// 校驗返回的訂單金額是否與商戶側的訂單金額一致。修改訂單表中的支付狀態。
$return = array('return_code' => 'SUCCESS', 'return_msg' => 'OK');
$xml = '<xml>';
foreach ($return as $k => $v) {
$xml .= '<' . $k . '><![CDATA[' . $v . ']]></' . $k . '>';
}
$xml .= '</xml>';
echo $xml;
order_paid($order_sn, 2);
exit;
// 成功
}elseif ($arr['return_code'] == 'FAIL'){
order_paid($order_sn);
}
}
$err['request'] = $_REQUEST;
$err['get'] = $_GET;
$err['post'] = $_POST;
$err['XML'] = $arr;
$err = json_encode($err);
addError('失敗',$err);
exit;
}
}
?>
2.語言包
<?php
global $_LANG;
$_LANG['wxpay'] = '<font color="#FF0000">微信支付</font>';
$_LANG['wxpay_desc'] = '微信掃碼支付';
$_LANG['appid'] = 'Appid';
$_LANG['appsecret'] = '交易安全校驗碼';
$_LANG['mchid'] = '商戶號';
$_LANG['pay_button'] = '立即使用微信支付';
?>
3.數據庫支付信息
pay_config的數據
a:3:{i:0;a:3:{s:4:"name";s:5:"appid";s:4:"type";s:4:"text";s:5:"value";s:18:"wxxxx687";}i:1;a:3:{s:4:"name";s:5:"mchid";s:4:"type";s:4:"text";s:5:"value";s:10:"150173xxxxx";}i:2;a:3:{s:4:"name";s:9:"appsecret";s:4:"type";s:4:"text";s:5:"value";s:32:"acbc2018QCBCPGxxxxx";}}
這裏要注意name的值需要和語言包裏的下標相同,後臺纔有顯示
$_LANG['wxpay_desc'] = '微信掃碼支付';
$_LANG['appid'] = 'Appid';
$_LANG['appsecret'] = '交易安全校驗碼';
而pay_code需要和語言包,插件文件名相同才能找到對應的文件和參數(wxpay,D:\WWW\2018\chengren\languages\zh_cn\payment\wxpay.php, D:\WWW\2018\chengren\includes\modules\payment\wxpay.php)
4錯誤日誌函數
function addError($err,$log){
$sql = 'INSERT INTO ' . $GLOBALS['ecs']->table('err_log') .
' (log, description,add_time) ' .
'SELECT ' .
"'$err', '$log', '" .gmtime() . "' ";
$GLOBALS['db']->query($sql);
}
日誌數據庫
# Host: localhost (Version: 5.5.53)
# Date: 2018-07-25 14:42:23
# Generator: MySQL-Front 5.3 (Build 4.234)
/*!40101 SET NAMES utf8 */;
#
# Structure for table "ecs_err_log"
#
DROP TABLE IF EXISTS `ecs_err_log`;
CREATE TABLE `ecs_err_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`log` text NOT NULL COMMENT '錯誤信息',
`description` text NOT NULL COMMENT '備註',
`add_time` int(10) NOT NULL COMMENT '添加時間',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='錯誤日誌';
5wdcp Rewrite規則管理
rewrite ^/respond.php/code/(.*)$ /respond.php?code=$1 last;