主頁(yè) > 知識(shí)庫(kù) > 微信公眾平臺(tái)開(kāi)發(fā)教程②微信端分享功能圖文詳解

微信公眾平臺(tái)開(kāi)發(fā)教程②微信端分享功能圖文詳解

熱門(mén)標(biāo)簽:團(tuán)購(gòu)網(wǎng)站 Linux服務(wù)器 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 電子圍欄 銀行業(yè)務(wù) Mysql連接數(shù)設(shè)置 阿里云 服務(wù)器配置

本文實(shí)例講述了微信公眾平臺(tái)微信端分享功能。分享給大家供大家參考,具體如下:

背景

    初次嘗試微信公眾號(hào)的開(kāi)發(fā),對(duì)于學(xué)習(xí)方法的探索都是來(lái)源于網(wǎng)上的博客、問(wèn)答,對(duì)于參差不齊的信息,自己也是有苦說(shuō)不出,抽出一點(diǎn)時(shí)間寫(xiě)點(diǎn)文章,既是對(duì)自己的學(xué)習(xí)總結(jié),也希望給予同是菜鳥(niǎo)的小白一點(diǎn)幫助。

    今天想添加微信分享的功能,如果不進(jìn)行自定義設(shè)計(jì),那么當(dāng)我們點(diǎn)擊分享朋友圈、好友或者QQ好友、空間時(shí),默認(rèn)的標(biāo)題就是title>標(biāo)簽中的信息,而顯示的描述信息就是鏈接,圖片多是默認(rèn)為頁(yè)面中顯示的第一張圖片,顯然這樣的處理是不合理的,所以需要查詢(xún)開(kāi)發(fā)文檔進(jìn)行編碼設(shè)計(jì)。

操作步驟:

一.參考微信公眾號(hào)開(kāi)發(fā)文檔

【1】.登錄微信公眾號(hào)

      打開(kāi) “開(kāi)發(fā)者工具->開(kāi)發(fā)者文檔->微信網(wǎng)頁(yè)開(kāi)發(fā)->微信JS-SDK說(shuō)明文檔”,找到對(duì)應(yīng)的位置,首先要了解官方的需求說(shuō)明才能進(jìn)行下一步的開(kāi)發(fā)。
        

【2】.建議詳細(xì)參考文檔后再考慮代碼的編寫(xiě)

      提示:下拉上圖中的網(wǎng)頁(yè)最下端,下載官方提供的參考demo。本文的最后我會(huì)提供一份稍作修改的僅針對(duì)于php的實(shí)現(xiàn)代碼,可作參考。
        

二.代碼實(shí)現(xiàn)(PHP)及部分問(wèn)題引導(dǎo)

【1】.我提供的代碼就是下圖中的幾個(gè)簡(jiǎn)單文件

      主要來(lái)源于微信公眾號(hào)的開(kāi)發(fā)文檔,上面提到過(guò)一次。其中,我們操作的分享頁(yè)面代碼只需參考 sharePage.php就好,對(duì)于官方的實(shí)現(xiàn)可以去閱讀其他文件,畢竟我們實(shí)現(xiàn)功能只需導(dǎo)入文件,調(diào)用所提供類(lèi)及方法就好。
        

【2】.在此提供 sharePage.php 簡(jiǎn)單代碼,以便參考講解。

      其中提出幾點(diǎn)需要注意的是: 

(1).需要提供 $appid, $secret 

(2).代碼中需要引用微信端提供的js文件script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js">/script> ,當(dāng)然也可以下載其源代碼,放于本地鏈接獲取就可以。 

(3).保證 wx.config 的信息配置的正確,debug如果為true可以提示操作的過(guò)程,測(cè)試沒(méi)有問(wèn)題后可以改為false,這樣才是合理的操作,另外jsApiList中要補(bǔ)全自己需要的功能 

(4).之前我把分享功能的代碼寫(xiě)在 wx.config 平級(jí)中無(wú)法實(shí)現(xiàn),之后測(cè)試發(fā)現(xiàn)應(yīng)該寫(xiě)在wx.reday(function())中,具體的代碼模式都應(yīng)該參考開(kāi)發(fā)文檔。

