引言
好像更加接近真相了,今天向大家介紹的是微信JSSDK開發(fā)。
重點(diǎn)
微信JS-SDK是微信公眾平臺(tái)面向網(wǎng)頁開發(fā)者提供的基于微信內(nèi)的網(wǎng)頁開發(fā)工具包。
通過使用微信JS-SDK,網(wǎng)頁開發(fā)者可借助微信高效地使用拍照、選圖、語音、位置等手機(jī)系統(tǒng)的能力,同時(shí)可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力。
但是很多人在配置和使用的時(shí)候,老是出各種錯(cuò)誤。最近項(xiàng)目也涉及到這個(gè),就記錄一下過程,并對(duì)方法進(jìn)行封裝。
配置基本步驟
1. 綁定域名
先確保你使用的是認(rèn)證的賬號(hào)(訂閱號(hào),服務(wù)號(hào)),因?yàn)闆]認(rèn)證的號(hào)是沒有JS安全域名配置權(quán)限的。建議開發(fā)前先看看公眾號(hào)類型的接口權(quán)限說明。
登錄微信公眾平臺(tái)進(jìn)入“公眾號(hào)設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”。
2. 引入JS文件
在需要調(diào)用JS接口的頁面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js
請(qǐng)注意,如果你的頁面啟用了https,務(wù)必引入 https://res.wx.qq.com/open/js/jweixin-1.2.0.js ,否則將無法在iOS9.0以上系統(tǒng)中成功使用JSSDK
3. 通過config接口注入權(quán)限驗(yàn)證配置
所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調(diào)用。
(同一個(gè)url僅需調(diào)用一次,對(duì)于變化url的SPA的web app可在每次url變化時(shí)進(jìn)行調(diào)用,目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實(shí)現(xiàn)web app的頁面會(huì)導(dǎo)致簽名失敗,此問題會(huì)在Android6.2中修復(fù))。
wx.config({
debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。
appId: '', // 必填,公眾號(hào)的唯一標(biāo)識(shí)
timestamp: , // 必填,生成簽名的時(shí)間戳
nonceStr: '', // 必填,生成簽名的隨機(jī)串
signature: '',// 必填,簽名
jsApiList: [] // 必填,需要使用的JS接口列表
});
4. 通過ready接口處理成功驗(yàn)證
wx.ready(function(){
// config信息驗(yàn)證后會(huì)執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶端的異步操作,所以如果需要在頁面加載時(shí)就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對(duì)于用戶觸發(fā)時(shí)才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。
});
5. 通過error接口處理失敗驗(yàn)證
wx.error(function(res){
// config信息驗(yàn)證失敗會(huì)執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗(yàn)證失敗,具體錯(cuò)誤信息可以打開config的debug模式查看,也可以在返回的res參數(shù)中查看,對(duì)于SPA可以在這里更新簽名。
});
這些基本步驟在 微信JS-SDK官方文檔說明 里邊講的很清楚了。但很多人在開發(fā)的時(shí)候用自己服務(wù)器不知道上邊第3步配置信息該如何配置,我就具體說說方法吧。
1. 下載jssdk的demo
下載地址:http://demo.open.weixin.qq.com/jssdk/sample.zip
2. 解壓demo,獲取JSSDK的驗(yàn)證類
將jssdk.php放到自己的服務(wù)器上引入自己的程序。
3. 獲取簽名信息
初始化JSSDK類之后,獲取簽名信息,然后將簽名信息填寫到上邊步驟3中配置項(xiàng)中就OK了。
require_once "jssdk.php";
$jssdk = new JSSDK("yourAppID", "yourAppSecret");
$signPackage = $jssdk->GetSignPackage();
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è)列表中
]
);
方法的封裝:
用法:
前端頁面嵌入代碼 <php>echo register_jssdk(true);</php> 或者{php echo register_jssdk(true);}根據(jù)自己使用的框架而定。
/**
* 微信jssdk
* @param [bool] $debug [是否是使用debug模式]
* @return [string] 微信jssdk代碼
*/
function register_jssdk($debug=false){
require_once APP_ROOT.'/Api/jssdk.php';
$appid = 'wechat_appid';
$secret = 'wechat_secret';
$jssdk = new JSSDK($appid,$secret);
$signPackage = $jssdk->GetSignPackage();
if($debug){
$debug = 'true';
}else{
$debug = 'false';
}
$js = "<script src='http://res.wx.qq.com/open/js/jweixin-1.0.0.js'></script>
<script>
wx.config({
debug: ".$debug.",
appId: '".$signPackage["appId"]."',
timestamp: ".$signPackage["timestamp"].",
nonceStr: '".$signPackage["nonceStr"]."',
signature: '".$signPackage["signature"]."',
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'hideMenuItems',
'showMenuItems',
'hideAllNonBaseMenuItem',
'showAllNonBaseMenuItem',
'translateVoice',
'startRecord',
'stopRecord',
'onRecordEnd',
'playVoice',
'pauseVoice',
'stopVoice',
'uploadVoice',
'downloadVoice',
'chooseImage',
'previewImage',
'uploadImage',
'downloadImage',
'getNetworkType',
'openLocation',
'getLocation',
'hideOptionMenu',
'showOptionMenu',
'closeWindow',
'scanQRCode',
'chooseWXPay',
'openProductSpecificView',
'addCard',
'chooseCard',
'openCard'
]
});</script>";
return $js;
}