ecshop pc微信掃碼支付

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; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章