小程序-JAVA服务端解密与微信绑定的手机号

JAVA服务端解密与微信绑定的手机号

背景介绍

在前段时间公司开发小程序的项目中,服务端需要配合前端获取当前用户与微信绑定的手机号;需要以下两步:
1.根据前端所传的code通过服务端调微信接口获取openId,sessionkey;
2.根据前端所传的encrypdata,ivdata,sessionKey服务端进行解密后得到手机号

前提工作

首先在微信公众平台申请小程序公众号,申请成功后就能获取到 appid 和 secret两参数

代码展示

获取微信openId sessionKey

参数:
code:为前端传入
MINI_PROGRAM_REQUEST_URL :https://api.weixin.qq.com/sns/jscode2session
MINI_PROGRAM_APPID:小程序appid
MINI_PROGRAM_SECRET :小程序secret

/**
     *  <desc>
     *      获取微信openId sessionKey
     *  </desc>
     *
     * @param code 微信参数
     * @return
     * @createDate 2018/12/7
     */
    @RequestMapping(path = "/getOpenId",method = RequestMethod.POST)
    @ResponseBody
    public MessageVO getOpenId(String code){
        Map<String, Object> map = new HashMap<>();
        String status = "1";
        String msg = "ok";
        String requestUrl = MINI_PROGRAM_REQUEST_URL +"?appid="+MINI_PROGRAM_APPID+"&secret="+MINI_PROGRAM_SECRET+"&js_code="+code+"&grant_type=authorization_code";
        try {
            if(StringUtils.isBlank(code)){
                status = "0";//失败状态
                msg = "code为空";
            }else {
                System.out.println(requestUrl);
                // 发起GET请求获取凭证
                JSONObject jsonObject = HttpProtocolUtil.httpsRequest(requestUrl, "GET", null);
                if (jsonObject != null) {
                    try {
                        map.put("openid", jsonObject.getString("openid"));
                        map.put("session_key", jsonObject.getString("session_key"));
                    } catch (JSONException e) {
                        // 获取token失败
                        status = "0";
                        msg = "code无效";
                    }
                }else {
                    status = "0";
                    msg = "code无效";
                }
            }
            map.put("status", status);
            map.put("msg", msg);
        } catch (Exception e) {
            throw new DataAccessException("【小程序】获取openId失败",e);
        }
        return new MessageVO(BaseErrorCodeEnum.SUCCESS.getErrorCode(),map);
    }

解密与微信绑定的手机号

/**
     *  <desc>
     *      解密与微信绑定的手机号
     *  </desc>
     *
     * @param encrypdata 微信参数
     * @param ivdata 微信参数
     * @param sessionKey 会话密钥
     * @return
     * @createDate 2018/11/24
     */
    @RequestMapping(path = "/getPhoneNum",method = RequestMethod.POST)
    @ResponseBody
    public MessageVO getPhoneNum(String encrypdata,String ivdata,String sessionKey){
        try {
            if(StringUtils.isEmpty(encrypdata) || StringUtils.isEmpty(ivdata) || StringUtils.isEmpty(sessionKey)){
                return new MessageVO(BaseErrorCodeEnum.NOT_PARAM.getErrorCode());
            }
            byte[] encrypData = Base64.decode(encrypdata);
            byte[] ivData = Base64.decode(ivdata);
            byte[] sessionKeyByte = Base64.decode(sessionKey);
            AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec keySpec = new SecretKeySpec(sessionKeyByte, "AES");
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            //解析解密后的字符串 
            String phoneNum = new String(cipher.doFinal(encrypData),"UTF-8");

            return  new MessageVO(BaseErrorCodeEnum.SUCCESS.getErrorCode(),phoneNum);
        }catch (Exception e){
            throw new DataAccessException("【小程序_注册登录版块】解密与微信绑定的手机号失败",e);
        }
    }

猜你喜欢

转载自blog.csdn.net/songjuguang/article/details/89475596