微信公眾號開發(fā)之如何使用JSSDK

微信開發(fā)交流群:148540125
歡迎留言据某、轉(zhuǎn)發(fā)搭儒、打賞

系列文章參考地址 極速開發(fā)微信公眾號
項(xiàng)目源碼參考地址 點(diǎn)我點(diǎn)我--歡迎Start

查看公眾號是否有使用JSSDK的權(quán)限

服務(wù)號、訂閱號可以通過登錄微信公眾平臺查看開發(fā)>接口權(quán)限

使用JSSDK主要包括
1、判斷當(dāng)前客戶端版本是否支持指定JS接口宠进、
2、分享接口(微信認(rèn)證)
3藐翎、圖像接口
4、音頻接口
5实幕、智能接口(識別語音并返回結(jié)果)
6吝镣、設(shè)備信息(獲取網(wǎng)絡(luò)狀態(tài))
7、地理位置
8昆庇、界面操作
9末贾、微信掃一掃
10、微信小店(服務(wù)號必須通過微信認(rèn)證)
11整吆、微信卡券 (微信認(rèn)證)
12拱撵、微信支付(服務(wù)號必須通過微信認(rèn)證)

使用JSSDK步驟

官方參考文檔

步驟一:綁定域名

先登錄微信公眾平臺進(jìn)入公眾號設(shè)置功能設(shè)置里填寫JS接口安全域名

JS接口安全域名.png

步驟二:引入JS文件
在需要調(diào)用JS接口的頁面引入如下JS文件表蝙,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js
如需使用搖一搖周邊功能拴测,請引入 http://res.wx.qq.com/open/js/jweixin-1.1.0.js
備注:支持使用 AMD/CMD 標(biāo)準(zhǔn)模塊加載方法加載

步驟三:通過config接口注入權(quán)限驗(yàn)證配置

wx.config({
    debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù)府蛇,可以在pc端打開集索,參數(shù)信息會通過log打出,僅在pc端時(shí)才會打印汇跨。
    appId: '', // 必填务荆,公眾號的唯一標(biāo)識
    timestamp: , // 必填,生成簽名的時(shí)間戳
    nonceStr: '', // 必填穷遂,生成簽名的隨機(jī)串
    signature: '',// 必填函匕,簽名,見附錄1
    jsApiList: [] // 必填蚪黑,需要使用的JS接口列表盅惜,所有JS接口列表見附錄2
});

簽名算法生成規(guī)則

官方參考文檔

下面具體來講講 開源項(xiàng)目weixin_guide中的封裝中剩。

使用的時(shí)候只要在Controller方法上添加一個(gè)攔截器 JSSDKInterceptor 來實(shí)現(xiàn)簽名驗(yàn)證再將wx.config需要的參數(shù)設(shè)置對應(yīng)的屬性在頁面上進(jìn)行獲取。

攔截器實(shí)現(xiàn)如下:

public class JSSDKInterceptor   implements Interceptor{
  /**
   * 如果要支持多公眾賬號酷窥,只需要在此返回各個(gè)公眾號對應(yīng)的 ApiConfig 對象即可 可以通過在請求 url 中掛參數(shù)來動態(tài)從數(shù)據(jù)庫中獲取
   * ApiConfig 屬性值
   */
  public ApiConfig getApiConfig() {
    ApiConfig ac = new ApiConfig();

    // 配置微信 API 相關(guān)常量
    ac.setToken(PropKit.get("token"));
    ac.setAppId(PropKit.get("appId"));
    ac.setAppSecret(PropKit.get("appSecret"));

    /**
     * 是否對消息進(jìn)行加密咽安,對應(yīng)于微信平臺的消息加解密方式: 1:true進(jìn)行加密且必須配置 encodingAesKey
     * 2:false采用明文模式,同時(shí)也支持混合模式
     */
    ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false));
    ac.setEncodingAesKey(PropKit.get("encodingAesKey",
        "setting it in config file"));
    return ac;
  }
  
  @Override
  public void intercept(Invocation inv) {
    inv.invoke();
    Controller controller = inv.getController();
    ApiConfigKit.setThreadLocalApiConfig(getApiConfig());
    JsTicket jsApiTicket = JsTicketApi.getTicket(JsApiType.jsapi);
    String jsapi_ticket = jsApiTicket.getTicket();
    String nonce_str = create_nonce_str();
    // 注意 URL 一定要?jiǎng)討B(tài)獲取蓬推,不能 hardcode.
    String url = "http://" + controller.getRequest().getServerName() // 服務(wù)器地址
        // + ":"
        // + getRequest().getServerPort() //端口號
        + controller.getRequest().getContextPath() // 項(xiàng)目名稱
        + controller.getRequest().getServletPath();// 請求頁面或其他地址
    String qs = controller.getRequest().getQueryString(); // 參數(shù)
    if (qs != null) {
      url = url + "?" + (controller.getRequest().getQueryString());
    }
    System.out.println("url>>>>" + url);
    String timestamp = create_timestamp();
    // 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序
    //注意這里參數(shù)名必須全部小寫妆棒,且必須有序
    String  str = "jsapi_ticket=" + jsapi_ticket +
        "&noncestr=" + nonce_str +
        "&timestamp=" + timestamp +
        "&url=" + url;

    String signature = HashKit.sha1(str);

    System.out.println("appId " + ApiConfigKit.getApiConfig().getAppId()
        + "  nonceStr " + nonce_str + " timestamp " + timestamp);
    System.out.println("url " + url + " signature " + signature);
    System.out.println("nonceStr " + nonce_str + " timestamp " + timestamp);
    System.out.println(" jsapi_ticket " + jsapi_ticket);
    System.out.println("nonce_str  " + nonce_str);
    
    controller.setAttr("appId", ApiConfigKit.getApiConfig().getAppId());
    controller.setAttr("nonceStr", nonce_str);
    controller.setAttr("timestamp", timestamp);
    controller.setAttr("url", url);
    controller.setAttr("signature", signature);
    controller.setAttr("jsapi_ticket", jsapi_ticket);
  }

  private static String create_timestamp() {
    return Long.toString(System.currentTimeMillis() / 1000);
  }

  private static String create_nonce_str() {
    return UUID.randomUUID().toString();
  }
}

