微信企業號 調用 JS-SDK 實現接口功能

思路:調用微信的 js-sdk 接口最重要的是要實現 config 接口 。而且持久化配置以下三個參數

    timestamp: ,  //必填,生成簽名的時間戳
    nonceStr: '', // 必填,生成簽名的隨機串
    signature: '',// 必填,簽名,見附錄1
wx.config({
    debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。
    appId: '', // 必填,企業號的惟一標識,此處填寫企業號corpid
    timestamp: , // 必填,生成簽名的時間戳
    nonceStr: '', // 必填,生成簽名的隨機串
    signature: '',// 必填,簽名,見附錄1
    jsApiList: [] // 必填,須要使用的JS接口列表,全部JS接口列表見附錄2
});

另外,借用

weixin-java-tools

這個開源項目。作開發

1、按照面向對象將這些參數持久化

     WxJsapiSignaturejava

package me.chanjar.weixin.common.bean;

import java.io.Serializable;

/**
 * jspai signature
 * 說明:這裏借用Chanjar 開源企業號開發的方法。http://www.oschina.net/p/weixin-java-tools
 */
public class WxJsapiSignature implements Serializable {

  private String noncestr;

  private String jsapiTicket;

  private long timestamp;

  private String url;

  private String signature;

  public String getSignature() {
    return signature;
  }

  public void setSignature(String signature) {
    this.signature = signature;
  }

  public String getNoncestr() {
    return noncestr;
  }

  public void setNoncestr(String noncestr) {
    this.noncestr = noncestr;
  }

  public String getJsapiTicket() {
    return jsapiTicket;
  }

  public void setJsapiTicket(String jsapiTicket) {
    this.jsapiTicket = jsapiTicket;
  }

  public long getTimestamp() {
    return timestamp;
  }

  public void setTimestamp(long timestamp) {
    this.timestamp = timestamp;
  }

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

}


2、根據微信提供方法生成 signature

2.1生成隨機字符串
package me.chanjar.weixin.common.util;
/*
*說明:這裏借用Chanjar 開源企業號開發的方法。http://www.oschina.net/p/weixin-java-tools
*/

public class RandomUtils {

  private static final String RANDOM_STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

  private static final java.util.Random RANDOM = new java.util.Random();

  public static String getRandomStr() {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 16; i++) {
      sb.append(RANDOM_STR.charAt(RANDOM.nextInt(RANDOM_STR.length())));
    }
    return sb.toString();
  }

}
/***
 * 用於得到調用微信js api 接口生成簽名準備
 * 說明:這裏借用Chanjar 開源企業號開發的方法。http://www.oschina.net/p/weixin-java-tools
 * ***/
  public WxJsapiSignature createJsapiSignature(String url) throws WxErrorException {
    long timestamp = System.currentTimeMillis() / 1000;
    String noncestr = RandomUtils.getRandomStr();
    String jsapiTicket = getJsapiTicket(false);
    try {
      String signature = SHA1.genWithAmple(
          "jsapi_ticket=" + jsapiTicket,
          "noncestr=" + noncestr,
          "timestamp=" + timestamp,
          "url=" + url
      );
      WxJsapiSignature jsapiSignature = new WxJsapiSignature();
      jsapiSignature.setTimestamp(timestamp);
      jsapiSignature.setNoncestr(noncestr);
      jsapiSignature.setUrl(url);
      jsapiSignature.setSignature(signature);
      return jsapiSignature;
    } catch (NoSuchAlgorithmException e) {
      throw new RuntimeException(e);
    }
  }
  /***
 * 用於得到調用微信js api 接口生成簽名準備
 * 說明:這裏借用Chanjar 開源企業號開發的方法。http://www.oschina.net/p/weixin-java-tools
 * ***/
 public String getJsapiTicket(boolean forceRefresh) throws WxErrorException {
    if (forceRefresh) {
      wxCpConfigStorage.expireJsapiTicket();// wxCpConfigStorage 這個類,主要用於存儲一些重要的須要被共享或者同步更新的參數。expireJsapiTicket()這個方法就是將參數的有效期時間更新爲0或者負數
    }
    if (wxCpConfigStorage.isJsapiTicketExpired()) {
      synchronized (globalJsapiTicketRefreshLock) {//申明一個對象用於同步鎖用。 protected final Object globalJsapiTicketRefreshLock = new Object();
        if (wxCpConfigStorage.isJsapiTicketExpired()) {
          String url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket";
          String responseContent = execute(new SimpleGetRequestExecutor(), url, null);
          JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));//返回數據json化
          JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
          
          String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
          int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
          wxCpConfigStorage.updateJsapiTicket(jsapiTicket, expiresInSeconds);
        }
      }
    }
    return wxCpConfigStorage.getJsapiTicket();
  }

3、根據訪問的URL 動態生成簽名

備註:這裏纔有spring框架,也能夠不用。
ajax

/** * 微信js-api 用於得到jsticket *
* js url 是用於生成調用js api的簽名的url
*/
	@RequestMapping(value = "/wechat.do")
	public void JsApiGet(@RequestParam String url,HttpServletResponse response) {// 用於ajax 請求的時候得到相關數據,url 爲須要生成簽名的。			  				  							// 異構的時候返回jsticket
		 Writelog.writetolog("進來wechat.do:"+url);
		if (null != url && !url.equals("")) {// 若是獲取加密的URL 不爲空
			try {
				Writelog.writetolog("jsurl:"+url);// 獲取鏈接的url
				WxJsapiSignature wxjssignature = wxserv
						.createJsapiSignature(url);// 根據添加的url 生成signature
               Gson gson=new Gson();//實例化 Gson 對象,借用Google 的json jar包
               String signatureString=gson.toJson(wxjssignature);
               Writelog.writetolog("signatureString:"+signatureString);// 獲取鏈接的url
               PrintWriter out = response.getWriter();//輸出數據到response裏面 
               out.write(signatureString);            //返回 json 化的對象的數據
			} catch (WxErrorException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		}
	}
相關文章
相關標籤/搜索