ThinkPHP5集成JS-SDK實現(xiàn)微信自定義分享功能
微信鏈接分享給好友時能夠自定義標(biāo)題、簡介和logo,現(xiàn)將ThinkPHP5集成JS-SDK實現(xiàn)微信自定義分享功能的過程整理成文。
Jssdk類庫
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);
//定義存儲文件路徑
// $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;
}
/**
*
* 獲取臨時票據(jù)方法
*
* @return mixed
*/
public function getJsapiTicket(){
//存入文件中,定義文件的名稱和路徑
$name = 'ticket_' . md5($this->appid . $this->secret);
//定義存儲文件路徑
//$filename = __DIR__ . '/cache/' . $name . '.php';
$filename = '../runtime/temp/' . $name . '.php';
//判斷是否存在臨時票據(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ā)送請求,獲取臨時票據(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'];
//將得到的臨時票據(jù)結(jié)果返回
return $data;
}
/**
* 獲取簽名方法
*/
public function sign(){
//需要定義4個參數(shù),分別包括隨機數(shù),臨時票據(jù),時間戳和當(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個參數(shù)放入一個數(shù)組中
$arr = [
'noncestr=' . $nonceStr,
'jsapi_ticket=' . $ticket,
'timestamp=' . $time,
'url=' . $url
];
//對數(shù)組進行字段化排序
sort($arr,SORT_STRING);
//對數(shù)組進行組合成字符串
$string = implode('&',$arr);
//將字符串加密生成簽名
$sign = sha1($string);
//由于調(diào)用簽名方法的時候不只需要簽名,還需要生成簽名的時候的隨機數(shù),時間戳,所以我們應(yīng)該返回由這些內(nèi)容組成的一個數(shù)組
$reArr = [
'appId' => $this->appid,
'timestamp' => $time,
'nonceStr' => $nonceStr,
'signature' => $sign,
'url' => $url
];
//將數(shù)組返回
return $reArr;
}
/**
*
* 生成隨機數(shù)
*
* @return string
*/
protected function makeStr(){
//定義字符串組成的種子
$seed = 'www512wayanbao1qasxianrendong5tgblaochaguan8ik9500net';
//通過循環(huán)來組成一個16位的隨機字符串
//定義一個空字符串 用來接收組合成的字符串內(nèi)容
$str = '';
for ($i = 0;$i < 16; $i++){
//定義一個隨機數(shù)
$num = rand(0,strlen($seed) - 1);
//循環(huán)連接隨機生成的字符串
$str .= $seed[$num];
}
//將隨機數(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è)置禁止證書校驗
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//判斷是否為post請求方式,如果傳遞了第二個參數(shù),就代表是post請求,如果么有傳遞,第二個參數(shù)為空,就是get請求
if (!empty($field)){
//設(shè)置請求超時時間
curl_setopt($ch,CURLOPT_TIMEOUT,30);
//設(shè)置開啟post
curl_setopt($ch,CURLOPT_POST,1);
//傳遞post數(shù)據(jù)
curl_setopt($ch,CURLOPT_POSTFIELDS,$field);
}
//定義一個空字符串,用來接收請求的結(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>';
//print_r($data);
?>后臺控制器處理
<?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)限驗證配置
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 () {
// 用戶點擊了分享后執(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,不填默認為link
dataUrl: '', // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認為空
success: function () {
// 用戶點擊了分享后執(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)限驗證配置
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 () {
// 用戶點擊了分享后執(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,不填默認為link
dataUrl: '', // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認為空
success: function () {
// 用戶點擊了分享后執(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 () {
// 用戶確認分享后執(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 () {
// 用戶確認分享后執(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 () {
// 用戶確認分享后執(zhí)行的回調(diào)函數(shù)
},
cancel: function () {
// 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
}
});
});
</script>到此這篇關(guān)于ThinkPHP5集成JS-SDK實現(xiàn)微信自定義分享功能的文章就介紹到這了,更多相關(guān)ThinkPHP5微信自定義分享內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Laravel Eloquent ORM 實現(xiàn)查詢表中指定的字段
今天小編就為大家分享一篇Laravel Eloquent ORM 實現(xiàn)查詢表中指定的字段,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
thinkphp中字符截取函數(shù)msubstr()用法分析
這篇文章主要介紹了thinkphp中字符截取函數(shù)msubstr()用法,結(jié)合實例形式較為詳細的分析了thinkPHP中字符截取函數(shù)msubstr()的功能、定義使用技巧與注意事項,需要的朋友可以參考下2016-01-01
Laravel5.0+框架郵件發(fā)送功能實現(xiàn)方法圖文與實例詳解
這篇文章主要介紹了Laravel5.0+框架郵件發(fā)送功能實現(xiàn)方法,結(jié)合圖文與實例形式詳細分析了Laravel5.0+框架郵件發(fā)送相關(guān)原理、配置、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下2019-04-04
Yii 框架控制器創(chuàng)建使用及控制器響應(yīng)操作示例
這篇文章主要介紹了Yii 框架控制器創(chuàng)建使用及控制器響應(yīng)操作,結(jié)合實例形式分析了Yii框架控制器調(diào)用、參數(shù)傳遞與響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2019-10-10
php使用函數(shù)pathinfo()、parse_url()和basename()解析URL
眾所周知在PHP中函數(shù)pathinfo()、parse_url()和basename(),這三個都是解析URL的函數(shù),但是也存在一些區(qū)別,下面列舉了一些實例,通過實例更容易理解這三個函數(shù)的使用方法和技巧,有需要的朋友可以參考借鑒,感興趣的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11