在Controller中使用

/**
 * 對整個(gè)Controller或者其中的方法添加JSSDK簽名驗(yàn)證攔截器
 */
@Before(JSSDKInterceptor.class)
public class JSSDKController extends Controller{
  //@Before(JSSDKInterceptor.class)
  public void index(){
    render("share.jsp");
  }
  
  public void customer(){
    render("customer.jsp");
  }
  
  public void pic(){
    render("pic.jsp");
  }
}

JSP頁面上面使用

<script type="text/javascript">
 wx.config({
    debug: true,
      appId:'${appId}',
      timestamp: '${timestamp}',
      nonceStr: '${nonceStr }',
      signature: '${signature}',
      jsApiList: [
        'checkJsApi',
        'onMenuShareTimeline',
        'onMenuShareAppMessage',
        'onMenuShareQQ',
        'onMenuShareWeibo',
        ...
      ]
  });

  </script>

測試結(jié)果

在AppConfig 中添加路由me.add("/jssdk", JSSDKController.class,"/view");手機(jī)中訪問 http://域名[/項(xiàng)目名稱]/jssdk ,如果設(shè)置了 debug= true 成功了就會彈出

JSSDK 簽名驗(yàn)證.png

如果出現(xiàn) {"errorMsg":"config:invalid url domian"} 請檢查步驟一:綁定域名 與你訪問的域名是否在安全域名列表當(dāng)中

步驟四:通過ready接口處理成功驗(yàn)證

config信息驗(yàn)證后會執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后沸伏,config是一個(gè)客戶端的異步操作糕珊,所以如果需要在頁面加載時(shí)就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行毅糟。對于用戶觸發(fā)時(shí)才調(diào)用的接口红选,則可以直接調(diào)用,不需要放在ready函數(shù)中姆另。

wx.ready(function(){
    // 1 判斷當(dāng)前版本是否支持指定 JS 接口喇肋,支持批量判斷
  document.querySelector('#checkJsApi').onclick = function () {
    wx.checkJsApi({
      jsApiList: [
        'getNetworkType',
        'previewImage'
      ],
      success: function (res) {
        alert(JSON.stringify(res));
      }
    });
  };
//下面就可以寫一系列的接口了
......
});

步驟五:通過error接口處理失敗驗(yàn)證

wx.error(function (res) {
  alert(res.errMsg);
});

步驟六:接口調(diào)用

攔截器具體實(shí)現(xiàn) 參考地址 點(diǎn)這里
js 接口調(diào)用參考地址 點(diǎn)這里

以上就是JSSDK使用的介紹。
歡迎留言迹辐、轉(zhuǎn)發(fā)蝶防、打賞項(xiàng)目

源碼參考地址 點(diǎn)我點(diǎn)我--歡迎Start

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市明吩,隨后出現(xiàn)的幾起案子间学,更是在濱河造成了極大的恐慌,老刑警劉巖印荔,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件低葫,死亡現(xiàn)場離奇詭異,居然都是意外死亡仍律,警方通過查閱死者的電腦和手機(jī)嘿悬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來水泉,“玉大人鹊漠,你說我怎么就攤上這事〔栊校” “怎么了躯概?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長畔师。 經(jīng)常有香客問我娶靡,道長,這世上最難降的妖魔是什么看锉? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任姿锭,我火速辦了婚禮塔鳍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呻此。我一直安慰自己轮纫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布焚鲜。 她就那樣靜靜地躺著掌唾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忿磅。 梳的紋絲不亂的頭發(fā)上糯彬,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音葱她,去河邊找鬼撩扒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吨些,可吹牛的內(nèi)容都是我干的搓谆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼豪墅,長吁一口氣:“原來是場噩夢啊……” “哼挽拔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起但校,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啡氢,沒想到半個(gè)月后状囱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倘是,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年亭枷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搀崭。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叨粘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘤睹,到底是詐尸還是另有隱情升敲,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布轰传,位于F島的核電站驴党,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏获茬。R本人自食惡果不足惜港庄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一倔既、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹏氧,春花似錦渤涌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笨篷,卻和暖如春瞳秽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背率翅。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工练俐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冕臭。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓腺晾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辜贵。 傳聞我的和親對象是個(gè)殘疾皇子悯蝉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容