最近項目中的網頁通過微信分享朋友或朋友圈等功能出現了無法顯示分享圖片等信息,後經過排查發現是微信版本升級導致,採用js-sdk完成分享接口,爲了快速實現該功能效果,於是我打算通過前臺js進行實現來看看分享效果。
通過查看微信公衆平臺文檔,找到自己所需要的說明文檔,明確開發步驟,說明文檔截圖如下:
開發步驟:
1、按照說明文檔完成步驟1.1.1
2、引入js文件
在分享的頁面中添加js文件 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
-
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
-
-
<script src="/commonScripts/jquery-1.5.1.min.js"></script>
-
-
-
<script src="/commonScripts/wxShare_sha1.js"></script>
-
-
-
<script src="/commonScripts/wxShare_data.js"></script>
-
-
-
<script src="/commonScripts/wxShare.js"></script>
-
-
</head>
-
<body id="weixinshare">
-
微信分享開發
-
<img
-
style="width:672px; height:345px; cursor:pointer"
-
alt="banner01"
-
src="/mobileimg/123.jpg">
-
</body>
-
</html>
3、配置wxShare.js
-
var $wx_account = wxdata.wx_account,
-
$wx_share = wxdata.wx_share;
-
-
-
wx.config ({
-
debug : false,
-
appId : $wx_account[0],
-
timestamp : $wx_account[1],
-
nonceStr : $wx_account[2],
-
signature : $wx_account[3],
-
jsApiList : [
-
-
'onMenuShareTimeline',
-
'onMenuShareAppMessage',
-
'onMenuShareQQ',
-
'onMenuShareWeibo'
-
]
-
});
-
wx.ready (function () {
-
-
var shareData = {
-
"imgUrl" : $wx_share[0],
-
"link" : $wx_share[1],
-
"desc" : $wx_share[2],
-
"title" : $wx_share[3],
-
success : function () {
-
-
-
-
-
};
-
wx.onMenuShareTimeline (shareData);
-
wx.onMenuShareAppMessage (shareData);
-
wx.onMenuShareQQ (shareData);
-
wx.onMenuShareWeibo (shareData);
-
});
-
-
-
wx.error(function(res){
-
-
-
-
alert("好像出錯了!!");
-
});
4、組裝微信的配置信息wxShare_data.js
-
var wxdata = {
-
wx_account : new Array(4),
-
wx_share : new Array(4),
-
wx_myuser : new Array("appid","appsecret"),
-
-
access_token : "",
-
token_expires_in : "" ,
-
jsapi_ticket : "",
-
ticket_expires_in : "" ,
-
url : "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxdata.wx_myuser[0] + "&secret=" + wxdata.wx_myuser[1],
-
-
-
-
get_access_token : function (){
-
$.ajax({
-
type : "GET",
-
url : wxdata.url
-
dataType : "jsonp",
-
cache : false,
-
-
success : function(msg) {
-
-
-
wxdata.access_token = msg.access_token;
-
wxdata.token_expires_in = msg.expires_in;
-
if (access_token != "" || access_token != null) {
-
console.log("get access_token success: " + wxdata.access_token);
-
} else {
-
console.log("get access_token fail " +wxdata.access_token);
-
}
-
},
-
error : function(msg){
-
alert("get access_token error!! : ");
-
}
-
});
-
},
-
-
-
-
get_jsapi_ticket : function(){
-
$.ajax({
-
type : "GET",
-
url : "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + wxdata.access_token +"&type=jsapi",
-
dataType : "jsonp",
-
cache : false,
-
async : false,
-
jsonp :'callback',
-
success : function(msg) {
-
-
-
-
-
-
-
-
-
if(msg.errcode == 0){
-
wxdata.jsapi_ticket = msg.ticket;
-
wxdata.ticket_expires_in = msg.expires_in;
-
console.log("get jsapi_ticket success");
-
} else {
-
console.log("get jsapi_ticket fail");
-
}
-
},
-
error : function(msg){
-
alert("get jsapi_ticket error!!! ");
-
}
-
});
-
},
-
-
create_signature : function(nocestr,ticket,timestamp,url){
-
var signature = "";
-
-
var s = "jsapi_ticket=" + ticket + "&noncestr=" + nocestr + "×tamp=" + timestamp + "&url=" + url;
-
return hex_sha1(s);
-
},
-
-
-
create_noncestr : function () {
-
var str= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
-
var val = "";
-
for (var i = 0; i < 16; i++) {
-
val += str.substr(Math.round((Math.random() * 10)), 1);
-
}
-
return val;
-
},
-
-
-
create_timestamp : function () {
-
return new Date().getSeconds();
-
}
-
-
}
-
-
-
wxdata.access_token = "B06fRIti5GDmvNLKsV5OkJ4fU1qd3YyyW0cgwenxhqI7XwmpTrpwY6Uc7nNtnumdJvnPJXcACAVPD";
-
-
-
wxdata.jsapi_ticket = "XGEs8VD-_kgoxt8jcijupT7j_EA-nP07ro_MmUNDVD0oR8unfqY4C_YIMXAQvhztlTk8j2A"
-
-
-
var timestamp = wxdata.create_timestamp();
-
var noncestr = wxdata.create_noncestr();
-
var url = window.location.href;
-
-
wxdata.wx_account[0] = wxdata.wx_myuser[0];
-
wxdata.wx_account[1] = timestamp;
-
wxdata.wx_account[2] = noncestr;
-
wxdata.wx_account[3] = wxdata.create_signature(noncestr, wxdata.jsapi_ticket ,timestamp ,url);
-
-
wxdata.wx_share[0] = "http://www.123456.com/img/123.jpg"; // share_img 分享縮略圖圖片
-
wxdata.wx_share[1] = window.location.href;
-
wxdata.wx_share[2] = "this is share_desc";
-
wxdata.wx_share[3] = "this is share_title";
-
說明:
4.1 分享流程:
用戶創建時間戳,隨機字符串,當前需要分享的頁面的url三個變量,接着將自己的appid和APPsecret作爲請求參數獲取access_token,再根據access_token獲取jsapi_ticket, 然後將獲取的jsapi_ticket,以及自己創建的三個變量進行簽名,注意簽名過程案按照 key 值 ASCII 碼升序排序,具體參加程序,
4.2 請求後的響應程序無法處理 問題
get_access_token()函數中對微信發起獲取access_token的請求,存在跨域問題,設置dataType:"jsonp"無法解決,通過瀏覽器查看請求發現微信相應的數據並沒有包裝數據,猜測微信不支持這個請求的跨域,因爲ajax程序無法通過程序正常獲取access_token的值,但可以在瀏覽器調式獲取access_token的值,這個值有7200s,足夠去獲取jsapi_ticket ,獲取jsapi_ticket的請求過程存在同樣的問題,因此獲取access_token和jsapi_token必須從服務端後端代碼。
這篇文章主要是想用js請求來完成分享的效果屬於介紹篇,因而沒有開發服務器端請求代碼(勿噴),服務器篇代碼見後續的應用篇
那麼如何正常才能讓程序跑起來,正常的分享頁面呢??
在wxShare_data.js 代碼中,首先發起 wxdata.get_access_token(); 註釋②③④⑤代碼,將瀏覽器獲取的access_token,手動的放到②變量處,
手動完成了access_token的賦值後,註釋①,打開②③,開始
wxdata.get_jsapi_ticket(); 註釋④⑤處代碼
同樣的操作 從瀏覽器獲取 jsapi_ticket值將其賦值給④處變量,註釋①③,打開②④⑤處代碼,最終代碼見wxShare_data.js
5、wxShare_sha1.js
對數據進行簽名 sha1.js下載
6、此時頁面可以正常運行並完成微信分享了,
成功頁面展示
微信分享給朋友
至此完成想要的驗證效果,接下來就可以在服務器帶開發代碼了!!!期待完整版微信分享
想記錄下自己開發過程,本人第一次寫博客,錯誤之處還請指出共同探討,勿噴!!! 謝謝