項目總結-第一次外包項目1-項目新增功能與困難 微信公衆號支付開發全過程 --JAVA

項目新增功能與困難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);
                }    
            }
        );
    }

推薦:微信公衆號支付開發全過程 --JAVA

相關文章
相關標籤/搜索