微信认证授权详细代码示例
背景
公司有个H5页面分享到微信之后不显示图片,且样式跟其他应用的分享卡片存在差异.后来发现是因为没有调用微信统一的分享接口.下面就是我踩坑踩出来的心得.
开发前必须知道的东西
- 要有一个公众号,有了公众号就会有appId和appsecret.
- 要有一个外网可以访问的域名,测试的话,可以用内网穿透工具,比如natapp.
- 微信公众号接口必须以http://或https://开头,分别支持80端口和443端口
- 可以阅读微信的JS-SDK的说明文档
操作步骤
1 HttpUtil工具类的编写
这个工具类的作用就是获取签名,可分为四步:
- 根据appId和appsecret获取access_token;
- 使用access_token获取jsapi_ticket;
- 使用时间戳,随机数,jsapi_ticket和要访问的url按照签名算法拼接字符串;
- 对第三步的字符串进行SHA1加密,得到签名;
注意: check_signature方法中的clearLove是我的token,记得换成你们自己的
public class HttpUtil {
/**
* 获得ACCESS_TOKEN
* @param appId
* @param appSecret
* @return
*/
public static String getAccess_token(String appId, String appSecret){
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
String accessToken = null;
try
{
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必须是get方式请求
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
JSONObject jsonObj = JSONObject.parseObject(message);
accessToken = jsonObj.getString("access_token");
}
catch (Exception e)
{
e.printStackTrace();
}
return accessToken;
}
/**
* 获得ACCESS_TICKET
*
* @Title: ACCESS_TICKET
* @Description: 获得ACCESS_TICKET
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
public static String getAccess_ticket(String access_token) {
String ticket = null;
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token +"&type=jsapi";//这个url链接和参数不能变
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();