ecshop pc微信掃碼支付
阿新 • • 發佈:2019-01-09
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;