当前位置:

首页 > 编程开发 > 如何在ThinkPHP5中集成JS-SDK以实现微信自定义分享功能?

如何在ThinkPHP5中集成JS-SDK以实现微信自定义分享功能?

Jssdk类库1、文件名及位置名字:Jssdk.php位置:extend\util\Jssdk.php2、代码后台控制器处理微信事件响应//通过config接口注入权限验证配置wx.config({debug:false,appId:'{$data.appId}',timestamp:'{$data.timestamp}',nonceStr:'{$data.nonceStr}',signature:&#

本文目录

    Jssdk类库

    1、文件名及位置

    名字:Jssdk.php
    位置:extend\util\Jssdk.php

    2、代码

    appid . $this->secret);
            //定义存储文件路径
            // $filename = __DIR__ . '/cache/' . $name . '.php';
    		$filename = '../runtime/temp/' . $name . '.php';
            //判断文件是否存在,如果存在,就取出文件中的数据值,如果不存在,就向微信端请求
            if (is_file($filename) && filemtime($filename) + 7100 > time()){
                $result = include $filename;
                //定义需要返回的内容$data
                $data = $result['access_token'];
            }else{
                // https请求方式: GET
    			// https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
                // 调用curl方法完成请求
                $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret=' . $this->secret;
                $result = $this->curl($url);
                //将返回得到的json数据转成php数组
                $result = json_decode($result,true);
                //将内容写入文件中
                file_put_contents($filename,"");
                //定义需要返回的内容
                $data = $result['access_token'];
            }
    
            //将得到的access_token的值返回
            return $data;
    
        }
    
        /**
         *
         * 获取临时票据方法
         *
         * @return mixed
         */
        public function getJsapiTicket(){
            //存入文件中,定义文件的名称和路径
            $name = 'ticket_' . md5($this->appid . $this->secret);
            //定义存储文件路径
            //$filename = __DIR__ . '/cache/' . $name . '.php';
    		$filename = '../runtime/temp/' . $name . '.php';
            //判断是否存在临时票据的文件,如果存在,就直接取值,如果不存在,就发送请求获取并保存
            if (is_file($filename) && filemtime($filename) + 7100 > time()){
                $result = include $filename;
            }else{
                //定义请求地址
                $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$this
                        ->getAccessToken().'&type=jsapi';
                //使用curl方法发送请求,获取临时票据
                $result = $this->curl($url);
                //转换成php数组
                $result = json_decode($result,true);
                //将获取到的值存入文件中
                file_put_contents($filename,"");
    
            }
            //定义返回的数据
            $data = $result['ticket'];
            //将得到的临时票据结果返回
            return $data;
        }
    
        /**
         * 获取签名方法
         */
        public function sign(){
            //需要定义4个参数,分别包括随机数,临时票据,时间戳和当前url地址
            $nonceStr = $this->makeStr();
            $ticket = $this->getJsapiTicket();
            $time = time();
            //组合url
    		//$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
            $url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
            //将4个参数放入一个数组中
            $arr = [
                'noncestr=' . $nonceStr,
                'jsapi_ticket=' . $ticket,
                'timestamp=' . $time,
                'url=' . $url
            ];
            //对数组进行字段化排序
            sort($arr,SORT_STRING);
            //对数组进行组合成字符串
            $string = implode('&',$arr);
            //将字符串加密生成签名
            $sign = sha1($string);
            //由于调用签名方法的时候不只需要签名,还需要生成签名的时候的随机数,时间戳,所以我们应该返回由这些内容组成的一个数组
            $reArr = [
                'appId' => $this->appid,
                'timestamp' => $time,
                'nonceStr' => $nonceStr,
                'signature' => $sign,
                'url' => $url
            ];
            //将数组返回
            return $reArr;
        }
    
        /**
         *
         * 生成随机数
         *
         * @return string
         */
        protected function makeStr(){
            //定义字符串组成的种子
            $seed = 'www512wayanbao1qasxianrendong5tgblaochaguan8ik9500net';
            //通过循环来组成一个16位的随机字符串
            //定义一个空字符串 用来接收组合成的字符串内容
            $str = '';
            for ($i = 0;$i < 16; $i++){
                //定义一个随机数
                $num = rand(0,strlen($seed) - 1);
                //循环连接随机生成的字符串
                $str .= $seed[$num];
            }
            //将随机数返回
            return $str;
        }
    
    
        /**
         *
         * 服务器之间请求的curl方法
         *
         * @param $url 请求地址
         * @param array $field post参数
         * @return string
         */
        public function curl($url,$field = []){
            //初始化curl
            $ch = curl_init();
            //设置请求的地址
            curl_setopt($ch,CURLOPT_URL,$url);
            //设置接收返回的数据,不直接展示在页面
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
            //设置禁止证书校验
            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
            //判断是否为post请求方式,如果传递了第二个参数,就代表是post请求,如果么有传递,第二个参数为空,就是get请求
            if (!empty($field)){
                //设置请求超时时间
                curl_setopt($ch,CURLOPT_TIMEOUT,30);
                //设置开启post
                curl_setopt($ch,CURLOPT_POST,1);
                //传递post数据
                curl_setopt($ch,CURLOPT_POSTFIELDS,$field);
            }
            //定义一个空字符串,用来接收请求的结果
            $data = '';
            if (curl_exec($ch)){
                $data = curl_multi_getcontent($ch);
            }
            //关闭curl
            curl_close($ch);
            //将得到的结果返回
            return $data;
        }
    
    }
    //测试获取access_token值的方法
    //$obj = new Wx();
    //$data = $obj->getAccessToken();
    //echo $data;
    
    //测试获取jsapiticket方法
    //$obj = new Wx();
    //$data = $obj->getJsapiTicket();
    //echo $data;
    
    //测试生成签名方法
    //$obj = new Wx();
    //$data = $obj->sign();
    //echo '
    ';
    //print_r($data);
    
    ?>

    后台控制器处理

    where('id',$id)->find();
            $catinfo = getCatInfoById($catid);
            $p_catname = getCatInfoById($catinfo['parentid'],'catname');
    
    		$obj = new Jssdk();
    		$data = $obj->sign();
    
            $this->assign('infos',$info);
            $this->assign('catids',$catid);
            $this->assign('catnames',$catinfo['catname']);
            $this->assign('p_catnames',$p_catname);
    		$this->assign('data',$data);
    
            return view('../application/index/view/default/index/' . $modelInfo['show_template']);
        }
    }
    ?>

    微信事件响应

    
    
    	// 通过config接口注入权限验证配置
    	wx.config({
    		debug: false, 
    		appId: '{$data.appId}',
    		timestamp: '{$data.timestamp}',
    		nonceStr: '{$data.nonceStr}', 
    		signature: '{$data.signature}',
    		jsApiList: [
    			'onMenuShareTimeline',
    			'onMenuShareAppMessage'
    		]
    	});
    	// 通过ready接口处理成功验证
    	wx.ready(function(){
    		// 分享到朋友圈
    		wx.onMenuShareTimeline({
    			title: '{$info.title}',
    			link: '{$data.url}', 
    			imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', 
    			success: function () {
    				// 用户点击了分享后执行的回调函数
    			}
    		});
    		// 分享给朋友
    		wx.onMenuShareAppMessage({
    			title: '{$info.title}', 
    			desc: '{$info.description}', 
    			link: '{$data.url}', 
    			imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', 
    			type: 'link', // 分享类型,music、video或link,不填默认为link
    			dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
    			success: function () {
    				// 用户点击了分享后执行的回调函数
    			}
    		});
    	});
    

     全部分享接口

    
    
    	// 通过config接口注入权限验证配置
    	wx.config({
    		debug: true, 
    		appId: '{$data.appId}',
    		timestamp: '{$data.timestamp}',
    		nonceStr: '{$data.nonceStr}', 
    		signature: '{$data.signature}',
    		jsApiList: [
    			'onMenuShareTimeline',
    			'onMenuShareAppMessage',
    			'onMenuShareQQ',
    			'onMenuShareWeibo',
    			'onMenuShareQZone'
    		]
    	});
    	// 通过ready接口处理成功验证
    	wx.ready(function(){
    		// 分享到朋友圈
    		wx.onMenuShareTimeline({
    			title: '{$info.title}',
    			link: '{$data.url}', 
    			imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', 
    			success: function () {
    				// 用户点击了分享后执行的回调函数
    			}
    		});
    		// 分享给朋友
    		wx.onMenuShareAppMessage({
    			title: '{$info.title}', 
    			desc: '{$info.description}', 
    			link: '{$data.url}', 
    			imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', 
    			type: 'link', // 分享类型,music、video或link,不填默认为link
    			dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
    			success: function () {
    				// 用户点击了分享后执行的回调函数
    			}
    		});
    		// 分享到QQ
    		wx.onMenuShareQQ({
    			title: '{$info.title}', 
    			desc: '{$info.description}', 
    			link: '{$data.url}', 
    			imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', 
    			success: function () {
    				// 用户确认分享后执行的回调函数
    			},
    			cancel: function () {
    				// 用户取消分享后执行的回调函数
    			}
    		});
    		// 分享到腾讯微博
    		wx.onMenuShareWeibo({
    			title: '{$info.title}',
    			desc: '{$info.description}', 
    			link: '{$data.url}', 
    			imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', 
    			success: function () {
    				// 用户确认分享后执行的回调函数
    			},
    			cancel: function () {
    				// 用户取消分享后执行的回调函数
    			}
    		});
    		// 分享到QQ空间
    		wx.onMenuShareQZone({
    			title: '{$info.title}', 
    			desc: '{$info.description}', 
    			link: '{$data.url}', 
    			imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', 
    			success: function () {
    				// 用户确认分享后执行的回调函数
    			},
    			cancel: function () {
    				// 用户取消分享后执行的回调函数
    			}
    		});
    	});
    
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 thinkphp
    相关文章 更多
    thinkphp写接口代码的完整开发实例教程
    thinkphp写接口代码的完整开发实例教程

    本教程以ThinkPHP框架为例,通过文章管理API的具体业务场景,详细拆解路由定义、数据验证、控制器逻辑、数据模型操作、统一响应结构与全局异常处理的完整接口开发全流程。

    thinkphp项目部署指南详解服务器部署步骤
    thinkphp项目部署指南详解服务器部署步骤

    详细解析ThinkPHP项目在Linux服务器上的部署步骤,包括环境搭建、文件权限、Nginx配置及常见陷阱,提供可复制的代码示例与例外场景分析。

    为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】
    为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】

    ThinkPHP6.0模型关联返回null的常见原因包括:with闭包遗漏外键和主键字段、嵌套预加载语法不兼容低版本、关联方法内部误用with或field导致数据失控,以及全局作用域与软删除未显式处理。通过检查SQL日志、显式声明关键字段、升级版本或改用正确语法、清理关联方法中的查询条件即可解决。

    TP6.0 构建支持断点续传的超大附件上传服务【分片】
    TP6.0 构建支持断点续传的超大附件上传服务【分片】

    在ThinkPHP6.0中实现支持断点续传的超大附件上传,采用分片上传方案。前端按2MB切片并生成唯一chunkId,通过GET请求校验已传分片,用localStorage持久化上传状态。后端控制器接收分片存储,创建upload_status表管理进度,合并时加文件锁并校验MD5,确保生产环境下的可靠性与性能。

    thinkphp排序怎么实现动态排序 开发技巧解析
    thinkphp排序怎么实现动态排序 开发技巧解析

    动态排序时,order()应置于查询链式调用中且必须在paginate()之前;字段和方向需通过白名单硬校验,使用数组语法防SQL注入;分页调用appends()传递参数;多字段排序用关联数组,确保安全稳定。

    TP6.0 复杂业务逻辑下事务嵌套的回滚陷阱【DBA】
    TP6.0 复杂业务逻辑下事务嵌套的回滚陷阱【DBA】

    在复杂业务逻辑中,事务嵌套的回滚问题一直是ThinkPHP开发者容易踩的坑,尤其是TP6.0版本。先说核心结论:TP6.0并不支持真正意义上的嵌套事务。很多人以为调用两次Db::transaction()就能在内部自动管理回滚,实际上这只是一层“伪装”——内层事务的提交或回滚操作会被直接忽略,异常也

    thinkphp排序怎么实现倒序排列 教程简单易懂
    thinkphp排序怎么实现倒序排列 教程简单易懂

    ThinkPHP 实现倒序排列,说穿了就是 order() 方法配合 desc 方向,一句话的事儿,根本不需要什么复杂的循环或额外逻辑。 来看看最直接的方式:用 order('字段名 desc') 搞定。这招的好处是数据库层直接干活,效率高,逻辑也清晰。比如你想让文章列表按照发布时间从新到旧排,那就

    TP5.1 项目接入 LDAP 实现后台管理员统一认证【企业】
    TP5.1 项目接入 LDAP 实现后台管理员统一认证【企业】

    在企业系统逐渐转向统一身份认证的背景下,ThinkPHP 5.1 项目接入 LDAP 实现后台管理员统一认证,是不少团队正在推进的标准化改造。核心思路并不复杂——把框架默认基于数据库的账号校验逻辑彻底换掉,让登录请求直接交给企业 LDAP 目录服务来完成验证。说白了,不是简单改个密码字段,而是要重构

    TP5.1 项目启用 HttpOnly 防范 XSS 攻击【安全头】
    TP5.1 项目启用 HttpOnly 防范 XSS 攻击【安全头】

    在基于TP5.1框架的项目开发中,通过全局配置Cookie的HTTP只读属性、手动设置特定Cookie、修改PHP配置文件强制会话Cookie启用HTTP只读属性,并结合跨站脚本攻击入口过滤,能够有效地防范跨站脚本攻击窃取Cookie,形成多层次纵深防御体系。

    thinkphp排序如何按创建时间排序 配置指南
    thinkphp排序如何按创建时间排序 配置指南

    ThinkPHP中按创建时间排序可通过order()方法实现,支持固定排序、多字段组合及带GET参数的动态排序。分页时需传递query参数保持页码。按天聚合可使用orderRaw()配合DATE_FORMAT函数。对于数组数据,可用array_multisort或usort结合strtotime进行排序。时间格式需统一。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。