项目新增功能与困难
概述:该项目已有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); } } ); }