ThinkPHP5怎么集成JS-SDK實(shí)現(xiàn)微信自定義分享功能
May 27, 2023 am 08:07 AMJssdk類庫
1、文件名及位置
名字:Jssdk.php
位置:extend\util\Jssdk.php
2、代碼
<?php namespace util; class Jssdk { protected $appid = 'xxxx'; protected $secret = 'xxxx'; /** * 獲取access_token方法 */ public function getAccessToken(){ //定義文件名稱 $name = 'token_' . md5($this->appid . $this->secret); //定義存儲(chǔ)文件路徑 // $filename = __DIR__ . '/cache/' . $name . '.php'; $filename = '../runtime/temp/' . $name . '.php'; //判斷文件是否存在,如果存在,就取出文件中的數(shù)據(jù)值,如果不存在,就向微信端請求 if (is_file($filename) && filemtime($filename) + 7100 > time()){ $result = include $filename; //定義需要返回的內(nèi)容$data $data = $result['access_token']; }else{ // https請求方式: GET // https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET // 調(diào)用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數(shù)據(jù)轉(zhuǎn)成php數(shù)組 $result = json_decode($result,true); //將內(nèi)容寫入文件中 file_put_contents($filename,"<?php\nreturn " . var_export($result,true) . ";\n?>"); //定義需要返回的內(nèi)容 $data = $result['access_token']; } //將得到的access_token的值返回 return $data; } /** * * 獲取臨時(shí)票據(jù)方法 * * @return mixed */ public function getJsapiTicket(){ //存入文件中,定義文件的名稱和路徑 $name = 'ticket_' . md5($this->appid . $this->secret); //定義存儲(chǔ)文件路徑 //$filename = __DIR__ . '/cache/' . $name . '.php'; $filename = '../runtime/temp/' . $name . '.php'; //判斷是否存在臨時(shí)票據(jù)的文件,如果存在,就直接取值,如果不存在,就發(fā)送請求獲取并保存 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方法發(fā)送請求,獲取臨時(shí)票據(jù) $result = $this->curl($url); //轉(zhuǎn)換成php數(shù)組 $result = json_decode($result,true); //將獲取到的值存入文件中 file_put_contents($filename,"<?php\nreturn " . var_export($result,true) . ";\n?>"); } //定義返回的數(shù)據(jù) $data = $result['ticket']; //將得到的臨時(shí)票據(jù)結(jié)果返回 return $data; } /** * 獲取簽名方法 */ public function sign(){ //需要定義4個(gè)參數(shù),分別包括隨機(jī)數(shù),臨時(shí)票據(jù),時(shí)間戳和當(dāng)前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個(gè)參數(shù)放入一個(gè)數(shù)組中 $arr = [ 'noncestr=' . $nonceStr, 'jsapi_ticket=' . $ticket, 'timestamp=' . $time, 'url=' . $url ]; //對數(shù)組進(jìn)行字段化排序 sort($arr,SORT_STRING); //對數(shù)組進(jìn)行組合成字符串 $string = implode('&',$arr); //將字符串加密生成簽名 $sign = sha1($string); //由于調(diào)用簽名方法的時(shí)候不只需要簽名,還需要生成簽名的時(shí)候的隨機(jī)數(shù),時(shí)間戳,所以我們應(yīng)該返回由這些內(nèi)容組成的一個(gè)數(shù)組 $reArr = [ 'appId' => $this->appid, 'timestamp' => $time, 'nonceStr' => $nonceStr, 'signature' => $sign, 'url' => $url ]; //將數(shù)組返回 return $reArr; } /** * * 生成隨機(jī)數(shù) * * @return string */ protected function makeStr(){ //定義字符串組成的種子 $seed = 'www512wayanbao1qasxianrendong5tgblaochaguan8ik9500net'; //通過循環(huán)來組成一個(gè)16位的隨機(jī)字符串 //定義一個(gè)空字符串 用來接收組合成的字符串內(nèi)容 $str = ''; for ($i = 0;$i < 16; $i++){ //定義一個(gè)隨機(jī)數(shù) $num = rand(0,strlen($seed) - 1); //循環(huán)連接隨機(jī)生成的字符串 $str .= $seed[$num]; } //將隨機(jī)數(shù)返回 return $str; } /** * * 服務(wù)器之間請求的curl方法 * * @param $url 請求地址 * @param array $field post參數(shù) * @return string */ public function curl($url,$field = []){ //初始化curl $ch = curl_init(); //設(shè)置請求的地址 curl_setopt($ch,CURLOPT_URL,$url); //設(shè)置接收返回的數(shù)據(jù),不直接展示在頁面 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //設(shè)置禁止證書校驗(yàn) curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); //判斷是否為post請求方式,如果傳遞了第二個(gè)參數(shù),就代表是post請求,如果么有傳遞,第二個(gè)參數(shù)為空,就是get請求 if (!empty($field)){ //設(shè)置請求超時(shí)時(shí)間 curl_setopt($ch,CURLOPT_TIMEOUT,30); //設(shè)置開啟post curl_setopt($ch,CURLOPT_POST,1); //傳遞post數(shù)據(jù) curl_setopt($ch,CURLOPT_POSTFIELDS,$field); } //定義一個(gè)空字符串,用來接收請求的結(jié)果 $data = ''; if (curl_exec($ch)){ $data = curl_multi_getcontent($ch); } //關(guān)閉curl curl_close($ch); //將得到的結(jié)果返回 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 '<pre class="brush:php;toolbar:false">'; //print_r($data); ?>
后臺(tái)控制器處理
<?php namespace app\index\controller; use think\Controller; use think\Db; use app\admin\model\Menu; use util\Jssdk; class Index extends Controller { public function demo(){ $id = input('id',0);//ID $catid = input('catid',0);//分類ID $modelInfo = getModInfoById($catid); $info = Db::name($modelInfo['tablename'])->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']); } } ?>
微信事件響應(yīng)
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script type="text/javascript"> // 通過config接口注入權(quán)限驗(yàn)證配置 wx.config({ debug: false, appId: '{$data.appId}', timestamp: '{$data.timestamp}', nonceStr: '{$data.nonceStr}', signature: '{$data.signature}', jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage' ] }); // 通過ready接口處理成功驗(yàn)證 wx.ready(function(){ // 分享到朋友圈 wx.onMenuShareTimeline({ title: '{$info.title}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用戶點(diǎn)擊了分享后執(zhí)行的回調(diào)函數(shù) } }); // 分享給朋友 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,不填默認(rèn)為link dataUrl: '', // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認(rèn)為空 success: function () { // 用戶點(diǎn)擊了分享后執(zhí)行的回調(diào)函數(shù) } }); }); </script>
全部分享接口
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script type="text/javascript"> // 通過config接口注入權(quán)限驗(yàn)證配置 wx.config({ debug: true, appId: '{$data.appId}', timestamp: '{$data.timestamp}', nonceStr: '{$data.nonceStr}', signature: '{$data.signature}', jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone' ] }); // 通過ready接口處理成功驗(yàn)證 wx.ready(function(){ // 分享到朋友圈 wx.onMenuShareTimeline({ title: '{$info.title}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用戶點(diǎn)擊了分享后執(zhí)行的回調(diào)函數(shù) } }); // 分享給朋友 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,不填默認(rèn)為link dataUrl: '', // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認(rèn)為空 success: function () { // 用戶點(diǎn)擊了分享后執(zhí)行的回調(diào)函數(shù) } }); // 分享到QQ wx.onMenuShareQQ({ title: '{$info.title}', desc: '{$info.description}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù) }, cancel: function () { // 用戶取消分享后執(zhí)行的回調(diào)函數(shù) } }); // 分享到騰訊微博 wx.onMenuShareWeibo({ title: '{$info.title}', desc: '{$info.description}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù) }, cancel: function () { // 用戶取消分享后執(zhí)行的回調(diào)函數(shù) } }); // 分享到QQ空間 wx.onMenuShareQZone({ title: '{$info.title}', desc: '{$info.description}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù) }, cancel: function () { // 用戶取消分享后執(zhí)行的回調(diào)函數(shù) } }); }); </script>
以上是ThinkPHP5怎么集成JS-SDK實(shí)現(xiàn)微信自定義分享功能的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

運(yùn)行 ThinkPHP 項(xiàng)目需要:安裝 Composer;使用 Composer 創(chuàng)建項(xiàng)目;進(jìn)入項(xiàng)目目錄,執(zhí)行 php bin/console serve;訪問 http://localhost:8000 查看歡迎頁面。

ThinkPHP 擁有多個(gè)版本,針對不同 PHP 版本而設(shè)計(jì)。主要版本包括 3.2、5.0、5.1 和 6.0,而次要版本用于修復(fù) bug 和提供新功能。當(dāng)前最新穩(wěn)定版本為 ThinkPHP 6.0.16。在選擇版本時(shí),需考慮 PHP 版本、功能需求和社區(qū)支持。建議使用最新穩(wěn)定版本以獲得最佳性能和支持。

ThinkPHP Framework 的本地運(yùn)行步驟:下載并解壓 ThinkPHP Framework 到本地目錄。創(chuàng)建虛擬主機(jī)(可選),指向 ThinkPHP 根目錄。配置數(shù)據(jù)庫連接參數(shù)。啟動(dòng) Web 服務(wù)器。初始化 ThinkPHP 應(yīng)用程序。訪問 ThinkPHP 應(yīng)用程序 URL 運(yùn)行。

Laravel 和 ThinkPHP 框架的性能比較:ThinkPHP 性能通常優(yōu)于 Laravel,專注于優(yōu)化和緩存。Laravel 性能良好,但對于復(fù)雜應(yīng)用程序,ThinkPHP 可能更適合。

ThinkPHP 安裝步驟:準(zhǔn)備 PHP、Composer、MySQL 環(huán)境。使用 Composer 創(chuàng)建項(xiàng)目。安裝 ThinkPHP 框架及依賴項(xiàng)。配置數(shù)據(jù)庫連接。生成應(yīng)用代碼。啟動(dòng)應(yīng)用并訪問 http://localhost:8000。

ThinkPHP 是一款高性能的 PHP 框架,具備緩存機(jī)制、代碼優(yōu)化、并行處理和數(shù)據(jù)庫優(yōu)化等優(yōu)勢。官方性能測試顯示,它每秒可處理超過 10,000 個(gè)請求,實(shí)際應(yīng)用中被廣泛用于京東商城、攜程網(wǎng)等大型網(wǎng)站和企業(yè)系統(tǒng)。

開發(fā)建議:如何利用ThinkPHP框架進(jìn)行API開發(fā)隨著互聯(lián)網(wǎng)的不斷發(fā)展,API(ApplicationProgrammingInterface)的重要性也日益凸顯。API是不同應(yīng)用程序之間進(jìn)行通信的橋梁,它可以實(shí)現(xiàn)數(shù)據(jù)共享、功能調(diào)用等操作,為開發(fā)者提供了相對簡單和快速的開發(fā)方式。而ThinkPHP框架作為一款優(yōu)秀的PHP開發(fā)框架,具有高效、可擴(kuò)展和易用

《開發(fā)建議:如何利用ThinkPHP框架實(shí)現(xiàn)異步任務(wù)》隨著互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,Web應(yīng)用程序?qū)τ谔幚泶罅坎l(fā)請求和復(fù)雜業(yè)務(wù)邏輯的需求也越來越高。為了提高系統(tǒng)的性能和用戶體驗(yàn),開發(fā)人員常常會(huì)考慮利用異步任務(wù)來執(zhí)行一些耗時(shí)操作,比如發(fā)送郵件、處理文件上傳、生成報(bào)表等。在PHP領(lǐng)域,ThinkPHP框架作為一款流行的開發(fā)框架,提供了一些便捷的方式來實(shí)現(xiàn)異步任務(wù)。
