微信小程序——获取用户手机号(Java后台)

这篇具有很好参考价值的文章主要介绍了微信小程序——获取用户手机号(Java后台)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最后有完整代码
1、获取code

onShow: function() {
   var that = this;
         //获取用户的本地缓存数据,userinfo信息是在用户授权登录时保存的
         var n = wx.getStorageSync("userinfo");
         //当本地缓存的用户名称不为""或者null时,设置userinfo信息
         if(n.nickName != '' && n.nickName != null){
             this.setData({
                 userinfo: n,
                 hasUserInfo:true,
                 canIUseGetUserProfile:true
             })
             // 通过wx.login获取登录凭证(code),然后通过code去获取我们用户的openid
             wx.login({
               success:(res)=>{
                   console.log(res);
                   that.getOpenId();
               },
             })
         }
 },

2、利用code获取sessionkey
小程序端:

getOpenId(){
   var that=this
  wx.login({
    success (res) {
      if (res.code) {
        //发起网络请求
        wx.request({
          url: '自己的Control路径',
          data: {
            code: res.code
          },
          method: 'get',
          header: {
            'content-type': 'application/json' //默认值
          },
          success: function(res) { //res就是接收后台返回的数据
            console.log(res.data);
            that.setData({
              sessionkey:res.data
            })
          },
        })
      } else {
        console.log('登录失败!' + res.errMsg)
      }
    }
  })
 },
  

Java后台:

 @RequestMapping("名称")                             //获取sessionid
    @ResponseBody
    public static void getOpenId(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String appId="自己的appid";
        String secret="小程序密钥";
        String code=request.getParameter("code");
        System.out.println(code);
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId
                + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
        //这三个参数就是之后要填上自己的值。
        //替换appid,appsecret,和code
        String requestUrl = url;
        //调用get方法发起get请求,并把返回值赋值给returnvalue
        String  returnvalue=GET(requestUrl);
        System.out.println(requestUrl);//打印发起请求的url
        System.out.println(returnvalue);//打印调用GET方法返回值
        //定义一个json对象。
        JSONObject convertvalue=new JSONObject();

        //将得到的字符串转换为json
        convertvalue=(JSONObject) JSON.parse(returnvalue);


        System.out.println("return openid is :"+(String)convertvalue.get("openid")); //打印得到的openid
        System.out.println("return sessionkey is :"+(String)convertvalue.get("session_key"));//打印得到的sessionkey,
        //把openid和sessionkey分别赋值给openid和sessionkey
        String openid=(String) convertvalue.get("openid");
        String sessionkey=(String) convertvalue.get("session_key");//定义两个变量存储得到的openid和session_key.
        Gson gson=new Gson();
        String json = gson.toJson(sessionkey);
        Writer out = response.getWriter();
        out.write(String.valueOf(json));
        out.flush();
    }
    //发起get请求的方法。
    public static String GET(String url) {
        System.out.println("start");//打印发起请求的url
        String result = "";
        BufferedReader in = null;
        InputStream is = null;
        InputStreamReader isr = null;
        try {
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            conn.connect();
            Map<String, List<String>> map = conn.getHeaderFields();
            is = conn.getInputStream();
            isr = new InputStreamReader(is);
            in = new BufferedReader(isr);
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            // 异常记录
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (is != null) {
                    is.close();
                }
                if (isr != null) {
                    isr.close();
                }
            } catch (Exception e2) {
                // 异常记录
            }
        }
        return result;
    }

获取小程序密钥:微信公众平台->开发管理->开发设置
3、获取iv和encryptedData并解密获取手机号

getPhoneNumber(e) { 
   var that=this;
   console.log("手机号:") 
   wx.request({
    url: '自己的Control路径',
    data: {
      sessionkey: that.data.sessionkey,
      iv:e.detail.iv,
      encryptedData:e.detail.encryptedData
    },
    method: 'get',
    header: {
      'content-type': 'application/json' //默认值
    },
    success: function(res) { //res就是接收后台返回的数据
      console.log(res.data);
    },
  })
 } 

