最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java微信公眾平臺開發(fā)(13) 微信JSSDK中Config配置

 更新時間:2017年04月26日 11:34:14   作者:dapengniao  
這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第十三步,微信JSSDK中Config配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前端開發(fā)工程師和關(guān)注前端開發(fā)的開發(fā)者們在2015年中肯定被騰訊的JSSDk引爆過,搞APP的、搞前端的甚至是是搞后端的都跑過來湊熱鬧,但是在我們的技術(shù)眼里它的實現(xiàn)原理和根本是不能夠被改變的,這篇文章就不對其js的實現(xiàn)做任何評價和解說了(因為我也不是很懂,哈哈),這里要說的是它的config配置實現(xiàn),參考文檔:http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html  !

微信JS-SDK是微信公眾平臺面向網(wǎng)頁開發(fā)者提供的基于微信內(nèi)的網(wǎng)頁開發(fā)工具包,通過使用微信JS-SDK,網(wǎng)頁開發(fā)者可借助微信高效地使用拍照、選圖、語音、位置等手機系統(tǒng)的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信用戶提供更優(yōu)質(zhì)的網(wǎng)頁體驗;本篇將面向網(wǎng)頁開發(fā)者介紹微信JS-SDK如何使用及相關(guān)注意事項!JSSDK使用步驟:

步驟一:在微信公眾平臺綁定安全域名
步驟二:后端接口實現(xiàn)JS-SDK配置需要的參數(shù)
步驟三:頁面實現(xiàn)JS-SDk中config的注入配置,并實現(xiàn)對成功和失敗的處理

(一)在微信公眾平臺綁定安全域名

先登錄微信公眾平臺進入“公眾號設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”(如下圖),如果需要使用支付類接口,需要確保支付目錄在支付的安全域名下,否則將無法完成支付?。ㄗⅲ旱卿浐罂稍?ldquo;開發(fā)者中心”查看對應的接口權(quán)限)

(二)后端接口實現(xiàn)JS-SDK配置需要的參數(shù)

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

我們查看js-sdk的配置文檔和以上的代碼可以發(fā)現(xiàn)config的配置需要4個必不可少的參數(shù)appId、timestamp、nonceStr、signature,這里的signature就是我們生成的簽名!

生成簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是公眾號用于調(diào)用微信JS接口的臨時票據(jù)。正常情況下,jsapi_ticket的有效期為7200秒,通過access_token來獲取。由于獲取jsapi_ticket的api調(diào)用次數(shù)非常有限,頻繁刷新jsapi_ticket會導致api調(diào)用受限,影響自身業(yè)務,開發(fā)者必須在自己的服務全局緩存jsapi_ticket ,所以這里我們將jsapi_ticket的獲取放到定時任務中,因為它和token的生命周期是一致的,所以在這里我們將他們放到一起,將原有的定時任務中獲取token的代碼做如下修改:

package com.cuiyongzhi.wechat.common;
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
import net.sf.json.JSONObject;
 
import com.cuiyongzhi.web.util.GlobalConstants;
import com.cuiyongzhi.wechat.util.HttpUtils;
 
/**
 * ClassName: WeChatTask
 * @Description: 微信兩小時定時任務體
 * @author dapengniao
 * @date 2016年3月10日 下午1:42:29
 */
public class WeChatTask {
  /**
   * @Description: 任務執(zhí)行體
   * @param @throws Exception
   * @author dapengniao
   * @date 2016年3月10日 下午2:04:37
   */
  public void getToken_getTicket() throws Exception {
    Map<String, String> params = new HashMap<String, String>();
    //獲取token執(zhí)行體
    params.put("grant_type", "client_credential");
    params.put("appid", GlobalConstants.getInterfaceUrl("appid"));
    params.put("secret", GlobalConstants.getInterfaceUrl("AppSecret"));
    String jstoken = HttpUtils.sendGet(
        GlobalConstants.getInterfaceUrl("tokenUrl"), params);
    String access_token = JSONObject.fromObject(jstoken).getString(
        "access_token"); // 獲取到token并賦值保存
    GlobalConstants.interfaceUrlProperties.put("access_token", access_token);
     
    //獲取jsticket的執(zhí)行體
    params.clear();
    params.put("access_token", access_token);
    params.put("type", "jsapi");
    String jsticket = HttpUtils.sendGet(
        GlobalConstants.getInterfaceUrl("ticketUrl"), params);
    String jsapi_ticket = JSONObject.fromObject(jsticket).getString(
        "ticket"); 
    GlobalConstants.interfaceUrlProperties
    .put("jsapi_ticket", jsapi_ticket); // 獲取到js-SDK的ticket并賦值保存
     
    System.out.println("jsapi_ticket================================================" + jsapi_ticket);
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"token為=============================="+access_token);
 
  }
 
}

