package org.yeshi.utils.wx;
|
|
import java.io.InputStream;
|
import java.security.AlgorithmParameters;
|
import java.security.Security;
|
import java.util.Arrays;
|
|
import javax.crypto.Cipher;
|
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.SecretKeySpec;
|
|
import org.apache.commons.codec.binary.Base64;
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
import org.yeshi.utils.HttpUtil;
|
import org.yeshi.utils.entity.wx.WXAPPInfo;
|
import org.yeshi.utils.entity.wx.WXMPSessionInfo;
|
import org.yeshi.utils.entity.wx.WXMPUserInfo;
|
|
import com.google.gson.Gson;
|
|
import net.sf.json.JSONObject;
|
|
public class WXXCXUtil {
|
|
public static InputStream getXCXCode(String accessToken, String path, String scene) {
|
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
|
JSONObject data = new JSONObject();
|
data.put("scene", scene);
|
data.put("page", path);
|
// JSONObject color = new JSONObject();
|
// color.put("r", );
|
// color.put("g", );
|
// color.put("b", );
|
//
|
// data.put("line_color", color);
|
|
try {
|
return HttpUtil.postForInputstream(url, data.toString());
|
} catch (Exception e) {
|
return null;
|
}
|
}
|
|
// 获取有限的小程序码
|
public static InputStream getLimitXCXCode(String accessToken, String path) {
|
String url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken;
|
JSONObject data = new JSONObject();
|
data.put("path", path);
|
data.put("width", 500);
|
return HttpUtil.postForInputstream(url, data.toString());
|
}
|
|
public static WXMPSessionInfo getSessionInfo(WXAPPInfo app, String code) {
|
try {
|
String url = String.format(
|
"https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
|
app.getAppId(), app.getAppSecret(), code);
|
String result = HttpUtil.get(url);
|
System.out.println(result);
|
JSONObject json = JSONObject.fromObject(result);
|
WXMPSessionInfo info = new WXMPSessionInfo(json.optString("openid"), json.optString("session_key"),
|
json.optString("unionid"));
|
if (org.yeshi.utils.StringUtil.isNullOrEmpty(info.getOpenId()))
|
return null;
|
return info;
|
} catch (Exception e) {
|
}
|
return null;
|
}
|
|
/**
|
* 通过解密信息获取电话号码
|
*
|
* @param sessionKey
|
* @param encryptedData
|
* @param iv
|
* @return
|
*/
|
public static String getPhoneNumber(String sessionKey, String encryptedData, String iv) {
|
String result = decrpt(sessionKey, encryptedData, iv);
|
if (!org.yeshi.utils.StringUtil.isNullOrEmpty(result)) {
|
JSONObject data = JSONObject.fromObject(result);
|
if (data.optString("countryCode").equalsIgnoreCase("86"))// 只能获取中国的手机号
|
return data.optString("purePhoneNumber");
|
}
|
return null;
|
}
|
|
/**
|
* 获取用户信息
|
*
|
* @param sessionKey
|
* @param encryptedData
|
* @param iv
|
* @return
|
*/
|
public static WXMPUserInfo getUserInfo(String sessionKey, String encryptedData, String iv) {
|
String result = decrpt(sessionKey, encryptedData, iv);
|
if (!org.yeshi.utils.StringUtil.isNullOrEmpty(result)) {
|
WXMPUserInfo userInfo = new Gson().fromJson(result, WXMPUserInfo.class);
|
return userInfo;
|
}
|
return null;
|
}
|
|
private static String decrpt(String sessionKey, String encryptedData, String iv) {
|
try {
|
final Base64 base64 = new Base64();
|
// 被加密的数据
|
byte[] dataByte = base64.decode(encryptedData.getBytes("UTF-8"));
|
// 加密秘钥
|
byte[] keyByte = base64.decode(sessionKey.getBytes("UTF-8"));
|
// 偏移量
|
byte[] ivByte = base64.decode(iv.getBytes("UTF-8"));
|
|
// 如果密钥不足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 result;
|
}
|
} catch (Exception e) {
|
System.out.println(e.getMessage());
|
}
|
return null;
|
|
}
|
|
}
|