springboot 获取微信openid和手机号

springboot 获取微信openid和手机号

获取微信openid

  1. 导入依赖
<!--Request依赖-->
<dependency>
   <groupId>com.github.kevinsawicki</groupId>
   <artifactId>http-request</artifactId>
   <version>6.0</version>
</dependency>
  1. WxMiniConfig.AppIdWxMiniConfig.AppSecret 是对应小程序的 appidsecret
/**
* 小程序授权
*/
@GetMapping("getOpenId/website")
public Result<?> getMiniAppOpenId(@RequestParam(value = "js_code", required = true) String js_code) {
    Map<String, String> data = new HashMap<String, String>();
    data.put("appid", WxMiniConfig.AppId);
    data.put("secret", WxMiniConfig.AppSecret);
    data.put("js_code", js_code);
    data.put("grant_type", "authorization_code");

    String response = HttpRequest.get("https://api.weixin.qq.com/sns/jscode2session").form(data).body();

    //JSONObject obj= JSON.parseObject(response);//将json字符串转换为json对
    return R.success(response);
}

获取手机号

  1. 导入依赖:
<dependency>
   <groupId>org.bouncycastle</groupId>
   <artifactId>bcprov-jdk16</artifactId>
   <version>1.46</version>
</dependency>
  1. 参数:
@Data
public class PhoneNumberParam implements Serializable {
    private String encryptedData;
    private String session_key;
    private String iv;
}
  1. 接口代码:
/**
* 获取微信手机号
*/
@PostMapping(value = "getMiniPhoneNum/website")
public Result<?> getPhoneNumber(@RequestBody PhoneNumberParam phoneNumberParam) {
   // 被加密的数据
   byte[] dataByte = Base64.decode(phoneNumberParam.getEncryptedData());
   // 加密秘钥
   byte[] keyByte = Base64.decode(phoneNumberParam.getSession_key());
   // 偏移量
   byte[] ivByte = Base64.decode(phoneNumberParam.getIv());
   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/PKCS5Padding");
       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");
           System.out.println(result);
           return R.success(result);
       }
   } catch (Exception e) {
       e.printStackTrace();
       return R.error(e.toString());
   }
   return R.error();
}

版权声明:本文为weixin_45703665原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。