zoukankan      html  css  js  c++  java
  • 下篇: php 微商城 基于Thinkphp3.2框架开发

    (12)微信商城

    ① 前台模板引入

    a.引入微信商城模板的css+js+Images+img+bootstrap

     

     b.引入微商城的首页index.html及详情页detail.html页面模板

     

     注意:修改js/css/image等的引入路径

    c.控制器添加显示页面的方法

    D:phpStudyWWWwechat p3ApplicationShopControllerIndexController.class.php

     

     d.访问控制器中的方法查看显示效果

    http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Index/index

    http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Index/detail

      

    ② 后台模板引入(注意修改bootstrap的引入路径)

    a.添加

    ² 引入产品添加页面

     

     ² 后台控制器添加方法

        //显示添加商品页面
        public function add(){
              $this->display();    
        }

    ² 访问控制器中的方法,查看显示效果

    http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Admin/add

       

     ² 添加商品+图片上传

    注意:配置好数据库连接D:phpStudyWWWwechat p3ApplicationShopConfconfig.php

        //添加商品+图片上传
        public function addgoods(){
            //var_dump($_POST);exit;
            header("Content-type:text/html;charset=utf-8");
            $m=M('goods');
            $upload = new ThinkUpload();// 实例化上传类   
            $upload->maxSize   =3145728 ; // 设置附件上传大小   
            $upload->exts      =array('jpg', 'gif', 'png', 'jpeg'); // 设置附件上传类型
            $upload->rootPath  ='./Public/Uploads/'; // 设置附件上传目录
            $info   =   $upload->upload();           // 上传文件
            if(!$info) {// 上传错误提示错误信息
                echo '<script type="text/javascript">alert("上传图片失败");</script>';
                exit;
            }else{      // 上传成功
                $_POST['img']=$info['img']['savepath'].$info['img']['savename'];
                //var_dump($_POST);
                /*
                array(4) {
                    ["name"]=> string(3) "222"
                    ["price"]=> string(3) "222"
                    ["pex"]=> string(4) "A类"
                    ["img"]=> string(28) "2017-08-17/59952ffbea896.png"
                }
                */
                $arr=$m->add($_POST);
                if($arr){
                    echo '<script type="text/javascript">alert("添加成功");</script>';
            }else{
                echo '<script type="text/javascript">alert("添加失败");</script>';
            }
        }


    b.列表

    ² 引入展品列表显示页面

     

    ² 后台控制器列表方法

        //商品列表页
        public function lists(){
                $m=M('goods');
                $data=$m->select();
                $this->assign("data",$data);
                $this->display();
        }

    ² 访问控制器中的方法,查看显示效果

    http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Admin/lists

     

     c.删除

    ² 后台控制器列表方法

        //删除商品
        public function del(){
            header("Content-type:text/html;charset=utf-8");
            $id=$_GET['id'];
            $m=M('goods');
            $res=$m->delete($id);
            if($res){
                echo '<script>alert("删除成功");history.go(-1);</script>';
            }else{
                echo '<script>alert("删除失败");history.go(-1);</script>';
            }
        }    

    ² 点击删除按钮

     

    ③ 前台数据展示

    a.控制器取数据

        //首页
        public function index(){
        $m=M('goods');
        $data=$m->select();
        $this->assign('data',$data); 
           $this->display(); 
        }
    
        //详情页
        public function detail(){
         $m=M('goods');
            $data=$m->find($_GET['id']);
            $this->assign('data',$data);
            $this->display();
      }
      
    //订单页   public function order(){    $this->assign('data',$_POST);    $this->display();   }

    b.页面展示

    D:phpStudyWWWwechat p3ApplicationShopViewIndexindex.html

     

     http://zouke1220.oicp.net/wechat/tp3/index.php/Shop/Index/index

     

     D:phpStudyWWWwechat p3ApplicationShopViewIndexdetail.html

     

     http://zouke1220.oicp.net/wechat/tp3/Shop/Index/detail/id/2.html

     

     D:phpStudyWWWwechat p3ApplicationShopViewIndexorder.html

     

     http://zouke1220.oicp.net/wechat/tp3/Shop/Index/order.html

     

     将wechat选择城市插件文件下的js文件拷贝到D:phpStudyWWWwechat p3Publicjs下

    将wechat选择城市插件文件下的css文件拷贝到D:phpStudyWWWwechat p3Publiccss下

    订单页面order.html引入刚才的css文件:area.cssjs文件:area.jsjquery-3.2.1.js

     

     访问查看效果

     c.写入订单到数据库

        //写入订单到数据库
        public function addOrder(){
            header('Content-type:text/html;charset=utf-8');
    
            $data['gid']=$_POST['id'];
            $data['name']=$_POST['name'];
            $data['price']=$_POST['price']*$_POST['num'];
            $data['num']=$_POST['num'];
            $data['email']=$_POST['email'];
            $data['mobile']=$_POST['mobile'];
            $data['city']=$_POST['city'];
            $data['detail']=$_POST['detail'];
    
            $m=M('orders');
            $res=$m->add($data);
            if($res){
                echo '<script>alert("生成订单成功");history.go(-2)</script>';
            }else{
                echo '<script>alert("生成订单失败");history.go(-1)</script>';
            }
        } 

    ④ 微信支付

    同步:同步执行或跳转

    异步:不管用户是否点击完成或跳转,微信服务器都会向我们的服务器推送数据

    如果指定推送数据的地址:如果微信服务器没有收到返回参数,会一直向你的服务器推送数据,8次。

     a.修改写订单方法

        //写入订单到数据库
        public function addOrder(){
            header('Content-type:text/html;charset=utf-8');
            //未支付成功 缓存订单数据
            if(empty($_GET['isnull'])){
                //去支付
                header('Location:http://zouke1220.oicp.net/wechat/tp3/WxPay/example/jsapi.php');  
                //缓存订单数据  
                $data['gid']=$_POST['id'];
                $data['name']=$_POST['name'];
                $data['username']=$_POST['username'];
                $data['pirce']=$_POST['pirce']*$_POST['num'];
                $data['num']=$_POST['num'];
                $data['email']=$_POST['email'];
                $data['mobile']=$_POST['mobile'];
                $data['city']=$_POST['city'];
                $data['detail']=$_POST['detail'];
    
                session('data',$data);
            }else{  //支付成功 插入订单数据
                $m=M('order');
                $res=$m->add(session('data'));
                if($res){
                    echo '<script>alert("生成订单成功");
                    location.href="http://zouke1220.oicp.net/wechat/tp3/Shop/Index";</script>';
                }else{
                    echo '<script>alert("生成订单失败");history.go(-2)</script>';
                }
            }
        }    

    b.修改jsapi.php

    D:phpStudyWWWwechat p3WxPayexamplejsapi.php

    <?php
    /******************新增开始**********************/
    session_start();
    header('Content-type:text/html;charset=utf-8');
    /******************新增结束**********************/ 
    
    ini_set('date.timezone','Asia/Shanghai');
    //error_reporting(E_ERROR);
    require_once "../lib/WxPay.Api.php";
    require_once "WxPay.JsApiPay.php";
    require_once 'log.php';
    //初始化日志
    $logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
    $log = Log::Init($logHandler, 15); 
    
    //打印输出数组信息
    /***********注释开始********************
    function printf_info($data)
    {
        foreach($data as $key=>$value){
            echo "<font color='#00ff55;'>$key</font> : $value <br/>";
        }
    }
    ************注释结束*******************/ 
    
    //①、获取用户openid
    $tools = new JsApiPay();
    $openId = $tools->GetOpenid();
    //②、统一下单
    $input = new WxPayUnifiedOrder();
    $input->SetBody($_SESSION['data']['name']);              //动态获取
    $input->SetAttach($_SESSION['data']['name']);            //动态获取
    $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
    $input->SetTotal_fee($_SESSION['data']['price']);        //动态获取
    $input->SetTime_start(date("YmdHis"));
    $input->SetTime_expire(date("YmdHis", time() + 600));
    $input->SetGoods_tag("test");
    $input->SetNotify_url("http://zouke1220.oicp.net/wechat/tp3/WxPay/example/notify.php");   //异步回调
    $input->SetTrade_type("JSAPI");
    $input->SetOpenid($openId);
    $order = WxPayApi::unifiedOrder($input);
    
    /**************注释开始*********************
    echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
    printf_info($order);
    ***************注释结束********************/
    
    $jsApiParameters = $tools->GetJsApiParameters($order);
    //获取共享收货地址js函数参数
    $editAddress = $tools->GetEditAddressParameters();
    
    //③、在支持成功回调通知中处理成功之后的事宜,见 notify.php
    /**
     * 注意:
     * 1、当你的回调地址不可访问的时候,回调通知会失败,可以通过查询订单来确认支付是否成功
     * 2、jsapi支付时需要填入用户openid,WxPay.JsApiPay.php中有获取openid流程 (文档可以参考微信公众平台“网页授权接口”,
     * 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
     */
    ?> 
    
    <html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
        <meta name="viewport" content="width=device-width, initial-scale=1"/>
        <title>微信支付样例-支付</title>
        <script type="text/javascript">
            //调用微信JS api 支付
            function jsApiCall(){
                WeixinJSBridge.invoke(
                    'getBrandWCPayRequest',
                    <?php echo $jsApiParameters; ?>,
                    function(res){
                        /**************注释开始****************
                        WeixinJSBridge.log(res.err_msg);
                        alert(res.err_code+res.err_desc+res.err_msg);
                        ***************注释结束***************/ 
    
                        /**************新增开始***********************/
                        if(res.err.msg == "get_brand_wcpay_request:ok"){
                            alert('支付成功');
                            location.href="http://zouke1220.oicp.net/wechat/tp3/Shop/Index/addOrder/isnull/1";
                        }else{
                            alert('支付失败');
                            location.href="http://zouke1220.oicp.net/wechat/tp3/Shop/Index/detail/id/<?php echo $_SESSION['data']['gid'];?>";
                        }
                        /***************新增结束***********************/
                    }
                );
            }
    
            function callpay(){
                if (typeof WeixinJSBridge == "undefined"){
                    if( document.addEventListener ){
                        document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
                    }else if (document.attachEvent){
                        document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                        document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
                    }
                }else{
                    jsApiCall();
                }
            }
        </script>
        <script type="text/javascript">
        //获取共享地址
        /**************注释开始*************************
        function editAddress()
        {
            WeixinJSBridge.invoke(
            'editAddress',
            <?php echo $editAddress; ?>,
            function(res){
                var value1 = res.proviceFirstStageName;
                var value2 = res.addressCitySecondStageName;
                var value3 = res.addressCountiesThirdStageName;
                var value4 = res.addressDetailInfo;
                var tel = res.telNumber;
                alert(value1 + value2 + value3 + value4 + ":" + tel);
                }
                );
            }
            window.onload = function(){
            if (typeof WeixinJSBridge == "undefined"){
                if( document.addEventListener ){
                    document.addEventListener('WeixinJSBridgeReady', editAddress, false);
                }else if (document.attachEvent){
                    document.attachEvent('WeixinJSBridgeReady', editAddress);
                    document.attachEvent('onWeixinJSBridgeReady', editAddress);
                }
            }else{
            editAddress();
            }
        };
        *****************注释结束************************/
        </script>
    </head>
    <body>
        <!----------------------------注释开始----------------------------------------
        <br/>
        <font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/>
    <div align="center">
    <button style="210px; height:50px; border-radius: 15px; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" type="button" onclick="callpay()" >立即支付</button>
    </div>
    ------------------------------注释结束--------------------------------------->
    </body>
    </html>

    说明:

    微信支付测试号暂时还测试不了,有兴趣可以参考

    http://download.csdn.net/download/gcfranklin/8362257

    http://www.cnblogs.com/txw1958/p/wxpayv3-jsapi.html

    http://blog.csdn.net/u014033756/article/details/52038114

    http://www.cnblogs.com/txw1958/p/wxpayv3-signkey.html

    另外:选择order.html表单中的收获地址城市插件调用不了,有时间可以再调

  • 相关阅读:
    [不好分类]关于河北盛华化工有限公司附近爆炸原因猜测
    [到处走走]北京胜利饭店
    reviews of learn python3 the hard way
    [攻防实战]CTF大赛准备(手动注入sql)
    白帽子讲web安全读后感
    论一带一路和携号转网
    [不好分类]南京共享图书馆的探索
    区块链的应用
    SpringMVC学习之REST
    SpringMVC学习六
  • 原文地址:https://www.cnblogs.com/zouke1220/p/7462546.html
Copyright © 2011-2022 走看看