zoukankan      html  css  js  c++  java
  • 微信授权登录和微信分享

    <?php

    namespace appcommoncontroller;
    use appcommoncontrollerWechatAuth;

    class PortalBase extends Base
    {
    protected function _initialize()
    {
        parent::_initialize();
        $uid = cookie('uid');
        if(empty($uid)) {
           $this->auth();
          }
       $wechatClass = new WechatAuth();
       $wxConfig = $wechatClass->wxshare();
       $this->assign(['uid'=>$uid,'wxconfig'=>$wxConfig]);
    }

    private function auth(){
       $wechatClass = new WechatAuth();
       $users=$wechatClass->getAccessToken();
       $uid=db('user')->where(['openid'=>$users['openid']])->value('id');
       if($users){
          $this->baocun_uid($uid,$users);
       }
    }

    public function baocun_uid($uid,$users){
    if(!$uid){

    $uid=db('user')->insertGetId(['openid'=>$users['openid'],'nickname'=>$users['nickname'],'sex'=>$users['sex'],'city'=>$users['city'],'headimg'=>$users['headimgurl'],'jifen'=>$login_jifen,'pid'=>$fxuid,'create_time'=>time()]);

    }

       cookie('uid',$uid);
    }

    }

    ?>

     

     

    <?php
    namespace appcommoncontroller;

    class WechatAuth {
       private $appid = '';
       private $secret = '';
       private $requestCodeURL = 'https://open.weixin.qq.com/connect/oauth2/authorize';
    //微信授权登录
    public function getAccessToken()
    {
       $domain = request()->domain();
       $code = input('code');
       $url = rtrim($domain,'/').$_SERVER['REQUEST_URI'];
       if($code){
          $oauth2Url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$this->appid&secret=$this->secret&code=$code&grant_type=authorization_code";
          $oauth2 = json_decode(file_get_contents($oauth2Url),true);
       if (!isset($oauth2["access_token"])){
             return null;
       }
       $access_token = $oauth2["access_token"]; // 获得 access_token(获取用户信息的access_token) 和openid
       $openid = $oauth2['openid'];
       // 获取用户信息(不包含是否关注公众号字段 - subscribe)
       $get_user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";
       $userInfo = json_decode(file_get_contents($get_user_info_url),true);
       return $userInfo;
       }else{
          $codeUrl = $this->getRequestCodeURL($url,'oauth');
          header('Location:' . $codeUrl);
    }

    }
    //获取code
    public function getRequestCodeURL($redirect_uri, $state = null,$scope = 'snsapi_userinfo'){
       $query = array(
       'appid' => $this->appid,
       'redirect_uri' => $redirect_uri,
       'response_type' => 'code',
       'scope' => $scope,
    );
    if(!is_null($state) && preg_match('/[a-zA-Z0-9]+/', $state)){
       $query['state'] = $state;
    }
    $query = http_build_query($query);
       return "{$this->requestCodeURL}?{$query}#wechat_redirect";
    }

    //获取数据表里存的access_token(和授权登录不同)
    public function get_access_token(){
       $accessToken = db('access_token')->where('id',1)->find();
       if($accessToken){
          if($accessToken['stop_time'] > time()) return $accessToken['access_token'];
       else{
       $accessToken =$this->getAccessToken2();
       if(isset($accessToken['access_token'])){
          $data['access_token'] = $accessToken['access_token'];
          $data['stop_time'] = bcadd(7200,time(),0);
          db('access_token')->where('id',1)->update($data);
       }
    }
    }else{
       $accessToken =$this->getAccessToken2();
       if(isset($accessToken['access_token'])){
          $data['access_token'] = $accessToken['access_token'];
          $data['stop_time'] = bcadd(7200,time(),0);
          db('access_token')->insert($data);
       }
    }
       return $accessToken['access_token'];
    }
    //获取access_token(和授权登录不同)
    public function getAccessToken2(){
       $url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->secret;
       return json_decode(file_get_contents($url),true);
    }
    //获取access_token存入数据表
    public function getAccessToken3(){
       $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->secret;
       $accessToken = json_decode(file_get_contents($url),true);
       $data['access_token'] = $accessToken['access_token'];
       $data['stop_time'] = bcadd(7200,time(),0);
       db('access_token')->where('id',1)->update($data);
       return $accessToken['access_token'];
    }
    //获取数据表里存的ticket
    public function get_ticket(){
       $ticket = db('access_token')->where('id',1)->find();
       if($ticket){
          if($ticket['stop_time2'] > time()) return $ticket['ticket'];
       else{
          $ticket =$this->getTicket();
          if(isset($ticket['ticket'])){
          $data['ticket'] = $ticket['ticket'];
          $data['stop_time2'] = bcadd(7200,time(),0);
          db('access_token')->where('id',1)->update($data);
       }
    }
    }else{
       $ticket =$this->getTicket();
       if(isset($ticket['getTicket'])){
          $data['ticket'] = $ticket['ticket'];
          $data['stop_time2'] = bcadd(7200,time(),0);
          db('access_token')->insert($data);
       }
    }
       return $ticket['ticket'];
    }
    //获取ticket
    public function getTicket(){
       $accessToken =$this->get_access_token();
       $url='https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' .$accessToken. '&type=jsapi';
       return json_decode(file_get_contents($url),true);
    }
    //微信分享需要的参数
    public function wxshare(){
       $access_token =$this->get_access_token();
       $ticket =$this->get_ticket();
       $ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";
       $ticketJson = $this->requestGet($ticketUrl);
       $res2 = json_decode($ticketJson,true);
       $currentUrl = request()->url(true);
       $nonceStr = "";
       $time = time();
       $signature = sha1("jsapi_ticket=".$ticket."&noncestr=".$nonceStr."&timestamp=".$time."&url=".$currentUrl);
       $wxConfig = [
          'appId' => $this->appid,
          'timestamp' => $time,
          'nonceStr' => $nonceStr,
          'signature' => $signature,
       ];
       return $wxConfig;
    }
    public function requestGet($url){
       $ch = curl_init();
       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
       curl_setopt($ch, CURLOPT_URL, $url);
       $json = curl_exec($ch);
       curl_close($ch);
       return $json;
    }
    }

    ?>

    前端页面分享js:

    <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

    <script>

    //获取文章标题

    ftit = '{$setting.keywords}';

    //获取网页中内容的图片地址作为分享图

    flink = document.images[2].src;

    if(flink){

    lk = flink;

    }else{

    //获取网页中内容的图片地址作为分享图

    lk = document.images[1].src;

    }
    href = document.location.href.split("?")[0];
    link = href;
    desc = '描述';

    wx.config({

    debug: false,

    appId: '{$wxconfig.appId}', // 必填,公众号的唯一标识

    timestamp: '{$wxconfig.timestamp}', // 必填,生成签名的时间戳

    nonceStr: '{$wxconfig.nonceStr}', // 必填,生成签名的随机串

    signature: '{$wxconfig.signature}',// 必填,签名,见附录1

    jsApiList : [

    'updateTimelineShareData', //分享到朋友圈

    'updateAppMessageShareData', //分享给微信朋友

    ] // 必填,需要使用的JS接口列表

    });

    wx.ready(function () {

    // 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容

    wx.updateTimelineShareData({

    title: ftit, // 名

    link: link, // 地址

    imgUrl: lk, // 分享的图标

    success: function () {

    // 用户确认分享后执行的回调函数

    },

    cancel: function () {

    // 用户取消分享后执行的回调函数

    }

    });

    //自定义“分享给朋友”及“分享到QQ”按钮的分享内容

    wx.updateAppMessageShareData({

    title: ftit, // 名

    link: link, // 地址

    imgUrl: lk, // 分享的图标

    desc: desc, // 分享描述

    });

    });

    </script>

    如果 生命是场 寂寞的涡旋 不管 千回百转 方向不会偏
  • 相关阅读:
    提高代码质量:如何编写函数
    如何写自我评价
    写简历注意事项
    Android开发注意细节
    Android:onNewIntent()触发机制及注意事项
    Atom与markdown
    Java程序性能优化总结
    Java中的继承与组合
    Fragment生命周期总结
    C# 生成随机姓名
  • 原文地址:https://www.cnblogs.com/dwq521/p/14544255.html
Copyright © 2011-2022 走看看