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函数 serialize()和unserialize()
Feb 04 PHP
php牛逼的面试题分享
Jan 18 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
Oct 26 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
Sep 04 PHP
PHP文件操作方法汇总
Jul 01 PHP
php实现zip文件解压操作
Nov 03 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
PHP的mysqli_select_db()函数讲解
Jan 23 PHP
tp5.1 框架数据库-数据集操作实例分析
May 26 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
May 27 PHP
laravel添加角色和模糊搜索功能的实现代码
Jun 22 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实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
jquery一句话全选/取消全选
2011/03/01 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
Django框架验证码用法实例分析
2019/05/10 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
python语言的优势是什么
2020/06/17 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
师范生自荐信范文
2013/10/06 职场文书
大专生简历的自我评价
2013/11/26 职场文书
春节请假条
2014/04/11 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
法人授权委托书范本
2014/09/17 职场文书
天坛导游词
2015/02/02 职场文书
地道战观后感2000字
2015/06/04 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