?php
require_once "jssdk.php";

//獲取到網(wǎng)頁(yè)授權(quán)的access_token
$appid = "wx36xxxxxxxxxx199";// 輸入公眾號(hào)、服務(wù)號(hào)、或者測(cè)試號(hào)的appid 
$secret = "9caxxxxxxxxxxxxxxxxxx8a2";// 輸入公眾號(hào)、服務(wù)號(hào)、或者測(cè)試號(hào)的 secret


$jssdk = new JSSDK($appid, $secret);
$signPackage = $jssdk->GetSignPackage();

//此處用于輸出得到的數(shù)據(jù) 用來(lái)測(cè)試簽名證書(shū)是否正確 
/*
echo ' appId:'. $signPackage["appId"].'br/>';
echo ' jsapi_ticket:'. $signPackage["jsapiTicket"].'br/>';
echo ' url:'. $signPackage["url"].'br/>';
echo ' timestamp:'. $signPackage["timestamp"].'br/>';
echo ' nonceStr:'. $signPackage["nonceStr"].'br/>';
echo ' signature:'. $signPackage["signature"];
echo 'br/>';
echo 'br/>';
echo 'br/>';
exit;
*/

?>
!DOCTYPE html>
html lang="en">
head>
 meta charset="UTF-8">
 title>/title>
/head>
body>
 Hello Hello Hello
/body>
script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js">/script>
script>
 /*
 * 注意:
 * 1. 所有的JS接口只能在公眾號(hào)綁定的域名下調(diào)用,公眾號(hào)開(kāi)發(fā)者需要先登錄微信公眾平臺(tái)進(jìn)入“公眾號(hào)設(shè)置”的“功能設(shè)置”里填寫(xiě)“JS接口安全域名”。
 * 2. 如果發(fā)現(xiàn)在 Android 不能分享自定義內(nèi)容,請(qǐng)到官網(wǎng)下載最新的包覆蓋安裝,Android 自定義分享接口需升級(jí)至 6.0.2.58 版本及以上。
 * 3. 常見(jiàn)問(wèn)題及完整 JS-SDK 文檔地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
 *
 * 開(kāi)發(fā)中遇到問(wèn)題詳見(jiàn)文檔“附錄5-常見(jiàn)錯(cuò)誤及解決辦法”解決,如仍未能解決可通過(guò)以下渠道反饋:
 * 郵箱地址:weixin-open@qq.com
 * 郵件主題:【微信JS-SDK反饋】具體問(wèn)題
 * 郵件內(nèi)容說(shuō)明:用簡(jiǎn)明的語(yǔ)言描述問(wèn)題所在,并交代清楚遇到該問(wèn)題的場(chǎng)景,可附上截屏圖片,微信團(tuán)隊(duì)會(huì)盡快處理你的反饋。
 */
 wx.config({
 debug: true,
 appId: '?php echo $signPackage["appId"];?>',
 timestamp: ?php echo $signPackage["timestamp"];?>,
 nonceStr: '?php echo $signPackage["nonceStr"];?>',
 signature: '?php echo $signPackage["signature"];?>',
 jsApiList: [
  // 所有要調(diào)用的 API 都要加到這個(gè)列表中
  'checkJsApi',
  'onMenuShareTimeline',
  'onMenuShareAppMessage',
  'onMenuShareQQ',
  'onMenuShareWeibo',
  'onMenuShareQZone',
 ]
 });

 wx.ready(function () {
 // 在這里調(diào)用 API
 //獲取“分享到朋友圈”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
 wx.onMenuShareTimeline({
  title: '快來(lái)!分享朋友圈', // 分享標(biāo)題
  link: 'http://www.baidu.com', // 分享鏈接
  imgUrl: 'http://img1.3lian.com/img013/v2/4/d/101.jpg', // 分享圖標(biāo)
  success: function () {
  // 用戶(hù)確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
  },
  cancel: function () {
  // 用戶(hù)取消分享后執(zhí)行的回調(diào)函數(shù)
  }
 });
 //獲取“分享給朋友”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
 wx.onMenuShareAppMessage({
  title: ' 微信分享給朋友', // 分享標(biāo)題
  desc: '描述一下,可是知道該咋描述你呢?', // 分享描述
  link: 'http://www.baidu.com', // 分享鏈接
  imgUrl: 'http://img1.3lian.com/img013/v2/4/d/101.jpg', // 分享圖標(biāo)
  type: 'link', // 分享類(lèi)型,music、video或link,不填默認(rèn)為link
  dataUrl: '', // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認(rèn)為空
 });
 wx.onMenuShareQQ({
  title: 'QQ我要跳轉(zhuǎn)到百度頁(yè)面了?。?, // 分享標(biāo)題
  desc: '描述一下,可是知道該咋描述你呢?', // 分享描述
  link: 'http://www.baidu.com', // 分享鏈接
  imgUrl: 'http://img1.3lian.com/img013/v2/4/d/101.jpg', // 分享圖標(biāo)
 });
 wx.onMenuShareQZone({
  title: 'QZone我要跳轉(zhuǎn)到百度頁(yè)面了??!', // 分享標(biāo)題
  desc: '描述一下,可是知道該咋描述你呢?', // 分享描述
  link: 'http://www.baidu.com', // 分享鏈接
  imgUrl: 'http://img1.3lian.com/img013/v2/4/d/101.jpg', // 分享圖標(biāo)
 });
 });
