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 miniBB中文乱码问题解决方法
Nov 25 PHP
php下使用SimpleXML 处理XML 文件
Feb 27 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
Nov 07 PHP
用PHP实现 上一篇、下一篇的代码
Sep 29 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 PHP
PHP加密解密字符串汇总
Apr 26 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
php微信开发之音乐回复功能
Jun 14 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 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的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
django正续或者倒序查库实例
2020/05/19 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
期末考试动员演讲稿
2014/01/10 职场文书
给公司的建议书范文
2014/05/13 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
2019各种保证书范文
2019/06/24 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python