項目新增功能與困難php
概述:該項目已有PC端網站;項目需求:修改部分PC端網站功能;實現手機端網站(只爲微信用戶服務)html
實現的新功能以下:sql
PC端json
一、管理:增長了添加客服二維碼{當上傳新的客服圖片選擇「是」顯示在頁面時,會將其餘原「是」的數據設置爲「否」}、手機輪播圖、手機廣告管理api
二、會員列表增長按vip日期排序微信
三、增長會員發佈做品,選擇是否發佈到款式庫功能,後臺增長此項管理網絡
手機端 【主要】session
一、微信登陸、綁定新舊用戶{綁定原用戶時,更新用戶信息,會員期限信息,會員收藏信息,會員地址信息,會員訂單信息}微信開發
二、收藏功能:瀏覽顯示已收藏信息與收藏量,已收藏顯示"紅心",取消收藏顯示"白心"{smarty模版in_array}app
三、微信支付:從掃碼支付改爲公衆號支付
難點
一、微信登陸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; }
推薦兩篇文章:一、php中curl的詳細解說 二、php讀取網絡文件 curl, fsockopen ,file_get_contents 幾個方法的效率對比
二、綁定原用戶,更新微信帳號與原帳號數據
由於微信用戶第一次登陸時,至關於註冊一個新用戶,使用的是一個新的用戶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'=>'帳號已經綁定'))); } }
三、微信支付時,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); } } ); }