作者:黑糖老姜茶 | 来源:互联网 | 2023-05-19 04:19
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String url=request.getRequestURL()+"?"+request.getQueryString();
%>
主内容调用JS-SDK接口
出去安全考虑,要求所需要的参数都尽量从后台处理返回,处于方便有些就直接输入进去了,这里要注意url的参数也要带上,要不然无法获取到正确的签名
getSignature.do主要是返回微信所需要的一些参数
noncestr可通过随机数函数生成
timestamp是一个时间戳,我这里是用String.valueOf(Calendar.getInstance().getTimeInMillis())这种方式获取时间戳
signature就特别重要了,微信文档中有详细的签名算法步骤来说明如何生成signature.这里贴贴我的简单的实现方式:
首先是按字典序拼接成键值对的字符串:
public String format(){
StringBuffer bf=new StringBuffer();
bf.append("jsapi_ticket=");
bf.append(jsapi_ticket);
bf.append("&nOncestr=");
bf.append(noncestr);
bf.append("&timetamp=");
bf.append(timestamp);
bf.append("&url=");
bf.append(url);
return bf.toString();
}
由于这四个参数名字是固定死的,人工排序就好了,就不用什么函数了,
然后是根据上面得到的串进行SHA1加密:
先附上SHA1加密算法
附上SHA1加密算法:
public static String getSha1(String str) {
if (str == null || str.length() == 0) {
return null;
}
char hexDigits[] = { '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 byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
return null;
}
}
生成签名基本要用到AccessToken,ApiTicket等一系列参数,获取方式请参照微信开发文档或者我前面的章节。