/script>
/html>
【3】.正常操作中,可能會(huì)有 “errMsg config:invalid signature" 簽名錯(cuò)誤

      可以參考博文  《微信js sdk invalid signature簽名錯(cuò)誤》,網(wǎng)上多數(shù)的建議是檢查簽名證書(shū)是否正確,用作者的話(huà)就是“確認(rèn)簽名算法正確,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 頁(yè)面工具進(jìn)行校驗(yàn)”。
              對(duì)于需要填入的信息,可以從上文中打印出需要的信息,我做注釋的那一部分信息,請(qǐng)參考。不過(guò),普遍情況,這樣的簽名是沒(méi)有問(wèn)題的,可作為參考。

【4】.新發(fā)現(xiàn)一種情況

     原先一切正常的分享功能,突然變得無(wú)法顯示分享時(shí)的鏈接、圖片等,我將 wx.config 中的debug 設(shè)定為true繼續(xù)報(bào)錯(cuò)“errMsg config:invalid signature",并非簽名證書(shū)的問(wèn)題,我猜測(cè)應(yīng)該是文檔中一直提及的token或ticket緩存問(wèn)題,個(gè)人打開(kāi)之前導(dǎo)入的兩個(gè)文件發(fā)現(xiàn)已經(jīng)重新寫(xiě)入了值,但是我將其重新改為當(dāng)初下載下來(lái)的文件放入服務(wù)器中覆蓋,意外的發(fā)現(xiàn)可以重新獲得正確的分享能力,不知哪一天又會(huì)出現(xiàn)問(wèn)題,也希望好心的大牛告知一下。

【2016-7-14 補(bǔ)充】

      經(jīng)測(cè)試發(fā)現(xiàn),上文提及分享功能的失敗,與token ,ticket 存儲(chǔ)文件沒(méi)有多大關(guān)系,因?yàn)槿缃駸o(wú)法重現(xiàn) Bug,無(wú)語(yǔ)的是,發(fā)現(xiàn)當(dāng)初開(kāi)發(fā)者中心使用的測(cè)試號(hào)是被賦予了分享權(quán)限的,然而自己申請(qǐng)的訂閱號(hào),通過(guò)查看“接口權(quán)限”發(fā)現(xiàn)“未獲得”分享權(quán)限。


        


      一般的服務(wù)號(hào)都是擁有分享權(quán)限的,獲取需要開(kāi)通什么來(lái)著,具體的可百度,我的問(wèn)題是沒(méi)有進(jìn)入“公眾號(hào)平臺(tái)->公眾號(hào)設(shè)置->功能設(shè)置”中填寫(xiě)“JS接口安全域名”,其中要求是備案過(guò)的域名,個(gè)人實(shí)驗(yàn)證明填寫(xiě)去掉“http://www”后的形如“beidou.com”的域名即可,便于限制誘導(dǎo)關(guān)注的情況出現(xiàn)。

      設(shè)置完成后可以查看上圖中的“分享接口”,保證里面顯現(xiàn)的是獲得權(quán)限,然后再進(jìn)行菜單欄的分享測(cè)試即可發(fā)現(xiàn),正常進(jìn)行。