java后台:

@RequestMapping("decryptS5")                      //解密获取手机号
    @ResponseBody
    public static String decryptS5(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String sSrc=request.getParameter("encryptedData");
        String encodingFormat="utf-8";
        String sKey=request.getParameter("sessionkey");
        String ivParameter=request.getParameter("iv");
        try {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] raw = decoder.decodeBuffer(sKey);
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            IvParameterSpec iv = new IvParameterSpec(decoder.decodeBuffer(ivParameter));
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] myendicod = decoder.decodeBuffer(sSrc);
            byte[] original = cipher.doFinal(myendicod);
            System.out.println(new String(original, encodingFormat));
            return new String(original, encodingFormat);
        } catch (Exception ex) {
            return null;
        }
    }

如果报错40029则可能是appid不对
4、完整代码
wxml:

<!--index.wxml-->
<view class="banner">
    <view class="topContainer">
        <view catchtap="showBcgImgArea">
            <image class="userinfo-avatar" mode="aspectFill" src="{{userinfo.avatarUrl}}"></image>
        </view>
        <view>
            <text class="userinfo-nickname">{{userinfo.nickName}}</text>
        </view>
    </view>
    <button wx:if="{{!hasUserInfo && canIUseGetUserProfile}}" open-type="getUserInfo" bindtap="getUserProfile" class="userLogin">
        点击登录
    </button>
    <button open-type='getPhoneNumber' bindgetphonenumber="getPhoneNumber">获取用户手机号</button>
</view>

wxss:

.banner {
  border-radius: 10rpx;
  border: none;
  box-sizing: content-box;
  padding: 20rpx 0;
  width: 90%;
  height: 370rpx;
  margin: 20rpx auto;
  background:linear-gradient(109.6deg, rgb(204, 228, 247) 11.2%, rgb(237, 246, 250) 100.2%);
  /* background-image:image("../../images/cloudbg.jpg"); */
  text-align: center;
}

.topContainer {
  width: 100%;
  height: 260rpx;
  background-size: 100%;
  border-radius: 9px;
}
.userinfo-nickname {
  color:black;
}
.userLogin{
  width: 50%;
  box-sizing: none;
  font-size: medium;
}
.userinfo-avatar {
  width: 150rpx;
  height: 150rpx;
  margin-bottom: 10rpx;
  border-radius: 50%;
}

js:

Page({
  data: {
         //用户基本信息(头像、昵称)
         userinfo: {
             avatarUrl:'../../images/ckbg1.png',
             nickName:'未授权'
         },
         //是否已经获取用户信息
         hasUserInfo: false,
         //是否可以调用获取信息得函数
         canIUseGetUserProfile: false,
         sessionkey:"",
         
     },
  //第一次获取用户信息
 getUserProfile : function(e){
         wx.getUserProfile({
           desc: '获取您的微信个人信息',
           success:(res)=>{
               this.setData({
                 userinfo:res.userInfo,
                 hasUserInfo:true
               })
               wx.setStorageSync('userinfo', res.userInfo)
           },
           fail:function(e){
               wx.showToast({
                 title: '你选择了取消',
                 icon: "none",
                 duration: 1500,
                 mask: true
               })
           }
         })
 },
  onLoad: function(n) {
     this.setData({
         canIUseGetUserProfile : true
     })
  
 },
 onShow: function() {
   var that = this;
         //获取用户的本地缓存数据,userinfo信息是在用户授权登录时保存的
         var n = wx.getStorageSync("userinfo");
         //当本地缓存的用户名称不为""或者null时,设置userinfo信息
         if(n.nickName != '' && n.nickName != null){
             this.setData({
                 userinfo: n,
                 hasUserInfo:true,
                 canIUseGetUserProfile:true
             })
             // 通过wx.login获取登录凭证(code),然后通过code去获取我们用户的openid
             wx.login({
               success:(res)=>{
                   console.log(res);
                   that.getOpenId();
               },
             })
         }
 },
 
 getOpenId(){
   var that=this
  wx.login({
    success (res) {
      if (res.code) {
        wx.request({
          url: '       ',
          data: {
            code: res.code
          },
          method: 'get',
          header: {
            'content-type': 'application/json' //默认值
          },
          success: function(res) { //res就是接收后台返回的数据
            console.log(res.data);
            that.setData({
              sessionkey:res.data
            })
          },
        })
      } else {
        console.log('登录失败!' + res.errMsg)
      }
    }
  })
 },
 getPhoneNumber(e) { 
   var that=this;
   console.log("手机号:") 
   wx.request({
    url: '                   ',
    data: {
      sessionkey: that.data.sessionkey,
      iv:e.detail.iv,
      encryptedData:e.detail.encryptedData
    },
    method: 'get',
    header: {
      'content-type': 'application/json' //默认值
    },
    success: function(res) { //res就是接收后台返回的数据
      console.log(res.data);
    },
  })
 } 
 })

