微信企业号 调用 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

这个开源项目。做开发

一、按照面向对象将这些参数持久化

     WxJsapiSignature

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;
  }

}


二、根据微信提供方法生成 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();
  }

三、根据访问的URL 动态生成签名

备注:这里才有spring框架,也可以不用。

/** * 微信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();
			}			
		}
	}


你可能感兴趣的:(spring,调用,JS-SDK,微信企业号,实现接口功能)