然后我們根據(jù)【JS-SDK使用權(quán)限簽名算法】對參數(shù)進行簽名得到signature,這里的url必須采用前端傳遞到后端,因為每次的url會有所變化,如下:

package com.cuiyongzhi.wechat.common;
 
import java.security.MessageDigest;
import java.util.Formatter;
import java.util.HashMap;
import java.util.UUID;
import com.cuiyongzhi.web.util.GlobalConstants;
 
 
/**
 * ClassName: JSSDK_Config
 * @Description: 用戶微信前端頁面的jssdk配置使用
 * @author dapengniao
 * @date 2016年3月19日 下午3:53:23
 */
public class JSSDK_Config {
 
  /**
   * @Description: 前端jssdk頁面配置需要用到的配置參數(shù)
   * @param @return hashmap {appid,timestamp,nonceStr,signature}
   * @param @throws Exception  
   * @author dapengniao
   * @date 2016年3月19日 下午3:53:23
   */
  public static HashMap<String, String> jsSDK_Sign(String url) throws Exception {
    String nonce_str = create_nonce_str();
    String timestamp=GlobalConstants.getInterfaceUrl("timestamp");
    String jsapi_ticket=GlobalConstants.getInterfaceUrl("jsapi_ticket");
    // 注意這里參數(shù)名必須全部小寫,且必須有序
    String string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str
        + "&timestamp=" + timestamp + "&url=" + url;
    MessageDigest crypt = MessageDigest.getInstance("SHA-1");
    crypt.reset();
    crypt.update(string1.getBytes("UTF-8"));
    String signature = byteToHex(crypt.digest());
    HashMap<String, String> jssdk=new HashMap<String, String>();
    jssdk.put("appId", GlobalConstants.getInterfaceUrl("appid"));
    jssdk.put("timestamp", timestamp);
    jssdk.put("nonceStr", nonce_str);
    jssdk.put("signature", signature);
    return jssdk;
 
  }
   
  private static String byteToHex(final byte[] hash) {
    Formatter formatter = new Formatter();
    for (byte b : hash) {
      formatter.format("%02x", b);
    }
    String result = formatter.toString();
    formatter.close();
    return result;
  }
   
  private static String create_nonce_str() {
    return UUID.randomUUID().toString();
  }
 
}

然后我們將后端簽名的方法集成到Controller層,形成代碼如下:

package com.cuiyongzhi.wechat.controller;
 
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.cuiyongzhi.Message;
import com.cuiyongzhi.wechat.common.JSSDK_Config;
 
/**
 * ClassName: WeChatController
 * @Description: 前端用戶微信配置獲取
 * @author dapengniao
 * @date 2016年3月19日 下午5:57:36
 */
@Controller
@RequestMapping("/wechatconfig")
public class WeChatController {
 
  /**
   * @Description: 前端獲取微信JSSDK的配置參數(shù)
   * @param @param response
   * @param @param request
   * @param @param url
   * @param @throws Exception
   * @author dapengniao
   * @date 2016年3月19日 下午5:57:52
   */
  @RequestMapping("jssdk")
  public Message JSSDK_config(
      @RequestParam(value = "url", required = true) String url) {
    try {
      System.out.println(url);
      Map<String, String> configMap = JSSDK_Config.jsSDK_Sign(url);
      return Message.success(configMap);
    } catch (Exception e) {
      return Message.error();
    }
 
  }
 
}

到這里我們后端對jssdk的簽名參數(shù)的封裝就基本完成了,下一步就只需要我們前端調(diào)用就可以了!

(三)頁面實現(xiàn)JS-SDk中config的注入配置,并實現(xiàn)對成功和失敗的處理

在第二步中我們將后端接口代碼完成了,這里新建jssdkconfig.jsp,在jsp頁面用ajax方式獲取并進行配置,并開啟debug模式,打開之后就可以看到配置是否成功的提示,簡單代碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width" />
<title>JSSDk配置</title>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
  function jssdk() {
    $.ajax({
      url : "http://wechat.cuiyongzhi.com/wechatconfig/jssdk",
      type : 'post',
      dataType : 'json',
      contentType : "application/x-www-form-urlencoded; charset=utf-8",
      data : {
        'url' : location.href.split('#')[0]
      },
      success : function(data) {
        wx.config({
          debug : true,
          appId : data.data.appId,
          timestamp : data.data.timestamp,
          nonceStr : data.data.nonceStr,
          signature : data.data.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' ]
        });
      }
    });
  }
 
  function isWeiXin5() {
    var ua = window.navigator.userAgent.toLowerCase();
    var reg = /MicroMessenger\/[5-9]/i;
    return reg.test(ua);
  }
 
  window.onload = function() {
    //   if (isWeiXin5() == false) {
    //      alert("您的微信版本低于5.0,無法使用微信支付功能,請先升級!");
    //     }
    jssdk();
  };