【5】.我遇到過(guò)提示此處代碼報(bào)錯(cuò)的問(wèn)題

      參考網(wǎng)上資源介紹的多是與簽名安全相關(guān)的信息,可自行百度,鑒于能力有限,暫時(shí)發(fā)現(xiàn)注釋此處的代碼可避免該問(wèn)題的影響,等有時(shí)間再做深入解決。
     

【6】.最后的報(bào)錯(cuò)信息顯示該處對(duì)于文件操作的權(quán)限不足的問(wèn)題

      類(lèi)似 “Warning: fopen(access_token.json) [function.fopen]: failed to open stream: Permission denied in jssdk.php "問(wèn)題,可以參考此文的部分介紹。
            值得一提的是該問(wèn)題大多牽扯操作系統(tǒng)的權(quán)限分配,之前我用的是新浪SAE進(jìn)行測(cè)試,后面得知SAE是無(wú)法由我們用戶(hù)進(jìn)行權(quán)限設(shè)定的,最后我選擇了公司服務(wù)器,使用類(lèi)似 “chmod -R 777 /home/mypackage ” 的命令進(jìn)行對(duì)應(yīng)文件的操作權(quán)限分配。

三.補(bǔ)充

1.出現(xiàn)問(wèn)題,多參考別人的解決方法,可見(jiàn)有一個(gè)可以帶你的前輩是多么重要 

2.自己探索問(wèn)題的解決方法,然后做好筆記作為自己的經(jīng)歷回顧,雖然解決時(shí)間拉長(zhǎng),但成就感絕對(duì)比從別人口中聽(tīng)來(lái)分量重的多。 

3.在此我粘貼稍作修改后的代碼,其實(shí)就是其中的大概幾行的改動(dòng),為了配合上面簽名的測(cè)試,所以需要參考,其中另外的兩個(gè)文件沒(méi)做改動(dòng),無(wú)需上傳,公眾號(hào)開(kāi)發(fā)文檔的最后就有 demo 文件,具體的請(qǐng)參照開(kāi)發(fā)文檔。      

?php
class JSSDK {
 private $appId;
 private $appSecret;

 public function __construct($appId, $appSecret) {
 $this->appId = $appId;
 $this->appSecret = $appSecret;
 }

