Ver código fonte

debug wechat author

stanley-king 8 anos atrás
pai
commit
d18314f2f1

+ 54 - 0
helper/login_helper.php

@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2017/4/26
+ * Time: 下午10:08
+ */
+class login_helper
+{
+    private static $fields = 'member_id,member_mobile,member_wxopenid,member_name,member_truename,member_signname,' .
+    'member_nickname,member_avatar,member_sex,member_birthday,member_passwd,member_paypwd,member_email,member_mobile_bind,member_state';
+
+    public function __construct()
+    {
+    }
+
+    public function wechat_login($openid)
+    {
+        $mod_member = Model('member');
+        $minfo = $mod_member->getMemberInfo(['member_wxopenid' =>$openid],self::$fields);
+        if(empty($minfo)) {
+            return false;
+        }
+        else {
+            $mod_member->createSession($minfo);
+            Model('cart')->mergecart($minfo, $_SESSION['store_id']);
+            Model('goods_browse')->mergebrowse($_SESSION['member_id'], $_SESSION['store_id']);
+            account_helper::onLogin($_SESSION['member_id']);
+            session::instance()->set_cookie($_SESSION['MPHPSESSID']);
+            return true;
+        }
+    }
+
+    public function bind_wechat($user_info)
+    {
+        $mod_member = Model('member');
+
+        $update['member_nickname'] = $user_info['nickname'];
+        $update['member_wxopenid'] = $user_info['openid'];
+        $update['member_avatar'] = $user_info['headimgurl'];
+        $update['member_sex'] = intval($user_info['sex']);
+
+        $ret = $mod_member->editMember(array('member_id' => $_SESSION['member_id']), $update);
+        if($ret == true) {
+            $_SESSION['member_nickname'] = $update['member_nickname'];
+            $_SESSION['member_wxopenid'] = $update['member_wxopenid'];
+            $_SESSION['member_avatar']   = $update['member_avatar'];
+            $_SESSION['member_sex']      = $update['member_sex'];
+        }
+
+        return $ret;
+    }
+}

+ 26 - 3
helper/session.php

@@ -177,7 +177,7 @@ class session
         if($this->fdestroy) {
             dcache($this->sessid,self::prefix);
         } else {
-            wcache($this->sessid,array(self::session_name => $data),self::prefix,$this->expire_min());
+            wcache($this->sessid,array(self::session_name => $data),self::prefix,self::expire_min());
         }
 
         return true;
@@ -193,7 +193,7 @@ class session
 
     public function set_cookie($sid)
     {
-        $expire_time = time() + $this->expire_min() * 60;
+        $expire_time = time() + self::expire_min() * 60;
         if(is_localdebug()) {
             fcgi_setcookie("MPHPSESSID","{$sid}",$expire_time,'/',LOCAL_DOMAIN);
         } else {
@@ -201,7 +201,7 @@ class session
         }
     }
 
-    private function expire_min()
+    private static function expire_min()
     {
         if(is_debug()) {
             return 43200;
@@ -209,4 +209,27 @@ class session
             return 43200;
         }
     }
+
+    static public function read_other_session($sid)
+    {
+        $data = rcache($sid,self::prefix);
+        $org = $_SESSION;
+        $_SESSION = [];
+        if(session_decode($data[self::session_name]) == true) {
+            $data = $_SESSION;
+            $_SESSION = $org;
+            return $data;
+        } else {
+            $_SESSION = $org;
+            return false;
+        }
+    }
+    static public function write_other_session($sid,$data)
+    {
+        $org = $_SESSION;
+        $_SESSION = $data;
+        $data = session_encode();
+        wcache($sid,array(self::session_name => $data),self::prefix,self::expire_min());
+        $_SESSION = $org;
+    }
 }

+ 40 - 0
helper/session_helper.php

@@ -10,6 +10,7 @@ require_once (BASE_ROOT_PATH . '/helper/algorithm.php');
 require_once (BASE_ROOT_PATH . '/helper/relation_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/account_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/push_helper.php');
+require_once (BASE_ROOT_PATH . '/helper/login_helper.php');
 
 class session_helper
 {
@@ -278,4 +279,43 @@ class session_helper
     static public function session_id() {
         return empty($_SESSION['MPHPSESSID']) ? "" : $_SESSION['MPHPSESSID'];
     }
+
+    static public function need_wechat_author()
+    {
+        if(util::from_wechat() == false) {
+            return false;
+        }
+        else
+        {
+            if(array_key_exists('wx_author',$_SESSION))
+            {
+                if(array_key_exists('handled',$_SESSION['wx_author']))
+                {
+                    $user_info = $_SESSION['wx_author']['user_info'];
+                    $loginer = new login_helper();
+                    if(self::logined()) {
+                        $loginer->bind_wechat($user_info);
+                        unset($_SESSION['wx_author']);
+                    }
+                    else
+                    {
+                        if($loginer->wechat_login($user_info['openid']) == true)
+                        {
+                            $loginer->bind_wechat($user_info);
+                            unset($_SESSION['wx_author']);
+                        }
+                    }
+                }
+
+                return false;
+            }
+
+            if(!empty($_SESSION['member_wxopenid'])) {
+                return false;
+            }
+            else {
+                return true;
+            }
+        }
+    }
 }

