首页
登录 | 注册

项目总结-第一次外包项目1-项目新增功能与困难

项目新增功能与困难

概述:该项目已有PC端网站;项目需求:修改部分PC端网站功能;实现手机端网站(只为微信用户服务)

实现的新功能如下:

PC端

  1、管理:增加了添加客服二维码{当上传新的客服图片选择“是”显示在页面时,会将其他原“是”的数据设置为“否”}、手机轮播图、手机广告管理

  2、会员列表增加按vip日期排序

  3、增加会员发布作品,选择是否发布到款式库功能,后台增加此项管理

手机端 【主要】

  1、微信登录、绑定新旧用户{绑定原用户时,更新用户信息,会员期限信息,会员收藏信息,会员地址信息,会员订单信息}

  2、收藏功能:浏览显示已收藏信息与收藏量,已收藏显示"红心",取消收藏显示"白心"{smarty模版in_array}

  3、微信支付:从扫码支付改成公众号支付

 难点

1、微信登录curl{具体实现:微信开发文档(微信网页授权); 实例}

采集页面内容时,file_get_content函数总是不能生效,使用curl扩展来代替file_get_content,但是在访问https页面是仍可能无法访问,在设置选项时,需加上curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE)这句代码才能访问https页面,请参照如下代码封装curl:

  function get_url_contents($url)        //封装curl
    {
        // 1. 初始化
         $ch = curl_init();

         // 2. 设置选项,包括URL
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($ch, CURLOPT_HEADER, 0);    //不返回response头部信息 
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
         // 3. 执行并获取HTML文档内容
         $output = curl_exec($ch);

         // 4. 释放curl句柄
         curl_close($ch);
         return $output;
    }    

   推荐两篇文章:1、php中curl的详细解说  2、php读取网络文件 curl, fsockopen ,file_get_contents 几个方法的效率对比

 2、绑定原用户,更新微信账号与原账号数据

因为微信用户第一次登录时,相当于注册一个新用户,使用的是一个新的用户id。当微信用户要绑定电脑端已有的账号oldid时,需要将新用户id数据清除,并把新用户操作过的信息更新到oldid的信息当中,且将sessionx信息更新。一开始陷入思维误区,绑定原有账号,在users表中删除新用户数据信息时,微信用户的收藏、订单等信息无法更新。后来突然想到收藏表,订单表等关联的只是微信用户的id,只要将微信用户的id更新为原用户的id即可保持数据更新

elseif ($act == 'oldbind') {        //绑定原账户
    $username = (isset($_POST['username']) ? trim($_POST['username']) : '');
    $password = (isset($_POST['password']) ? trim($_POST['password']) : '');

    $oldid = $_SESSION['user_id'];    
    $wechat_id = $_SESSION['wid'];        //wid在登录时设置
    //防止再次绑定,判断用户名是否为手机号
    $sql = 'SELECT mobile_phone FROM ecs_users WHERE user_id = \'' .$oldid. '\'';
    $mobile_phone = $GLOBALS['db']->getOne($sql);
    
    if(strlen($mobile_phone) != 11){
        if ($user->login($username, $password, isset($_POST['remember']))) {
            //先将uesr表中id==ect_uid的删除  《=生成新的用户id
            $sql = 'DELETE FROM ecs_users WHERE user_id = \'' .$oldid. '\'';
            $GLOBALS['db']->query($sql);
            
            update_user_info();
            
            //将用户id更新到wechat_user表中ect_uid字段
            $sql = 'UPDATE ecs_wechat_user SET ect_uid = \'' .$_SESSION['user_id']. '\' where uid = \'' .$wechat_id. '\'';
            $res = $GLOBALS['db']->query($sql);
            /* 更新订单表 */
            $sql = 'UPDATE ecs_order_info SET user_id = \'' .$_SESSION['user_id']. '\' WHERE user_id = \'' .$oldid. '\'';
            $res = $GLOBALS['db']->query($sql);
            /* 更新收藏表 */
            $sql = 'UPDATE ecs_collect_goods SET user_id = \'' .$_SESSION['user_id']. '\' WHERE user_id = \'' .$oldid. '\'';
            $res = $GLOBALS['db']->query($sql);
            
            /*会员期限*/
            $time = gmtime();
                //微信用户的vip期限
            $sql = 'SELECT max(end_time) AS vip_time FROM ecs_vip_validity WHERE user_id="'.$oldid.'"';
            $end_time = $GLOBALS['db']->getOne($sql);
                //vip剩余期限
            $vip_time = $end_time - $time;
                //要绑定原用户的vip到期期限
            $sql = 'SELECT max(end_time) AS vip_time FROM ecs_vip_validity WHERE user_id="'.$_SESSION['user_id'].'"';
            $start_time = $GLOBALS['db']->getOne($sql);
                //检测vip_time与start_time是否为负数
            if($start_time <=0 || $vip_time <=0){
                $end_time = $start_time > $vip_time ? $start_time : $vip_time;
            }else{
                $end_time = $start_time + $vip_time;
            }
            
            $data['start_time'] = $start_time;
            $data['end_time'] = $end_time;
            $data['user_id'] = $_SESSION['user_id'];
            $data['create_time'] = $time;
            $res = $db->autoExecute($ecs->table('vip_validity'), $data, 'INSERT');
                //删除原账号vip
            $sql = 'DELETE FROM ecs_vip_validity WHERE user_id = \'' .$oldid. '\'';
            $GLOBALS['db']->query($sql);

            /* 更新收货地址 */
            $sql = 'UPDATE ecs_user_address SET user_id = \'' .$_SESSION['user_id']. '\' WHERE user_id = \'' .$oldid. '\'';
            $res = $GLOBALS['db']->query($sql);
            if($res){
                die(json_encode(array('code'=>0, 'msg'=>'绑定成功')));
            }else{
                die(json_encode(array('code'=>0, 'msg'=>'绑定失败')));
            }
            
        }
        else {
            $_SESSION['login_fail']++;
            die(json_encode(array('code'=>1, 'msg'=>'用户名或密码错误')));
        }
    }else{
        die(json_encode(array('code'=>2, 'msg'=>'账号已经绑定')));
    }   
}

