博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thinkphp5.0 + 微信分享
阅读量:4509 次
发布时间:2019-06-08

本文共 8472 字,大约阅读时间需要 28 分钟。

因为是做微信公众号好友助力的活动和游戏,所以有个需要分享的页面,判定谁分享出去的,然后谁帮助了好友,和之前获取userinfo的一起贴出来.

1.入口文件(名字随便取,你开心就好.下面只贴文件里的方法)

//获取用户头像和微信号    public  function getUserInfo(){//        $appid='wxa037f5cede358c84';//        $appsecret='e4cdd89734bae590bce8abbcfda82940';        $app = Db::name('wxconf')->where('id=1')->find();        $appid = $app['appid'];        $appsecret = $app['appsecret'];        if(!$appid || !$appsecret){            self::alter("请配置appid和appsecret");exit;        }            $request=Request::instance();            $code=$request->param('code');            if (!$code) {                header("Content-type: text/html; charset=utf-8");                $redirect_url='http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];                $this->redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid={
$appid}&redirect_uri={
$redirect_url}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"); } else { $code = $request->param('code'); $tokenurl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={
$appid}&secret={
$appsecret}&code={
$code}&grant_type=authorization_code"; $token = $this->http_get($tokenurl); $tokenobj = json_decode($token); $access_token = $tokenobj->access_token; $openid = $tokenobj->openid; if(!$access_token || !$openid){ self::alter($tokenobj->errmsg);exit; } $userurl = "https://api.weixin.qq.com/sns/userinfo?access_token={
$access_token}&openid={
$openid}&lang=zh_CN"; $info = $this->http_get($userurl); $infoobj = json_decode($info); $data['openid'] = $openid; $data['username'] = $infoobj->nickname; $data['avatar'] = $infoobj->headimgurl; session('userInfo',$data); } } public function http_get($url){ $ch = curl_init($url) ; curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//https curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//https curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ; $output = curl_exec($ch) ; curl_close($ch); return $output; } public function alter($msg){ echo <<
EOF; } //获取验证access_token function access_token($appid,$appsecret,$access_token,$access_token_time,$expires_in) { //判断access_token有效期) if((time()-$access_token_time)>=$expires_in) { //接口地址http请求方式: GET $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret"; $retdate= $this->curl_get($url); //判断获取access_token $access_token= json_decode($retdate,true); if($access_token['access_token']!='' && $access_token['expires_in']>0) { //修改数据库 $conf = Db::name('wxconf'); $data['access_token'] = $access_token['access_token']; $data['access_token_time'] = time(); $data['expires_in'] = $access_token['expires_in']-3600; $i = $conf->where('id=1')->update($data); if($i) { } else { exit('数据库写入access_token失败!'); } } else { exit($retdate); } } } //获取验证jsapi_ticket function jsapi_ticket($access_token,$jsapi_ticket,$jsapi_ticket_time,$jsexpires_in) { //判断jsapi_ticket有效期) if((time()-$jsapi_ticket_time)>=$jsexpires_in) { //接口地址http请求方式: GET $url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$access_token&type=jsapi"; $retdate= $this->curl_get($url); //判断获取jsapi_ticket $jsapi_ticket= json_decode($retdate,true); if($jsapi_ticket['errcode']=='0') { //修改数据库 $conf = Db::name('wxconf'); $data['jsapi_ticket'] = $jsapi_ticket['ticket']; $data['jsapi_ticket_time'] = time(); $data['jsexpires_in'] = $jsapi_ticket['expires_in']; $i = $conf->where('id=1')->update($data); if($i) { return $jsapi_ticket['ticket']; } else { exit('数据库写入access_token失败!'); } } else { exit($retdate); } } else { return $jsapi_ticket; } } //提交方法GET function curl_get($url) { $ch = curl_init (); curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'GET' ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false ); curl_setopt ( $ch, CURLOPT_URL, $url ); ob_start (); curl_exec ( $ch ); $return_content = ob_get_contents (); ob_end_clean (); $return_code = curl_getinfo ( $ch, CURLINFO_HTTP_CODE ); return $return_content; } //提交方法POST function curl_post($url,$post_data) { //初始化 $curl = curl_init(); //设置抓取的url curl_setopt($curl, CURLOPT_URL,$url); //设置头文件的信息作为数据流输出 curl_setopt($curl, CURLOPT_HEADER, 1); //设置获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //设置post方式提交 curl_setopt($curl, CURLOPT_POST, 1); //设置post数据 /* $post_data = array( "username" => "coder", "password" => "12345" );*/ //关闭SSL认证 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); //提交数据 curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); //执行命令 $data = curl_exec($curl); if(curl_errno($curl)) { return 'errno'.curl_error($curl); } else { //显示获得的数据 return $data; } }

