java获取微信JS SDK

关于微信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+"&timestamp="+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;
    }

猜你喜欢

转载自blog.csdn.net/fx9590/article/details/81172670