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中与数组相关的函数
Mar 22 PHP
php 缓存函数代码
Aug 27 PHP
php获取post中的json数据的实现方法
Jun 08 PHP
基于Zend的Captcha机制的应用
May 02 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php实现水仙花数的4个示例分享
Apr 08 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
PHP模板引擎Smarty自定义变量调解器用法
Apr 11 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
Mar 31 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
php通过header发送自定义数据方法
Jan 18 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 PDO中文乱码解决办法
2009/07/20 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
浅谈js闭包理解
2019/04/01 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
vue+iview分页组件的封装
2020/11/17 Vue.js
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
numpy基础教程之np.linalg
2019/02/12 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
python是否适合网页编程详解
2019/10/04 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
Ejb技术面试题
2015/04/29 面试题
师范学院教师自荐书
2014/01/31 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
经典商业广告词
2014/03/13 职场文书
2014年少先队工作总结
2014/12/03 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
给下属加薪申请报告
2015/05/15 职场文书
Django 实现jwt认证的示例
2021/04/30 Python