微信企业号 调用 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();
			}			
		}
	}


转载于:https://my.oschina.net/u/2308739/blog/468966

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值