一、通过code取得用户session_key
private final String AppId="wxcd1755167a4cb";
private final String AppSecret=",,,,,";
public static String JSONObject get(String code){
HttpURLConnection http = null;
InputStream is = null;
String session_key = "";
try {
//授权(必填)
String grant_type = "authorization_code";
//URL
String requestUrl = "https://api.weixin.qq.com/sns/jscode2session?";
//请求参数
String params = "appid=" + AppId + "&secret=" + AppSecret + "&js_code=" + code + "&grant_type=" + grant_type;
String url = requestUrl+params;
URL urlGet = new URL(url);
http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
http.connect();
is =http.getInputStream();
int size =is.available();
byte[] jsonBytes =new byte[size];
is.read(jsonBytes);
String message=new String(jsonBytes,"UTF-8");
JSONObject data = JSONObject.fromObject(message);
session_key =String.valueOf(data.get("session_key"));
} catch (Exception e) {
return "";
}finally {
if(null != http) http.disconnect();
try {
if (null != is) is.close();
}catch (IOException e){
e.printStackTrace();
}
}
return session_key;
}
二、微信小程序页面
onLoad: function () {
//设置分享获取shareTicket
wx.showShareMenu({
withShareTicket: true,
})
}
三、调用登录接口获取用户登录的code,取得session_key,放入缓存
wx.login({
success: function (res) {
if (res.code) {
//发起网络请求
wx.request({
url: 'https://ctm.taoxueqinzi.com/ctmweixin/smprogram/wx/login.htm',
data: {
code: res.code
}, success: function (res) {
console.log(res.data);
var uid = res.data.uid;
var session_key = res.data.session_key;
wx.setStorageSync('uid', uid);
wx.setStorageSync('session_key', session_key);
//由于这里是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.employIdCallback) {
this.employIdCallback(res.data.uid);
}
wx.request({
url: '',
data: {
}, success: function (res) {
}
})
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
});
}
四、根据session_key,encryptedData,iv获取转发群 openGid
public static JSONObject decrypt(String encryptedData,String sessionkey, String iv){
// 被加密的数据
byte[] dataByte = Base64.decodeFast(encryptedData);
// 加密秘钥
byte[] keyByte = Base64.decodeFast(sessionkey);
// 偏移量
byte[] ivByte = Base64.decodeFast(iv);
try {
// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
int base = 16;
if (keyByte.length % base != 0) {
int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
keyByte = temp;
}
// 初始化
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
parameters.init(new IvParameterSpec(ivByte));
cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
byte[] resultByte = cipher.doFinal(dataByte);
if (null != resultByte && resultByte.length > 0) {
String result = new String(resultByte, "UTF-8");
return JSONObject.parseObject(result);
String openGid = jsObj.getString("openGId");//直接从json中取得opengid
}
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
五、在页面转发函数【onShareAppMessage 】中使用【获取转发详细信息】API获取加密数据encryptedData和加密算法iv
/**
* 用户点击右上角分享
*/
onShareAppMessage: function (res) {
if (res.from === 'button') {
// 来自页面内转发按钮
console.log(res.target)
}
return {
title: '朝天门一家人',
path: '/pages/index/index',
success: function (res) {
//转发成功
//getSystemInfo是为了获取当前设备信息,判断是android还是ios,如果是android
//还需要调用wx.getShareInfo(),只有当成功回调才是转发群,ios就只需判断shareTickets
//获取用户设备信息
wx.getSystemInfo({
success: function (d) {
console.log(d);
var session_key = wx.getStorageSync('session_key');
//判断用户手机是IOS还是Android
if (d.platform == 'android') {
wx.getShareInfo({//获取群详细信息
shareTicket: res.shareTickets[0],
success: function (res) {
var encryptedData = res.encryptedData;
var iv = res.iv;
console.log(encryptedData);
console.log(iv);
console.log(session_key);
//发起网络请求
wx.request({
url: 'https://ctm.taoxueqinzi.com/ctmweixin/smprogram/wx/luckDraw.htm',
data: {
uid: uid,
session_key: session_key,
encryptedData: encryptedData,
iv: iv
}, success: function (res) {
var msg = res.data.msg;
wx.showModal({
title: '分享成功',
content: msg,
showCancel: false,
success: function (res) {
wx.navigateTo({
url: '../index/index'
})
}
})
}
})
},
fail: function (res) {//这个方法就是分享到的是好友,给一个提示
wx.showModal({
title: '提示',
content: '分享好友无效,请分享群',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定')
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})
}
})
}
if (d.platform == 'ios') {//如果用户的设备是IOS
if (res.shareTickets != undefined) {
console.log("分享的是群");
wx.getShareInfo({
shareTicket: res.shareTickets,
success: function (res) {
var encryptedData = res.encryptedData;
var iv = res.iv;
//发起网络请求
wx.request({
url: 'https://ctm.taoxueqinzi.com/ctmweixin/smprogram/wx/luckDraw.htm',
data: {
uid: uid,
session_key: session_key,
encryptedData: encryptedData,
iv: iv
}, success: function (res) {
var msg = res.data.msg;
wx.showModal({
title: '分享成功',
content: msg,
showCancel: false,
success: function (res) {
wx.navigateTo({
url: '../index/index'
})
}
})
}
})
}
})
} else {//分享到个人要做的事情,我给的是一个提示
console.log("分享的是个人");
wx.showModal({
title: '提示',
content: '分享好友无效,请分享群',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定')
} else if (res.cancel) {
console.log('用户点击取消')
}
}
})
}
}
}
})
},
fail: function (res) {
// 转发失败
}
}
}
注:微信小程序所有的url请求必须是https的