thinkphp5结合mysql实现微信登录和自定义分享链接和图文

php代码

 

function curlHtml($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $output = curl_exec($ch);
    //释放curl句柄
    curl_close($ch);
    return $output;
}


class Wechat
{
    public $errmsg;
    
    //微信登录获取用户信息
    public function getUserInfo() {
        //1.准备scope为snsapi_base网页授权页面
        $redirect_url = config('system.site_url') . $_SERVER["REQUEST_URI"];
        $baseurl = urlencode($redirect_url);
        $snsapi_base_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . config('system.appid') . '&redirect_uri=' . $baseurl . '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect';
        //2.静默授权,获取code
        //页面跳转至redirect_uri/?code=CODE&state=STATE
        $code = input('code');
        if (!isset($code) || empty($code)) {
            header('Location:' . $snsapi_base_url);exit(0);
        }
        //3.通过code换取网页授权access_token和openID
        $curl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . config('system.appid') . '&secret=' . config('system.appsecret') . '&code=' . $code . '&grant_type=authorization_code';
        $content = curlHtml($curl);
        $result = json_decode($content, true);
        if(!isset($result['openid'])) {
            $this->errmsg = $result['errmsg'];return false;
        }
        $openid = $result['openid'];

        $userinfo = $this->getUserByOpenid($openid);

        return $userinfo;
    }

    private function getUserByOpenid($openid) {
        //获取access_token
        $token_info   = $this->curlGetWxAccessToken();
        $access_token = $token_info['value'];
        //通过OpenID来获取用户基本信息
        $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
        
        $content = curlHtml($url);
        $result = json_decode($content, true);
        return $result;
    }

    /**
     * [wxShare 微信分享]
     * @param  [type] $url [description]
     * @return [type]      [description]
     */
    public function wxShare()
    {
        $noncestr  = uniqid();
        $timestamp = time();
        $url = config('system.site_url') . $_SERVER["REQUEST_URI"]; 
        // $redis      = new \Redis;
        // $ticket_key = 'wx_ticket';
        // $ticket     = $redis->get($ticket_key);
        // if (!$ticket) {
        //     $ticket = $this->getJsapiTicket();
        //     $redis->set($ticket_key, $ticket);
        //     $redis->expire($ticket_key, 7200);
        // }
        $ticket = $this->getJsapiTicket();
        if ($ticket) {
            $str         = 'jsapi_ticket=' . $ticket . '&noncestr=' . $noncestr . '&timestamp=' . $timestamp . '&url=' . $url;
            $signature   = sha1($str);
            $return_data = [
                'noncestr'  => $noncestr,
                'timestamp' => $timestamp,
                'signature' => $signature,
                'appid'     => config('system.appid'),
                'link'      => $url,
            ];

            return $return_data;
        }
    }

    private function getJsapiTicket()
    {
        $map['keyname'] = 'Ticket';
        $map['modifytime'] = array('GT', time() - 7200);
        $return             = WxTokenModel::getOne('*', $map);
        if ($return) {
            return $return['value'];
        } else {
            $token_info   = $this->curlGetWxAccessToken();
            $access_token = $token_info['value'];
            $url          = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $access_token . '&type=jsapi';
            $output       = curlHtml($url);
            $data         = json_decode($output, true);
            if (isset($data['errcode']) && $data['errcode'] == 0) {
                $condition['keyname'] = 'Ticket';
                $update_data['modifytime'] = time();
                $update_data['value']      = $data['ticket'];
                $up_result           = WxTokenModel::updateData($condition, $update_data);
                if ($up_result !== false) {
                    return $data['ticket'];
                }
            }

        }

        return false;
    }

    private function curlGetWxAccessToken()
    {
        $map['keyname'] = 'AccessToken';
        $map['modifytime'] = array('GT', time() - 7200);
        $return = WxTokenModel::getOne('*', $map);
        if ($return) {
            return $return;
        } else {
            $url    = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . config('system.appid') . '&secret=' . config('system.appsecret');
            $output = curlHtml($url);

            $data = json_decode($output, true);
            if ($data && isset($data['access_token'])) {
                $condition['keyname'] = 'AccessToken';
                $update_data['modifytime']  = time();
                $update_data['value'] = $data['access_token'];
                $up_result            = WxTokenModel::updateData($condition, $update_data);
                if ($up_result !== false) {
                    return $update_data;
                }
            }
        }
        return false;
    }

}


html代码

 

 

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script>
wx.config({
      debug: false, 
      appId: '{$appid}', // 必填,公众号的唯一标识
      timestamp: '{$timestamp}', // 必填,生成签名的时间戳
      nonceStr: '{$noncestr}', // 必填,生成签名的随机串
      signature: '{$signature}',// 必填,签名,见附录1
      jsApiList: ['onMenuShareTimeline'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

wx.ready(function () {
    // 分享到朋友圈
    wx.onMenuShareTimeline({
      title: '', // 名
      link: '{$link}', // 地址
      imgUrl: '', // 分享的图标
      success: function () {
      // 用户确认分享后执行的回调函数
          
      },
      cancel: function () {
        // 用户取消分享后执行的回调函数
         
    }
    });
});
</script>

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值