</script>
</head>
<body>
</body>
</html>

最后我們運行代碼,查看運行結(jié)果:

如果提示是這樣,那么標識我們的配置是成功的,那么到這里微信jssdk的配置就基本完成了,下一篇講述【微信web開發(fā)者工具】的使用,歡迎你的翻閱,如有疑問可以留言討論!

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于Gateway路由匹配規(guī)則解讀

    關(guān)于Gateway路由匹配規(guī)則解讀

    本文詳細介紹了SpringCloudGateway的路由匹配規(guī)則,包括基本概念、常用屬性、實際應用以及注意事項,路由匹配規(guī)則決定了請求如何被轉(zhuǎn)發(fā)到目標服務,是Gateway的核心功能之一,在配置路由時需要注意順序、性能和安全性
    2025-02-02
  • 為什么說HashMap線程不安全

    為什么說HashMap線程不安全

    本文主要介紹了為什么說HashMap線程不安全,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 解決Hibernate4執(zhí)行save()或update()無效問題的方法

    解決Hibernate4執(zhí)行save()或update()無效問題的方法

    這篇文章主要為大家詳細介紹了解決Hibernate4執(zhí)行save()或update()無效問題的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 關(guān)于CommandLineRunner的使用詳解

    關(guān)于CommandLineRunner的使用詳解

    本文介紹了如何在SpringBoot項目啟動時使用CommandLineRunner和ApplicationRunner接口進行數(shù)據(jù)預加載或操作,通過實現(xiàn)這兩個接口,可以在項目啟動時執(zhí)行特定的任務,同時,還展示了如何使用@Order注解來控制多個實現(xiàn)類的加載順序
    2024-12-12
  • Spring定時任務無故停止又不報錯的解決

    Spring定時任務無故停止又不報錯的解決

    這篇文章主要介紹了Spring定時任務無故停止又不報錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • IDEA切換JDK版本超詳細操作步驟記錄

    IDEA切換JDK版本超詳細操作步驟記錄

    在我們項目開發(fā)的過程中可能會遇到JDK版本過高或者過低導致一些程序無法啟動,不兼容的問題,所以我們需要切換JDK的版本號,這篇文章主要給大家介紹了關(guān)于IDEA切換JDK版本的超詳細操作步驟,需要的朋友可以參考下
    2024-03-03
  • Springboot注入成員變量HttpServletRequest的原理分析

    Springboot注入成員變量HttpServletRequest的原理分析

    這篇文章主要介紹了Springboot注入成員變量HttpServletRequest的原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringSecurity+Mysql數(shù)據(jù)庫實現(xiàn)用戶安全登錄認證的實踐

    SpringSecurity+Mysql數(shù)據(jù)庫實現(xiàn)用戶安全登錄認證的實踐

    Spring Security 是一個提供身份認證、授權(quán)和防范常見攻擊的安全權(quán)限框架,本文主要介紹了SpringSecurity+Mysql數(shù)據(jù)庫實現(xiàn)用戶安全登錄認證的實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • mybatisPlus中批量刪除的示例代碼

    mybatisPlus中批量刪除的示例代碼

    本文主要介紹了mybatisPlus中批量刪除的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • springboot項目如何設(shè)置session的過期時間

    springboot項目如何設(shè)置session的過期時間

    這篇文章主要介紹了springboot項目如何設(shè)置session的過期時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

进贤县| 长顺县| 丹凤县| 桐庐县| 阿巴嘎旗| 荣成市| 象州县| 远安县| 庆安县| 永寿县| 政和县| 青海省| 洞口县| 吉木萨尔县| 托里县| 夏邑县| 仁怀市| 疏勒县| 珲春市| 宾阳县| 富顺县| 榕江县| 龙州县| 宜都市| 南召县| 东兴市| 昌邑市| 齐齐哈尔市| 林西县| 玛纳斯县| 玛沁县| 岳阳市| 奉化市| 天气| 嘉黎县| 连江县| 巩留县| 诸暨市| 阿合奇县| 仁布县| 太谷县|