 public function getSignPackage() {
 $jsapiTicket = $this->getJsApiTicket();

 // 注意 URL 一定要?jiǎng)討B(tài)獲取,不能 hardcode.
 $protocol = (!empty($_SERVER['HTTPS'])  $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
 $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

 $timestamp = time();
 $nonceStr = $this->createNonceStr();

 // 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序
 $string = "jsapi_ticket=$jsapiTicketnoncestr=$nonceStr×tamp=$timestampurl=$url";

 $signature = sha1($string);

 $signPackage = array(
 "appId" => $this->appId,
 "jsapiTicket" => $jsapiTicket,
 "nonceStr" => $nonceStr,
 "timestamp" => $timestamp,
 "url" => $url,
 "signature" => $signature,
 "rawString" => $string
 );
 return $signPackage;
 }

 private function createNonceStr($length = 16) {
 $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 $str = "";
 for ($i = 0; $i  $length; $i++) {
 $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
 }
 return $str;
 }

 private function getJsApiTicket() {
 // jsapi_ticket 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫(xiě)入到文件中做示例
 $data = json_decode($this->get_php_file("jsapi_ticket.php"));
 if ($data->expire_time  time()) {
 $accessToken = $this->getAccessToken();
 // 如果是企業(yè)號(hào)用以下 URL 獲取 ticket
 // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
 $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapiaccess_token=$accessToken";
 $res = json_decode($this->httpGet($url));
 $ticket = $res->ticket;
 if ($ticket) {
 $data->expire_time = time() + 7000;
 $data->jsapi_ticket = $ticket;
 $this->set_php_file("jsapi_ticket.php", json_encode($data));
 }
 } else {
 $ticket = $data->jsapi_ticket;
 }

 return $ticket;
 }

 private function getAccessToken() {
 // access_token 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫(xiě)入到文件中做示例
 $data = json_decode($this->get_php_file("access_token.php"));
 if ($data->expire_time  time()) {
 // 如果是企業(yè)號(hào)用以下URL獲取access_token
 // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appIdcorpsecret=$this->appSecret";
 $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credentialappid=$this->appIdsecret=$this->appSecret";
 $res = json_decode($this->httpGet($url));
 $access_token = $res->access_token;
 if ($access_token) {
 $data->expire_time = time() + 7000;
 $data->access_token = $access_token;
 $this->set_php_file("access_token.php", json_encode($data));
 }
 } else {
 $access_token = $data->access_token;
 }
 return $access_token;
 }

 private function httpGet($url) {
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($curl, CURLOPT_TIMEOUT, 500);
 // 為保證第三方服務(wù)器與微信服務(wù)器之間數(shù)據(jù)傳輸?shù)陌踩?,所有微信接口采用https方式調(diào)用,必須使用下面2行代碼打開(kāi)ssl安全校驗(yàn)。
 // 如果在部署過(guò)程中代碼在此處驗(yàn)證失敗,請(qǐng)到 http://curl.haxx.se/ca/cacert.pem 下載新的證書(shū)判別文件。
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
 //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
 curl_setopt($curl, CURLOPT_URL, $url);

 $res = curl_exec($curl);
 curl_close($curl);

 return $res;
 }

 private function get_php_file($filename) {
 return trim(substr(file_get_contents($filename), 15));
 }
 private function set_php_file($filename, $content) {
 $fp = fopen($filename, "w");
 fwrite($fp, "?php exit();?>" . $content);
 fclose($fp);
 }
}


四、附錄

    1.在此推薦參考一篇比較詳細(xì)的 微信分享博文,向前輩致敬。   
    2.源代碼之前存于360云盤(pán)共享
如今已經(jīng)過(guò)期找不到了。其實(shí)參考文中的代碼同時(shí)下載官方demo就能完全重現(xiàn)源代碼。
    3.此處 推薦參考新篇: 微信公眾平臺(tái)開(kāi)發(fā)教程微信開(kāi)發(fā)集成類(lèi)的使用 (包含微信分享功能)

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP微信開(kāi)發(fā)技巧匯總》、《php curl用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《php字符串(string)用法總結(jié)》、《PHP中json格式數(shù)據(jù)操作技巧匯總》及《PHP針對(duì)XML文件操作技巧總結(jié)》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • 微信公眾平臺(tái)實(shí)現(xiàn)獲取用戶(hù)OpenID的方法
  • 微信公眾號(hào)支付(一)如何獲取用戶(hù)openId
  • .NET微信公眾號(hào)獲取OpenID和用戶(hù)信息
  • PHP通過(guò)微信跳轉(zhuǎn)的Code參數(shù)獲取用戶(hù)的openid(關(guān)鍵代碼)
  • MVC微信網(wǎng)頁(yè)授權(quán)獲取用戶(hù)OpenId
  • ASP.NET Core2靜默獲取微信公眾號(hào)的用戶(hù)OpenId實(shí)例代碼
  • 微信公眾平臺(tái)開(kāi)發(fā)教程⑥ 微信開(kāi)發(fā)集成類(lèi)的使用圖文詳解
  • 詳解微信圖片防盜鏈“此圖片來(lái)自微信公眾平臺(tái) 未經(jīng)允許不得引用”的解決方案
  • PHP封裝的微信公眾平臺(tái)接口開(kāi)發(fā)操作類(lèi)完整示例
  • 微信公眾平臺(tái)開(kāi)發(fā)教程①獲取用戶(hù)Openid及個(gè)人信息圖文詳解

標(biāo)簽:大理 衢州 蚌埠 萍鄉(xiāng) 衡水 江蘇 廣元 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《微信公眾平臺(tái)開(kāi)發(fā)教程②微信端分享功能圖文詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266