thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例


Posted in PHP onAugust 13, 2019

本文实例讲述了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 . '×tamp=' . $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>

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
一棵php的类树(支持无限分类)
Oct 09 PHP
提升PHP执行速度全攻略
Oct 09 PHP
处理php自动反斜杠的函数代码
Jan 05 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
php简单实现批量上传图片的方法
May 09 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 PHP
php实现留言板功能
Mar 05 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
php+js实现点赞功能的示例详解
Aug 07 PHP
php实现的表单验证类完整示例
Aug 13 #PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 #PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 #PHP
Laravel如何同时连接多个数据库详解
Aug 13 #PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
Aug 12 #PHP
php链式操作的实现方式分析
Aug 12 #PHP
基于PHP实现微信小程序客服消息功能
Aug 12 #PHP
You might like
用PHP实现递归循环每一个目录
2010/08/08 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
获取URL文件名后缀
2013/10/24 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
JS与框架页的操作代码
2010/01/17 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
Node.js实现文件上传
2016/07/05 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
js数组去重的hash方法
2016/12/22 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
node的process以及child_process模块学习笔记
2018/03/06 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
分享6个隐藏的python功能
2017/12/07 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
python实现接口并发测试脚本
2019/06/25 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
python实现梯度下降法
2020/03/24 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
机械设计专业应届生求职信
2013/11/21 职场文书
校园安全教育广播稿
2014/02/17 职场文书
节能环保演讲稿
2014/08/28 职场文书
运动会广播稿100字
2014/09/14 职场文书
城管年度个人总结
2015/02/28 职场文书
大学生暑期实践报告
2015/07/13 职场文书
python实现会员信息管理系统(List)
2022/03/18 Python