微信第三方登录(原生)demo【必看篇】


Posted in PHP onMay 26, 2017

在一家ecstore二开公司有一段时间了,公司希望往自己研发产品上面走,一直在培养新人。

最近要自己去微信登录,自己就在ectore的框架基础上,写的原生微信第三方登录以此来熟悉微信第三方登录,在ecstore上面去写。

一个简单的demo,不是很好,分享给大家,希望能给想做微信第三方登录的朋友带来思路...

首先:

资料准备:

水印图片 28*28  png格式 公司logo
高清图片 108*108   png格式 公司logo

1.在微信开放平台 https://open.weixin.qq.com/中填写基本信息,
2.完成邮箱验证,
3.并完善开发者资料,注册成为开发者。
4.在“账号中心”完成开发者资质认证。
5.进入微信开放平台管理中心网站应用,点击“创建应用”按钮。
6.填写基本信息,完成点击下一步
7.填写平台信息
 应用签名:可在微信开发平台的资源中心》》资源下载》》中下载“签名生成工具”,用户获取已经安装到手机的第三方应用的签名。输入应用包名,即可获得该应用的签名值。
8.提交审核后,在7个工作日内腾讯将给出审核结果。(通常较快,几个小时就可反馈结果)

获取AppID,AppSecret,之后的处理:

需要在你想加的网站登录页给一个链接:<a href="https://open.weixin.qq.com/connect/qrconnect?appid=your appid &redirect_uri=http://www.sunmil.cn/passport-linshi.html&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect" rel="external nofollow" >微信登录</a>
<br><br>

处理微信登录开始

定义appid appsecert

private $appid = "your appid";
private $appsecert = "your appsecert";
private $redirect_uri = http://www.sunmil.cn/wxGetCode;

绑定账号页面

public function weixin(){
   //链接数据库
   $link = mysqli_connect(DB_HOST, DB_USER,DB_PASSWORD,DB_NAME ) or die('数据库连接失败4');
   $link = mysqli_connect('127.0.0.1', 'root','root', 'ec') or die('数据库连接失败');
   mysqli_set_charset($link,'utf8');
 
   //接收openid
   $openid = $_COOKIE['openid'];
 
   $sql = "select * from sdb_trustlogin_trustinfo where openid = '$openid' ";
   $res = mysqli_query($link, $sql);
   $row = mysqli_fetch_assoc($res);
 
   $this->pagedata['realname'] = $row['realname'];
   $this->pagedata['avatar'] = $row['avatar'];
 
   $this->page("site/passport/weixin.html");
 
 }

当第一次微信登录,处理绑定账号页面

public function handle($url=null){
    // $url = "http://www.sunmil.cn";
     //链接数据库
    $link = mysqli_connect(DB_HOST, DB_USER,DB_PASSWORD,DB_NAME ) or die('数据库连接失败3');
      mysqli_set_charset($link,'utf8');

      $post = utils::_filter_input($_POST);

    $userData = array(
      'login_account' => $post['uname'],
      'login_password' => $post['password']
    );

    $member_id = kernel::single('pam_passport_site_basic')->login($userData,$post['verifycode'],$msg);


    $b2c_members_model = $this->app->model('members');
    $member_point_model = $this->app->model('member_point');

    $member_data = $b2c_members_model->getList( 'member_lv_id,experience,point', array('member_id'=>$member_id) );
    
    $member_data = $member_data[0];
    $member_data['order_num'] = $this->app->model('orders')->count( array('member_id'=>$member_id) ); 

    $b2c_members_model->update($member_data,array('member_id'=>$member_id));
    $this->userObject->set_member_session($member_id);
    $this->bind_member($member_id);
    $this->set_cookie('loginName',$post['uname'],time()+31536000);//用于记住密码
    // setCartNum()需要传入一个参数
    $aCart = array();
    $this->app->model('cart_objects')->setCartNum($aCart);
    $url = $this->userPassport->get_next_page('pc');
    if( !$url ){
      $url = kernel::single('b2c_frontpage')->gen_url(array('app'=>'b2c','ctl'=>'site_member','act'=>'index'));
    }

    //查询数据库
    $uname = $_POST['uname'];
    $sql = "select * from sdb_pam_members where password_account = '$uname' ";
    $res = mysqli_query($link, $sql);
    $row = mysqli_fetch_assoc($res);
    $member_id = $row['member_id'];
    //链接数据库,插入数据
    $openid = $_COOKIE['openid'];
    $sql = "update sdb_trustlogin_trustinfo set member_id = ('{$member_id}') where openid = '{$openid}'";
    $res = mysqli_query($link, $sql); 

    if($res && mysqli_affected_rows($link) > 0){ 
      //删除cookie
      setcookie("openid", $openid, time()-3600);
      kernel::single('pam_lock')->flush_lock($member_id);
      $this->splash('success',$url,app::get('b2c')->_('登录成功'),true); 
    }else{
      echo '失败了';
    }
  }