3、微信支付时,js拉起支付失败,"调用支付jsapi缺少参数appid"

注:微信支付不能用测试号测试

 

  //调用微信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);
            }
        );
    }

 

  此时不能在invoke函数的第二个参数中直接传入json字符串,需要将json信息用对象方式重新拼接

function pay(pay_code, url) {
        //微信支付
        if (pay_code == 'wxpay') {
            $('.pay-btn').on('click', function(){                
                payJsonObj = JSON.parse(url); //转化成对象
                                
                jsApiCall();    
            });
        } //支付宝支付
        else if(pay_code == 'alipay') {
            $('.pay-btn').on('click', function(){
                location.href = url;
            })
        }
    }
    function jsApiCall()
    {
        WeixinJSBridge.invoke(
            'getBrandWCPayRequest',
            {
                "appId": payJsonObj.appId,
                "nonceStr": payJsonObj.nonceStr,
                "package": payJsonObj.package,
                "paySign": payJsonObj.paySign,
                "signType": payJsonObj.signType,
                "timeStamp": payJsonObj.timeStamp
            },
            function(res){
                if(res.err_msg == "get_brand_wcpay_request:ok") {    
                    change_order();
                    window.location.replace("userIndex.html?action=order");
                }else{
                    alert('支付失败');
                    //WeixinJSBridge.log(res.err_msg);
                    //alert(res.err_code+res.err_desc+res.err_msg);
                }    
            }
        );
    }

推荐:微信公众号支付开发全过程 --JAVA

 


相关文章

  • 我是一名项目经理,在过去的四个月里,我把一个项目带崩了(上线后频出问题,用户无法使用).在最近的几天,我每天都在反思自己,我都在问自己以下几个问题: 1.我做错了什么? 2.我在其中占有多重的因素? 以下内容,我将回答以上问题,并在最后说一 ...
  •     学者写博客已经三个月了,没写过啥技术文章,确实能力有限,还写不出技术文章来,只写了几篇总结和感悟.      时间飞逝,17年已经结束,想对17年总结一下:      17年可以说很重要的一年,毕竟是大学毕业年,结束了大学生活.   ...
  • 前言 本文也会在github上我的web-study仓库中同步更新,欢迎star. 戳这里,传送 准备工作 判断是否需要FQ或安装镜像,镜像一般可安装国内淘宝镜像,详情可看这里:cnpm npm install -g cnpm --regi ...
  • [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?
    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍.原版地址. 是除了官方文档外另 ...
  • 快三个月没写博客了,一直在忙着准备面试和去面试的路上,所以没时间写,也没什么想写的.现在告一段落,就总结一波! 面经 本人真的是双非一本.为什么加“真的”?因为有的人也写着"双非一本,进入阿里",但是某电子科技大学,比9 ...
  • 页面性能优化-原生JS实现图片懒加载
         在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的 ...

2020 cecdns.com webmaster#cecdns.com
12 q. 0.074 s.
京ICP备10005923号