Java后台文章来源地址https://www.toymoban.com/news/detail-523313.html

 @RequestMapping("    ")                             //获取sessinoid
    @ResponseBody
    public static void getOpenId(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String appId="                      ";
        String secret="                    ";
        String code=request.getParameter("code");
        System.out.println(code);
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId
                + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
        //这三个参数就是之后要填上自己的值。
        //替换appid,appsecret,和code
        String requestUrl = url;
        //调用get方法发起get请求,并把返回值赋值给returnvalue
        String  returnvalue=GET(requestUrl);
        System.out.println(requestUrl);//打印发起请求的url
        System.out.println(returnvalue);//打印调用GET方法返回值
        //定义一个json对象。
        JSONObject convertvalue=new JSONObject();

        //将得到的字符串转换为json
        convertvalue=(JSONObject) JSON.parse(returnvalue);


        System.out.println("return openid is :"+(String)convertvalue.get("openid")); //打印得到的openid
        System.out.println("return sessionkey is :"+(String)convertvalue.get("session_key"));//打印得到的sessionkey,
        //把openid和sessionkey分别赋值给openid和sessionkey
        String openid=(String) convertvalue.get("openid");
        String sessionkey=(String) convertvalue.get("session_key");//定义两个变量存储得到的openid和session_key.
        Gson gson=new Gson();
        String json = gson.toJson(sessionkey);
        Writer out = response.getWriter();
        out.write(String.valueOf(json));
        out.flush();
    }
    //发起get请求的方法。
    public static String GET(String url) {
        System.out.println("start");//打印发起请求的url
        String result = "";
        BufferedReader in = null;
        InputStream is = null;
        InputStreamReader isr = null;
        try {
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            conn.connect();
            Map<String, List<String>> map = conn.getHeaderFields();
            is = conn.getInputStream();
            isr = new InputStreamReader(is);
            in = new BufferedReader(isr);
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            // 异常记录
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (is != null) {
                    is.close();
                }
                if (isr != null) {
                    isr.close();
                }
            } catch (Exception e2) {
                // 异常记录
            }
        }
        return result;
    }


    /**
     * 解密工具直接放进去即可
     */
    @RequestMapping("decryptS5")                      //解密获取手机号
    @ResponseBody
    public static String decryptS5(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String sSrc=request.getParameter("encryptedData");
        String encodingFormat="utf-8";
        String sKey=request.getParameter("sessionkey");
        String ivParameter=request.getParameter("iv");
        try {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] raw = decoder.decodeBuffer(sKey);
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            IvParameterSpec iv = new IvParameterSpec(decoder.decodeBuffer(ivParameter));
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] myendicod = decoder.decodeBuffer(sSrc);
            byte[] original = cipher.doFinal(myendicod);
            System.out.println(new String(original, encodingFormat));
            return new String(original, encodingFormat);
        } catch (Exception ex) {
            return null;
        }
    }

