关于微信js sdk作用可以干嘛这里不再表述,可以直接查看官方文档,这里直接上代码,注释中会说明步骤。
第三方库用了jsoup,用httpclient也可以个人习惯用jsoup它更轻量一些
package com.yb.controller.wechat;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.joda.time.DateTime;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.yb.bean.Msg;
import com.yb.tool.Constant;
/**
* @author kk
* 微信JS SDK
*/
@Controller
public class WechatJSSDK {
@Autowired
Constant constant;
@RequestMapping("/getWechatJSSDK")
@ResponseBody
public Msg getWechatJSSDK() throws NoSuchAlgorithmException {
Map<String, String> map = new HashMap<>();
String access_token = "";
String jsapi_tic = "";
//获取微信AppId 和 appSecret
map = WechatAuthorized.getProperties();
//拼接地址获取token
String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+map.get("AppId")
+"&secret="
+map.get("appSecret")+"";
//调用access_token_url请求 拿到返回的access_token
access_token = parsingURL(access_token_url);
access_token = getStr(access_token);
System.out.println("access_token:"+access_token);
//拿到了access_token 使用access_token 获取到jsapi_ticket
String jsapi_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi";
//调用jsapi_ticket_url 请求拿到jsapi_ticket
jsapi_ticket = parsingURL(jsapi_ticket_url);
jsapi_ticket = getStr(jsapi_ticket);
System.out.println("jsapi_ticket:"+jsapi_ticket);
constant.map.put("access_token", access_token);
/*****************获取签名signature********************/
//生成随机字符串 noncestr
String nonceStr = UUID.randomUUID().toString();
//时间戳 timestamp,精确到秒
String timestamp = Long.toString(System.currentTimeMillis() / 1000);
//url
String Url = "http://gxgt.2ej.com/landfine/webapp/view/reports/reports.html";
String Stitching = "jsapi_ticket="+jsapi_ticket+"&noncestr="+nonceStr+"×tamp="+timestamp+"&url="+Url;
System.out.println("Stitching:"+Stitching);
//SHA1 加密
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.update(Stitching.getBytes());
byte messageDigest[] = digest.digest();
StringBuffer hexStr = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexStr.append(0);
}
hexStr.append(shaHex);
}
//最终获得调用微信js接口验证需要的三个参数noncestr、timestamp、signature 再加上AppId返回前端
return Msg.success()
.add("appid", map.get("AppId"))
.add("timestamp", timestamp)
.add("noncestr", nonceStr)
.add("signature", hexStr)
.add("jsapi_ticket", jsapi_ticket)
.add("Stitching", Stitching);
}
/**
* 发送http请求
*/
public static String parsingURL(String Url) {
String Result = "";
try {
Document doc = Jsoup.connect(Url).ignoreContentType(true).get();
Elements elements = doc.select("body");
for (Element element : elements) {
Result = element.toString();
}
} catch (IOException e) {
e.printStackTrace();
}
return Result;
}
/**
* 解析access_token和jsapi_ticket字符串
*/
public static String getStr(String Str) {
Str = Str.replaceAll("<body>", "").replaceAll("</body>", "").replaceAll("\\s*", "");
Matcher slashMatcher = null;
if(Str.contains("access_token")) {
slashMatcher = Pattern.compile("access_token\\\":.*expires").matcher(Str);
}if(Str.contains("ticket")) {
slashMatcher = Pattern.compile("\"ticket\":\"([^\"]*)\"").matcher(Str);
}
String name = "";
while(slashMatcher.find()){
name = slashMatcher.group();
}
name = name.replace("access_token\":\"", "").replace("\",\"expires", "");
name = name.replace("\"ticket\":\"", "").replace("\"", "");
return name;
}
}
还有一个获取配置文件内容的方法
/**
* 获取配置文件内容
*/
public static Map getProperties() {
Map<String, String> map = new HashMap<String, String>();
Properties properties = new Properties();
InputStream in = null;
try {
in = Thread.currentThread().getContextClassLoader().getResourceAsStream("wx.properties");
properties.load(in);
String AppId = properties.getProperty("appId");
String appSecret = properties.getProperty("appSecret");
map.put("AppId", AppId);
map.put("appSecret",appSecret);
} catch (IOException e) {
e.printStackTrace();
}
return map;
}