处理绑定注册页面

public function weixin1(){
     //链接数据库
    $link = mysqli_connect(DB_HOST, DB_USER,DB_PASSWORD,DB_NAME ) or die('数据库连接失败2');
    mysqli_set_charset($link,'utf8');

    //接收openid
    $openid = $_COOKIE['openid'];

    $sql = "select * from sdb_trustlogin_trustinfo where openid = '$openid' ";
    $res = mysqli_query($link, $sql);
    $row = mysqli_fetch_assoc($res);

    $this->pagedata['realname'] = $row['realname'];
    $this->pagedata['avatar'] = $row['avatar'];
    $this->page("site/passport/weixin1.html");

  }

绑定注册页面

public function handle1($url=null){
    //链接数据库
    $link = mysqli_connect(DB_HOST, DB_USER,DB_PASSWORD,DB_NAME ) or die('数据库连接失败1');
    mysqli_set_charset($link,'utf8');

    $_POST = utils::_filter_input($_POST);
    
    $saveData = $this->userPassport->pre_signup_process($_POST);

    if( $member_id = $this->userPassport->save_members($saveData,$msg) ){
      $this->userObject->set_member_session($member_id);
      $this->bind_member($member_id);
      foreach(kernel::servicelist('b2c_save_post_om') as $object) {
        $object->set_arr($member_id, 'member');
        $refer_url = $object->get_arr($member_id, 'member');
      }

      /*注册完成后做某些操作! begin*/
      foreach(kernel::servicelist('b2c_register_after') as $object) {
        $object->registerActive($member_id);
      }
      /*end*/
      $data['member_id'] = $member_id;
      $data['uname'] = $saveData['pam_account']['login_account'];
      $data['passwd'] = $_POST['pam_account']['psw_confirm'];
      $data['email'] = $_POST['contact']['email'];
      $data['refer_url'] = $refer_url ? $refer_url : '';
      $data['is_frontend'] = true;
      $obj_account=$this->app->model('member_account');
      $obj_account->fireEvent('register',$data,$member_id);
      if(!strpos($_SESSION['pc_next_page'],'cart')){
        $url = $this->gen_url(array('app'=>'b2c','ctl'=>'site_passport','act'=>'sign_tips'));
      }else{
        $url = $_SESSION['pc_next_page'];
      }

      //会员注册成功,处理member_id 开始
      $login_name = $_POST["pam_account"]["login_name"];
      $sql = "select member_id from sdb_pam_members where password_account = '{$login_name}'";
      // echo $sql;
      $res = mysqli_query($link, $sql);
      $row = mysqli_fetch_assoc($res);
      $member_id = $row['member_id'];

      //链接数据库,插入数据
      $openid = $_COOKIE['openid'];
      $sql = "update sdb_trustlogin_trustinfo set member_id = ('{$member_id}') where openid = '{$openid}'";
      $res = mysqli_query($link, $sql); 

      if($res && mysqli_affected_rows($link) > 0){ 

         //删除cookie
        setcookie("openid", $openid, time()-3600);
        $this->splash('success',$url,app::get('b2c')->_('注册成功'),$ajax_request);
        }   
    //会员注册成功,处理member_id 结束
      $this->splash('failed',$back_url,app::get('b2c')->_('注册失败'),$ajax_request);
    }
  }

临时页面

public function linshi(){

    $code = $_GET['code'];
    $state = $_GET['state'];

    if($state === 'STATE'){
      $this->loginWeixin($code);
    }elseif($state === 'wxBind'){
      $this->bindWeixin($code);
    }else{
      return redirect("http://www.sunmil.cn");
    }
  }

loginWeixin

