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获取网卡地址的代码
Apr 09 PHP
PHP 获取客户端真实IP地址多种方法小结
May 15 PHP
优化php效率,提高php性能的一些方法
Mar 24 PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 PHP
php实现短信发送代码
Jul 05 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
php实现简单爬虫的开发
Mar 28 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
PHP基本语法实例总结
Sep 09 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 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
ThinkPHP空模块和空操作详解
2014/06/30 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
javascript 数组操作详解
2015/01/29 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
微信小程序实现banner图轮播效果
2020/06/28 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
Python 40行代码实现人脸识别功能
2017/04/02 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
高考自主招生自荐信
2013/10/20 职场文书
心得体会怎么写
2013/12/30 职场文书
庆元旦广播稿
2014/02/10 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
2014全年工作总结
2014/11/27 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle
德劲DE1102数字调谐收音机机评
2022/04/07 无线电