项目总结-第一次外包项目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

时间: 2024-11-08 17:36:18

项目总结-第一次外包项目1-项目新增功能与困难的相关文章

Android Studio 第一次新建Android Gradle项目超级慢的解决方案

注: Android Studio 在第一次新建一个 Gradle 项目时需要下载 Gradle ,所以启动很慢( Gradle-bin 大约三十几兆),所以我们应该事先帮他下载好. 首先,我们下载好的 gradle - 版本号 -bin(|all).zip 应该放在哪儿呢. Gradle 有一个 user home ,默认是 C:\Users\[你当前的 用户名] \.gradle . 这个目录下面有四个子文件夹,我们要放到 wrapper\dists \[gradle- 版本号 -bin|a

【软件工程实践 &#183; 团队项目】 第一次作业

[软件工程实践 · 团队项目] 第一次作业 队员姓名与学号(标记组长) 学号 姓名 20165211 丁奕(组长) 20165208 孔月 20165230 田坤烨 20165226 刘香杉 队名 快奶我一口 队员风采: 全军出击!!!! 团队的首次合照 团队的特色描述 我们敲认真! 原文地址:https://www.cnblogs.com/KY-high/p/9000409.html

现代软件工程_团队项目_阿尔法阶段_前端及后端新增功能_v1.0.1_2017.11.29

前端及后端新增功能v1.0.2 本篇文章的后端功能由php实现,可在阿里云服务器上查看源代码 一.实现功能简介: 注册新用户 登录 检验是否登录 完善我的信息 发布我的自习 显示已有自习列表 翻页查看更多自习 二.具体实现 注册新用户 前端页面为regestered.html 1.表单信息 账号account 密码password 确认密码confirmPassword 昵称nickname 手机号码cellphonNumber 科大邮箱ustcEmail 验证码verificationCode

Asp.Net Core 项目实战之权限管理系统(6) 功能管理

0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计 3 Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL 4 Asp.Net Core 项目实战之权限管理系统(4) 依赖注入.仓储.服务的多项目分层实现 5 Asp.Net Core 项目实

Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计 3 Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL 4 Asp.Net Core 项目实战之权限管理系统(4) 依赖注入.仓储.服务的多项目分层实现 5 Asp.Net Core 项目实

Asp.Net Core 项目实战之权限管理系统(3) 功能及实体设计

0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计 3 Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL github源码地址 0 功能设计 实现一个最简单最基本的权限管理系统,主要包括组织机构管理.角色管理.用户管理.功能管理.角色授权.

如何有效的结束项目--对某税务MIS系统项目的经验总结

在<人月神话>开始的时候,作者Frederick P. Brooks Jr.写道:史前史中,没有别的场景比巨兽们在焦油坑中垂死挣扎的场面更令人震撼.上帝见证着恐龙.猛犸象.剑齿虎在焦油中挣扎.他们挣扎的越猛烈,焦油纠缠的就越紧,没有任何猛兽足够强壮或具有足够的技巧,能够挣脱束缚,他们最后都沉到了坑底. Frederick P. Brooks Jr.写下上面的文字,用以比喻我们的软件项目,一旦开始,就类似于各种动物在焦油坑中的挣扎.项目开始时的兴奋.激动迅速转变为对项目结束遥遥无期的诅咒和绝望.

P2P互联网金融平台项目SSM+Redis+Mysql+Bootstrap+JQuery项目实战

系统组成 p2p网贷系统可分为三部分: 一.网站前台 网站平台交易系统主要完成整个平台的借款操作.展示.投标等功能.主要功能包括:用户注册.登录.借款标详细信息展示.发布借款.投资借款标等,同时贷款方完成还款操作,前台功能主要操作者为平台用户. 二.个人账户 贷款者和投资者的个人管理中心平台.主要包括:个人资料管理.账户管理.借款标和投资标的管理以及明细.邮箱认证.实名认证.vip申请.在线充值和提现等等功能. 三.借贷交易 借贷交易系统后台支撑系统主要是对整个借贷交易系统进行管理.维护等功能,

iOS开发项目-02添加子控制器以及项目分层

iOS开发项目-02添加子控制器以及项目分层 一.添加子控制器 1.设置根控制器(自定义) 说明:分析新浪微博应用,观察其整体建构层次.而系统的控制器不能满足项目开发的需求,这里把项目中原有的控制器删除. 自己定义一个TabBarViewController类.让这个类作为window窗口的根控制器. YYAppDelegate.m文件代码: 1 #import "YYAppDelegate.h" 2 #import "YYTabBarViewController.h&quo