private function loginWeixin($code){

    //链接数据库
    $link = mysqli_connect('127.0.0.1', 'root','root', 'ec') or die('数据库连接失败');
    mysqli_set_charset($link,'utf8');

    $appid = $this->appid;
    $appsecert = $this->appsecert;
    $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$appsecert."&code=".$code."&grant_type=authorization_code";

    //curl模拟get请求,获取结果
    $res = $this->http_curl($url);
    //转化为数组
    $result = json_decode($res,true);
    $openid = $result['openid'];

    //openid存在,直接登录,openid不存在,先注册再登录
    $sql = "select openid from sdb_trustlogin_trustinfo";
    $res = mysqli_query($link, $sql);
    $row = mysqli_fetch_all($res);
      
    //foreach 判断
    foreach ($row As $v) {
      if(in_array($openid,$v,true)){
        //缺少登录信息

        $sql = "select member_id from sdb_trustlogin_trustinfo where openid = '{$openid}'";
        //查出member_id
        $res = mysqli_query($link, $sql);
        $row = mysqli_fetch_assoc($res);

        $member_id = $row['member_id'];
        //查出会员信息
        $sql = "select * from sdb_pam_members where member_id = '{$member_id}'";
        $res = mysqli_query($link, $sql);
        $row = mysqli_fetch_assoc($res);

        $login_name = $row['login_account'];

        //存入cookie 
        setcookie('UNAME',$login_name, time()+360000);
        echo "<script>window.location.href='http://www.sunmil.cn'</script>";
        exit;
      }
    }

    $access_token = $result['access_token'];
    //获取用户基本信息
    $getInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
    $userInfo = $this->http_curl($getInfoUrl);
    $trustinfo = json_decode($userInfo);

    //判断trustinfo表里面是否存在该条数据
    $openid   =  $trustinfo->openid;
    $nickname  =  $trustinfo->nickname; 
    $sex    =  $trustinfo->sex; 
    $city    =  $trustinfo->city; 
    $province  =  $trustinfo->province; 
    $country  =  $trustinfo->country; 
    $avatar   =  $trustinfo->headimgurl;
    $trust_source = 'trustlogin_plugin_weixin';
    //连接数据库,插入数据
    $sql = "insert into sdb_trustlogin_trustinfo (openid,realname,avatar,gender,province,city,trust_source) values ('{$openid}','{$nickname}','{$avatar}','{$sex}','{$province}','{$city}','{$trust_source}')";
    $res = mysqli_query($link, $sql); 

    if($res && mysqli_affected_rows($link) > 0){ 
       //存入cookie 
      setcookie('openid',$openid, time()+3600);
      header("Location:http://www.sunmil.cn/passport-weixin.html");
    }else{
      echo '失败了';
    }  
  }

curl模拟get请求

private function http_curl($url){
    $curlobj = curl_init();
    curl_setopt($curlobj, CURLOPT_URL, $url);
    curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curlobj, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curlobj, CURLOPT_SSL_VERIFYHOST, FALSE);

    $output = curl_exec($curlobj);
    curl_close($curlobj);

    return $output;
  }

处理微信登录结束

就可以实现微信登录了,当然了,一个简单熟悉微信第三登录的demo,有机会用tp框架分装完善一个完整的微信第三方登录。

欢迎留言,大家一起讨论。

以上这篇微信第三方登录(原生)demo【必看篇】就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP+DBM的同学录程序(2)
Oct 09 PHP
新闻分类录入、显示系统
Oct 09 PHP
PHP编实现程动态图像的创建代码
Sep 28 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
php 参数过滤、数据过滤详解
Oct 26 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 PHP
php 判断页面或图片是否经过gzip压缩的方法
Apr 05 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
php微信开发之谷歌测距
Jun 14 PHP
php提高脚本性能的4个技巧
Aug 18 PHP
php实现简易计算器
Aug 28 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 #PHP
老生常谈PHP面向对象之注册表模式
May 26 #PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 #PHP
Yii框架实现多数据库配置和操作的方法
May 25 #PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 #PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 #PHP
PHP 年月日的三级联动实例代码
May 24 #PHP
You might like
PHP的ASP防火墙
2006/10/09 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
2006/10/19 Javascript
javascript 多级checkbox选择效果
2009/08/20 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
pycharm安装图文教程
2017/05/02 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
python 实现单通道转3通道
2019/12/03 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
Django admin组件的使用
2020/10/24 Python
python调用百度API实现人脸识别
2020/11/17 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
法律进企业活动方案
2014/03/04 职场文书
民主评议党员总结
2014/10/20 职场文书
Python道路车道线检测的实现
2021/06/27 Python
JAVA API 实用类 String详解
2021/10/05 Java/Android