2. 页面的方法

public function index(){
$openid=session('userInfo.openid');//当前用户的openid //分享配置 $share =new Weixin();//上面贴的方法文件 $conf = Db::name('wxconf');//实例化表格 以下是表格内容 $data = $conf->where('id=1')->find(); $appid = $data['appid']; $appsecret = $data['appsecret']; $access_token = $data['access_token']; $access_token_time= $data['access_token_time']; $expires_in = $data['expires_in']; $jsapi_ticket = $data['jsapi_ticket']; $jsexpires_in = $data['jsexpires_in']; $jsapi_ticket_time= $data['jsapi_ticket_time']; //获取验证access_token $returns = $share->access_token($appid,$appsecret,$access_token,$access_token_time,$expires_in); if($returns==1) { $data = $conf->where('id=1')->find(); $jsapi_ticket = $data['jsapi_ticket']; $jsexpires_in = $data['jsexpires_in']; $jsapi_ticket_time = $data['jsapi_ticket_time']; } $jsapi_ticket = $share->jsapi_ticket($access_token,$jsapi_ticket,$jsapi_ticket_time,$jsexpires_in); $noncestr = $this->create_chr(16); $timestamp= time(); // 注意 URL 一定要动态获取,不能 hardcode. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $signstr ='jsapi_ticket='.$jsapi_ticket.'&noncestr='.$noncestr.'&timestamp='.$timestamp.'&url='.$url; $signature =sha1($signstr); $this->assign('appid',$appid); $this->assign('signature',$signature); $this->assign('nonceStr',$noncestr); $this->assign('timestamp',$timestamp); //分享内容 $wxshare = Db::name('info');//实例化信息表 里面有活动分享的标题 链接 图片 描述 $share = $wxshare->where('id=1')->find(); $this->assign('title',$share['wx_share_title']);//分享标题 $this->assign('links',$share['wx_share_url'].'?openid='.$openid);//分享链接 $imgurl = $protocol.$share['src'].UPLOADS_IMG.$share['wx_share_pic'];//分享图片链接 $this->assign('imgurl',$imgurl); $this->assign('descs',$share['wx_share_draw']);//分享描述 return $this->fetch();// } }

 

3.view上的js

用了layui 没用的可以自己改成alert 这个无所谓

 

转载于:https://www.cnblogs.com/gushengyan/p/9012757.html

你可能感兴趣的文章
ES6 symbol
查看>>
vue 坑
查看>>
js手写call函数
查看>>
Object.prototype.toString.call(obj) 为什么有用以及疑惑点
查看>>
小程序生成二维码,海报
查看>>
.NET Core 原生动态代理
查看>>
.net core 拦截器的使用
查看>>
sqlyog 下载
查看>>
动态WebAPI实现原理
查看>>
ACM-ICPC 2015 Changchun Preliminary Contest——J题
查看>>
CF1214D Treasure Island
查看>>
关于分页的一些前后台知识与应用
查看>>
Visual Studio中的快捷键
查看>>
Mac下显示和隐藏“隐藏文件”
查看>>
Chessboard POJ - 2446(最大流 || 匹配)
查看>>
Warning: Cannot modify header information原因及解决方案
查看>>
Python ConfigParser模块
查看>>
程序员的学习和积累
查看>>
.net实现支付宝在线支付
查看>>
centos7 swoole 三步搞定全部
查看>>