微信公众号对接(网页)H5

  • 微信公众号的菜单中对接外部网页

0x000:登录开发者的微信公众平台,在如下设置自定义菜单,页面地址(是域名)(ip没有测试),在点击 保存并发布

0x001:在手机公众号上就能看到刚添加的

 

 

0x002:部署网页域名下的服务,然后在PC端的网页下测试域名服务是否起来了(链路是否可达),自此基本服务算是起来了,但想在微信中访问还是有可能不行,

 

 

0x003:在微信中访问还需在微信公众号开发者平台设置IP白名单

 

 

 这样在开发环境下(白名单ip),就能访问微信的 https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html  获取access_token ,

在获取到access _token 后在sha1算法签名(https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62),得到jsApiTicket , 注意get的url地址[自己写错过😂]

 

 

 0x004:js安全域名绑定,然后在微信公众平台后台下载文件 ,并将文件传入服务器上(路径为域名根路径【nginx:代理的及为服务目录下的root 根路径】)

 下载文件:

 

 

上传文件到域名服务器[实际服务可在域名代理的其他机器上] 

 

 

 0x005: 自此服务链路应都打通了

 

0x006:部分代码:

 

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import org.springframework.util.StringUtils;

import java.util.SortedMap;
import java.util.TreeMap;

public class WeiXinJsSDK {

    public static void main(String []args) throws Exception{
        WeiXinJsSDK weixinApplicationTests = new WeiXinJsSDK();
        weixinApplicationTests.getJsSdkConfig("url","appid","appsecrt");
//        System.out.println("response.getBody()");
    }


    public String getAccessToken(String appid, String secret) {
        String accessToken;
        Unirest.setTimeouts(0, 0);
        String url = "https://api.weixin.qq.com/cgi-bin/token?"+
                "grant_type=client_credential&appid="+appid+"&secret="+secret;
        try {
            HttpResponse<String> response = Unirest.get(url)
                    .asString();
            JSONObject jsonObject = JSON.parseObject(response.getBody());
            accessToken = jsonObject.getString("access_token");
            return accessToken;
        } catch (UnirestException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getJsApiTicket(String accessToken) {
        try {
            String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?"+
                    "access_token="+ accessToken+"&type=jsapi";
            HttpResponse<String> response = Unirest.get(url)
                    .asString();
            JSONObject jsonObject = JSON.parseObject(response.getBody());
            String jsApiTicket = jsonObject.getString("ticket");
//            CacheUtils.put("jsApiTicket", jsApiTicket);
            return jsApiTicket;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public JSONObject getJsSdkConfig(String url,String appid,String appSecret) throws Exception {
        JSONObject result = new JSONObject();
        String accessToken = getAccessToken(appid, appSecret);
//        String accessToken = "57_hjv9c1X5RadtWysVQ5skIDrdMtKPeyWDukcdcnmL2qyUoyO05D-aJh4JdJlA7AvG7O-gRJPt51yDAnfwX1l-O8jMpjLeGyUKbxQ8epRQFrhJ-xd74xBFcbYyhGvoCgDK7VFB0MZZkcZ5eVewCHAdAFAPUN";
        if (!StringUtils.isEmpty(accessToken)) {
            String jsApiTicket = getJsApiTicket(accessToken);
            if (!StringUtils.isEmpty(jsApiTicket)) {
                //对JS ticket进行签名
                SortedMap<String, String> map = new TreeMap<>();
                map.put("noncestr", Sha1Util.getNonceStr());
                map.put("jsapi_ticket", jsApiTicket);
                map.put("timestamp", Sha1Util.getTimeStamp());
                map.put("url", url);
                String signature = Sha1Util.createSHA1Sign(map);
                result.put("appId", appid);
                result.put("timestamp", map.get("timestamp"));
                result.put("nonceStr", map.get("noncestr"));
                result.put("signature", signature);
            }
        }
        return result;
    }
}

Sha1Util.java

import java.security.MessageDigest;
import java.util.*;

public class Sha1Util {
    public Sha1Util() {
    }

    public static String getNonceStr() {
        Random random = new Random();
        return Md5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "UTF-8");
    }

    public static String getTimeStamp() {
        return String.valueOf(System.currentTimeMillis() / 1000L);
    }

    public static String createSHA1Sign(SortedMap<String, String> signParams) throws Exception {
        StringBuffer sb = new StringBuffer();
        Set es = signParams.entrySet();
        Iterator it = es.iterator();

        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            String v = (String)entry.getValue();
            sb.append(k + "=" + v + "&");
        }

        String params = sb.substring(0, sb.lastIndexOf("&"));
        return getSha1(params);
    }

    public static String getSha1(String str) {
        if (str != null && str.length() != 0) {
            char[] hexDigits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

            try {
                MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
                mdTemp.update(str.getBytes("UTF-8"));
                byte[] md = mdTemp.digest();
                int j = md.length;
                char[] buf = new char[j * 2];
                int k = 0;

                for(int i = 0; i < j; ++i) {
                    byte byte0 = md[i];
                    buf[k++] = hexDigits[byte0 >>> 4 & 15];
                    buf[k++] = hexDigits[byte0 & 15];
                }

                return new String(buf);
            } catch (Exception var9) {
                return null;
            }
        } else {
            return null;
        }
    }
}

Md5Util.java

import java.security.MessageDigest;

public class Md5Util {

    private static final String[] hexDigits = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

    public Md5Util() {
    }

    public static String getMD5(String message) {
        String md5 = "";

        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageByte = message.getBytes("UTF-8");
            byte[] md5Byte = md.digest(messageByte);
            md5 = bytesToHex(md5Byte).toLowerCase();
        } catch (Exception var5) {
            var5.printStackTrace();
        }

        return md5;
    }

    public static String bytesToHex(byte[] bytes) {
        StringBuffer hexStr = new StringBuffer();

        for(int i = 0; i < bytes.length; ++i) {
            int num = bytes[i];
            if (num < 0) {
                num += 256;
            }

            if (num < 16) {
                hexStr.append("0");
            }

            hexStr.append(Integer.toHexString(num));
        }

        return hexStr.toString().toUpperCase();
    }

    public static String MD5Encode(String origin, String charsetname) {
        String resultString = null;

        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname != null && !"".equals(charsetname)) {
                resultString = byteArrayToHexString(md.digest(origin.getBytes(charsetname)));
            } else {
                resultString = byteArrayToHexString(md.digest(origin.getBytes()));
            }
        } catch (Exception var4) {
            var4.printStackTrace();
        }

        return resultString;
    }

    private static String byteArrayToHexString(byte[] b) {
        StringBuilder resultSb = new StringBuilder();

        for(int i = 0; i < b.length; ++i) {
            resultSb.append(byteToHexString(b[i]));
        }

        return resultSb.toString();
    }

    private static String byteToHexString(byte b) {
        int n = b;
        if (b < 0) {
            n = b + 256;
        }

        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }
}

前端调用:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#2

 

posted @ 2022-05-24 17:45  my——master  阅读(998)  评论(0)    收藏  举报