+ 0 - 4
helper/third_author/wxauthor.php

@@ -34,17 +34,14 @@ class wxauthor
     public function enter()
     {
         $back_url = BASE_SITE_URL . '/mobile/wxauthor.php';
-        Log::record("redirect_uri={$back_url}",Log::DEBUG);
         $params = ['appid' => self::appid,
             'redirect_uri' => $back_url,
             'response_type' => 'code',
             'scope' => 'snsapi_userinfo',
             'state' => $_SESSION['MPHPSESSID']];
-
         $ref_url = util::http_add_params(self::authorize_url,$params);
         $ref_url .= '#wechat_redirect';
 
-        Log::record("url={$ref_url}",Log::DEBUG);
         fcgi_header("location:{$ref_url}");
     }
 
@@ -90,7 +87,6 @@ class wxauthor
 
     private function user_info()
     {
-        //access_token='.$info['access_token'].'&openid='.$info['openid'].'&lang=zh_CN
         $params = ['access_token' => $this->mAccessToken,'openid' => $this->mOpenID,'lang' => 'zh_CN'];
         $res = http_request(self::userinfo_url,$params);
         if($res == false) return false;

+ 6 - 0
helper/util_helper.php

@@ -123,4 +123,10 @@ class util
 
         return $url;
     }
+    public static function from_wechat()
+    {
+        $agent = request_helper::http_useragent();
+        $pos = strpos($agent,"MicroMessenger");
+        return ($pos >= 0);
+    }
 }

+ 7 - 0
mobile/control/fcode.php

@@ -25,6 +25,13 @@ class fcodeControl extends mobileControl
         $status = intval($_GET['status']);
         $mobile = $_GET['mobile'];
 
+        if(session_helper::need_wechat_author()) {
+            $author = new thrid_author\wxauthor();
+            //$url = BASE_SITE_URL . "/mobile/index.php?act=fcode&op=index&common_id={$common_id}&batch_code={$batch_code}";
+            $author->enter();
+            return;
+        }
+
         if($common_id <= 0 || empty($batch_code)) {
             return self::outerr(errcode::ErrParamter,"错误的参数","fcode/error");
         }

+ 6 - 2
mobile/control/index.php

@@ -63,9 +63,13 @@ class indexControl extends specialControl
 
     public function wxauthorOp()
     {
+//        $_SESSION['xxxx'] = 0;
+//        $data = session::read_other_session($_SESSION['MPHPSESSID']);
+//        $data['nameis'] = 'YYYY';
+//        session::write_other_session($_SESSION['MPHPSESSID'],$data);
+
+        util::from_wechat();
         \thrid_author\wxauthor::enter();
-//        $url = BASE_SITE_URL . '/mobile/api/wxLogin/index.php';
-//        fcgi_header("location:{$url}");
         return self::outsuccess(null,'','wap');
     }
 

+ 15 - 2
mobile/wxauthor.php

@@ -7,6 +7,7 @@
  */
 
 require_once (BASE_ROOT_PATH . '/helper/third_author/wxauthor.php');
+require_once (BASE_ROOT_PATH . '/helper/session.php');
 
 ini_set('date.timezone','Asia/Shanghai');
 error_reporting(E_ERROR);
@@ -15,10 +16,22 @@ echo "hell world.";
 
 $code = $_GET['code'];
 if(empty($code)) {
-
+    Log::record("没有同意授权");
 }
 else
 {
     $author = new \thrid_author\wxauthor();
-    $author->callback($code);
+    $user_info = $author->callback($code);
+    if($user_info == false)
+    {
+        Log::record("微信取到的信息为空",Log::DEBUG);
+    }
+    else
+    {
+        $sid = $_GET['state'];
+        $data = session::read_other_session($sid);
+        $data['wx_author']['user_info'] = $user_info;
+        $data['wx_author']['handled'] = false;
+        session::write_other_session($sid,$data);
+    }
 }

+ 5 - 1
test/TestAuthor.php

@@ -23,6 +23,10 @@ class TestAuthor extends PHPUnit_Framework_TestCase
     {
         $author = new thrid_author\wxauthor();
         $author->enter();
-
+    }
+    public function testOrigin()
+    {
+        $val = 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN';
+        $pos = strpos($val,"MicroMessenger");
     }
 }