## 知識點:
1、微信JS-SDK說明文檔
2、JSSDK使用步驟
3、Jssdk類庫
4、后臺處理
5、事件響應
[TOC]
## 一、微信JS-SDK說明文檔
最近開發一個項目,需要將鏈接分享給好友時能夠自定義標題、簡介和logo,現將ThinkPHP5集成JS-SDK實現微信自定義分享功能的過程整理成文。
### 相關文章
微信JS-SDK說明文檔
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
ThinkPHP5集成JS-SDK實現微信自定義分享功能
https://www.cnblogs.com/sunshineliulu/p/8034286.html
thinkphp5.x中集成微信JS-SDK
https://blog.csdn.net/yi_an/article/details/54973020
最新微信公眾平臺js sdk整合PHP版
https://www.cnblogs.com/x3d/p/4240556.html
thinkphp項目如何自定義微信分享描述內容
http://www.php.cn/weixin-kaifa-353000.html
### 視頻資料
微信公眾號之JS-SDK開發【php實戰】
https://ke.qq.com/course/306636
### 視頻代碼
后盾人視頻教程代碼
https://gitee.com/houdunwang/video
## 二、JSSDK使用步驟
1.1.1 步驟一:綁定域名
1.1.2 步驟二:引入JS文件
1.1.3 步驟三:通過config接口注入權限驗證配置
1.1.4 步驟四:通過ready接口處理成功驗證
1.1.5 步驟五:通過error接口處理失敗驗證
## Jssdk類庫
### 1、文件名及位置
名字:Jssdk.php
位置:extend\util\Jssdk.php
### 2、代碼
~~~
<?php
namespace util;
/**
+------------------------------------------------
* ThinkPHP5集成JS-SDK實現微信自定義分享功能
+------------------------------------------------
* @修改人 后盾網
+------------------------------------------------
* @date 2018年8月15
+------------------------------------------------
*/
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';
//判斷文件是否存在,如果存在,就取出文件中的數據值,如果不存在,就向微信端請求
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,"<?php\nreturn " . var_export($result,true) . ";\n?>");
//定義需要返回的內容
$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,"<?php\nreturn " . var_export($result,true) . ";\n?>");
}
//定義返回的數據
$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 '<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']);
}
}
?>
~~~
## 五、事件響應
~~~
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript">
// 通過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 () {
// 用戶點擊了分享后執行的回調函數
}
});
});
</script>
~~~
全部分享接口
~~~
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript">
// 通過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 () {
// 用戶取消分享后執行的回調函數
}
});
});
</script>
~~~
- Layer無刷新不跳轉彈框提示信息
- 整合ThinkPHP+實用代碼
- TP整合Layer插件實現無刷新
- 自定義助手函數
- 添加信息失敗后不跳轉
- 三種無限級分類
- TP常用代碼
- 自定義公共函數
- TP模型管理專題
- TP模型管理之添加模型
- sfox_newmodel.sql
- TP模型管理之刪除模型
- TP模型管理之編輯模型
- TP模型管理之字段添加
- sfox_newmodel.sql_edit
- layer_hplus.js_edit
- TP模型管理之字段刪除
- TP模型管理之字段編輯
- TP模型管理之預覽模型
- TP模型管理之公共函數
- layer_hplus.js_修訂一
- TP模型管理之預覽模型靜態頁
- 后臺內容管理系統
- 分類樹顯示
- 內容列表顯示
- 信息發布
- 編輯信息
- layer_hplus.js
- myJs第一版
- myJs第二版
- myJs第三版
- myJs第四版
- TP5插件用法
- Datatables
- WebUploader
- bootstrap-fileinput
- UEditor
- 簡單調用
- 路徑問題
- 跨域多圖上傳
- 跨域單圖上傳
- UEditor圖片跨域上傳解決方案
- 定制工具欄圖標
- ajaxFileUpload
- LayUI
- 圖片上傳
- layui分頁
- 搜索頁
- 搜索優化及刪除
- Uploadify
- TP5前端應用
- 靜態首頁
- 前臺首頁功能實現
- 自定義標簽庫
- 前臺模板繼承應用
- 首頁自定義標簽改進
- 文章內容頁
- 自定義標簽改進
- 自定義標簽修正
- 圖片等比例自動縮放
- 后臺權限管理
- 角色管理
- 規則管理
- 權限設置
- 會員管理
- 權限管理
- 前臺登錄注冊功能
- 注冊登錄
- 阿里大于手機注冊
- 阿里大于升級阿里云短信服務
- 自動登錄完成
- PHP異位或加密實現自動登陸
- 微信開發
- 分享接口
- 靜態頁面實現微信分享
- 動態頁微信分享
- 頁面靜態化
- 1-全站靜態化前期配置
- 2-鏈接地址靜態化
- TP5常用片段代碼
- 加載靜態資源路徑與常量
- thinkphp5預定義常量
- 刪除某文件夾的內容
- 解壓插件包
- 異步提交插件
- 其他功能
- 背景音樂
- 手機訪問PC網站自動跳轉到手機網站代碼
- 手機微信音樂MP3播放器
- 后盾之網頁背景音樂
- 播放器寬度自適應
- 前臺首頁數據調用
- 視頻列表
- 搜索分頁
- H5解決蘋果(IOS)不能自動播放音樂
- 清空緩存
- 文件處理常識
- 刪除路徑下的所有文件夾和文件
- 一鍵清空緩存
- 評論留言
- 格式化時間
- 替換微博內容的URL地址@用戶與表情
- PHP正則理解
- jQuery評論插件
- TP空操作
- TP路由
- 跨域訪問
- 設置請其頭允許跨域請求
- 模板前臺判斷手機訪問跳轉手機網址代碼
- PHP遍歷一個文件夾下所有文件和子文件夾
- PHP獲取視頻的第一幀與時長
- TP5數據庫
- 鏈式操作原理
- update替換字段部分內容
- 后臺開發
- 后臺登錄頁居中顯示
- TP5自帶驗證碼
- JS & JQuery專題
- 二級城市聯動菜單
- 模板引擎
- 混合模板編譯
- 黃永成TP微博開發
- 消息推送
- memcache安裝
- 插件開發
- 插件介紹
- 插件鉤子
- 淺談初步理解鉤子
- 插件鉤子(hooks)分析
- 插件鉤子簡單理解
- 控制器調用插件
- 鉤子通用處理函數
- 插件基類代碼
- 插件測試代碼
- 淺談鉤子與插件
- 技術綜合
- 常用代碼
- PHP
- 56個PHP開發常用代碼片段(上)
- 56個PHP 開發常用代碼片段(中)
- 56個PHP 開發常用代碼片段(下)
- sublime text安裝自動補全注釋的插件
- 影音視頻開發
- 視頻
- H5視頻直播掃盲
- 音樂
- 語音
- PHP實現語音播報功能
- MUI
- 窗體操作