微信公众号对接(网页)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


浙公网安备 33010602011771号