package com.project.common.utils.wx; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import java.util.HashMap; import java.util.Map; /** * @author zsc * @date 2020/7/17 */ @Slf4j public class AppletsWeChatUtil { // 登录凭证校验地址 public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code"; // 小程序的appId以及appSecret private static final String appId = "wx40ebd17aea073b38"; private static final String appSecret = "707372770de279e04a2fc26cc852456c"; /** * 小程序授权获取openID和unionID * * @return */ public static Map oauth2GetUnion(String code) { String requestUrl = GetPageAccessTokenUrl.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code); Map result = new HashMap<>(); try { /** * HttpUtil工具类会在下方贴出,此处也可换成自己的写法,只要是get请求就可以 * 此处请求返回的json数据包为: * openid string 用户唯一标识 * session_key string 会话密钥 * unionid string 用户在开放平台的唯一标识符 * errcode number 错误码 * errmsg string 错误信息 */ String response = HttpUtil.get(requestUrl); JSONObject jsonResult = JSONObject.parseObject(response); System.out.println(jsonResult.toString()); String openid = String.valueOf(jsonResult.get("openid")); // 若用户没有改小程序同主体公众号,则此处unionID为空 String unionid = String.valueOf(jsonResult.get("unionid")); result.put("openid", openid); result.put("unionid",unionid); } catch (Exception e) { log.info("授权获取unionid出现异常"); e.printStackTrace(); } return result; } /** * 小程序授权 * @param code WxCode * @param encryptedData 加密数据 * @param iv 偏移量iv * @return */ public static Map oauth2GetUnionIdAndInfo(String code,String encryptedData,String iv) { String requestUrl = GetPageAccessTokenUrl.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code); Map result = new HashMap<>(); try { String response = HttpUtil.get(requestUrl); JSONObject jsonObject = JSONObject.parseObject(response); String openid = String.valueOf(jsonObject.get("openid")); // 获取解密所需的session_key String session_key = String.valueOf(jsonObject.get("session_key")); // 通过AES解密encryptedData 获取union_id,工具类见下方 String encryptedResult = AESUtil.decrypt(encryptedData, session_key, iv, "UTF-8"); /** * 此处解密之后数据包格式为: * openid string 用户唯一标识 * nickName string 昵称 * gender string 性别 * city string 城市 * province string 省份 * country string 国家 * avatarUrl string 头像 * unionId string 用户在开放平台的唯一标识符 * watermark JSON 数据水印,包括appid,timestamp字段 为了校验数据的有效性 */ JSONObject parseObject = JSONObject.parseObject(encryptedResult); System.out.println(parseObject.toString()); // ps:此处一定要注意解密的出来的字段名为驼峰命名的unionId,openId,并非直接授权的unionid String unionid = String.valueOf(parseObject.get("unionId")); result.put("openid", openid); result.put("unionid",unionid); } catch (Exception e) { log.info("授权获取unionid出现异常"); e.printStackTrace(); } return result; } }