到了这里,关于微信小程序——获取用户手机号(Java后台)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序中如何获取用户手机号授权登录

    随着微信小程序的普及,许多应用程序需要用户登录才能提供更好的服务。而获取用户手机号码是验证用户身份和确保账户安全的重要步骤之一。因此,在本文中,我们将介绍如何在微信小程序中实现手机号授权登录。 首先,在小程序后台开发设置中勾选“获取手机号”选项

    2024年02月11日
    浏览(106)
  • 微信小程序中获取用户手机号密文数据解密报错问题

    微信小程序获取手机号,官方通常会返回密文数据给我们,此时就需要我们自行解密数据。在揭秘的数据过程中会发现,第一次授权获取手机号会出现错误,再次获取的时候就能够正常获取。 错误信息一般分两种: 密文后端解密的 javax.crypto.BadPaddingException: pad block corrupted(后

    2024年02月15日
    浏览(62)
  • thinkphp微信小程序获取用户手机号极简教程(uniapp演示)

    最近给客户开发小程序,要用到小程序获取手机号的功能,网上很多教程都能实现,但是真的太繁琐了,个人特别不喜欢各种引用和耦合,没打算跨域复用就简简单单写在控制器里就行了,所以这次也把功能简化了,以尽可能的小白视角可以进行使用。 前端比较简单,就是使

    2024年03月10日
    浏览(60)
  • 微信小程序: java实现获取手机号方式

    目录 1. 现在比较简单的方式 - 接口名 --- 功能描述 - 调用方式 --- HTTPS 调用 --- 第三方调用 --- 请求参数 --- 返回参数 2. 实现方式 1. 加入fastjson依赖  2. http请求类 3. Json串工具类 4.接口方法 3.另外介绍一点access_token 微信官方文档介绍:  getPhoneNumber --- 功能描述 该接口需配合手机

    2024年02月16日
    浏览(69)
  • 微信小程序获取手机号登录(Java后端)

    1.前端请求getPhoneNumber方法获取code传给后端接口; 2.后端接口通过配置的appid、secretKey请求接口https://api.weixin.qq.com/cgi-bin/token获取access_token参数; 3.后端通过参数code和参数access_token,去请求接口https://api.weixin.qq.com/wxa/business/getuserphonenumber来获取手机号。

    2024年02月11日
    浏览(73)
  • java实现小程序获取微信登录,用户信息,手机号,头像

    在上面的代码中,首先定义了应用的AppID和AppSecret。然后,实现了获取微信用户access_token的方法getAccessToken()和获取微信用户信息的方法getUserInfo()。其中,getAccessToken()方法需要传入微信小程序登录时获取的code,会返回一个包含access_token和openid的Map;getUserInfo()方法需要传入用户

    2024年02月12日
    浏览(47)
  • (详细版)java实现小程序获取微信登录,用户信息,手机号,头像

    ps:springboot结合mybatisPlus、mysql实现,简单易懂,一件粘贴使用,详细往下看↓          1.注册微信开发平台账号,并创建小程序,获取小程序的AppID和AppSecret。 2.在小程序中引导用户点击按钮触发微信登录,获取到code。 3.将code发送到后端,后端通过code获取用户的openid和

    2024年02月01日
    浏览(59)
  • java springboot+uniapp实现微信小程序获取微信手机号

    https://mp.weixin.qq.com/ 用此功能可能需要首页一些列认证完成后才可以:eg:小程序备案、微信认证等 1、获取AppId和AppSecret 侧开发管理-开发设置-需要获取 AppID(小程序ID) 、**AppSecret(小程序密钥) **。 注意:AppSecret第一次生成后需要自己复制保存,后续虽然可以重置但是重置会相

    2024年02月02日
    浏览(51)
  • 微信小程序 - 2023 年最新授权获取用户手机号详细教程,完美解决 getPhoneNumber 获取不到 code 的问题(老项目使用手机号快速验证组件,打印授权后没有code字段,拿不到cod)

    由于官方修改了 “获取用户手机号” 规则,导致网上几乎所有教程全部失效,本文来做最新详细教程。 2023年8月往后(官方废弃了原来 “免费” 获取用户手机号的相关方法 API,导致了大量小程序原获取手机号的方式失效报错),本文是最新微信小程序 “收费” 获取用户手

    2024年02月17日
    浏览(106)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包