微信小程序获取手机号,含java后台接口实现

news/2024/7/20 1:42:42 标签: java, 小程序

前言

前面写了一篇 java实现微信小程序加密数据解密_女IT玩家-彬彬的博客-CSDN博客

然后接着写微信小程序如何获取手机号,本文既有小程序的实现代码、也有后台java的实现代码哦!!

小程序实现(我用的uni-app)

参考文档:

获取手机号 | 微信开放文档

1、首先必须先有一个button

<u-button slot="right" type="primary" size="mini" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信手机号注册</u-button>

2、实现方法:getPhoneNumber,这个方法的回调就是我们需要的加密数据

javascript">/**
 * 小程序获取手机号
 */
getPhoneNumber(e) {
    console.log(e.detail.errMsg)
    console.log(e.detail.iv)
    console.log(e.detail.encryptedData)
    this.encryptedData = e.detail.encryptedData;
    this.iv = e.detail.iv;
    const that = this;
    wx.checkSession({
        success () {
            //session_key 未过期,并且在本生命周期一直有效
		    that.getWXPhone()
        },
		fail () {
			// session_key 已经失效,需要重新执行登录流程
			const that = this
			wx.login({
			    success(res) {
			        // 发送 res.code 到后台换取 openId, sessionKey, unionId
			        if (res.code) {
			            that.loginCode = res.code;
			            wx.showLoading();
			            if (that.loginCode) {
			                // 执行
							that.getWXPhone()	
			            } else {
			                wx.hideLoading();
			                wx.showModal({
			                    showCancel: false,
			                    content: '登录失败,请重试'
			                })
			            }
			        } else {
			             wx.showModal({
			                 title: '提示',
			                 content: '登录失败,请重试。如问题仍无法解决请联系客服。',
			                 showCancel: false
			             })
			        }
			    },
			    fail(err) {
			        wx.showModal({
			            title: '提示',
			            content: '登录失败,请重试。如问题仍无法解决请联系客服。',
			            showCancel: false
			        })
			    }
		    })
        }
    })
},

3、实现方法:getWXPhone ,这个方法用来访问后端接口,解密加密数据,获取手机号

javascript">/**
 * 获取手机号
 */
getWXPhone() {
    const that = this
    const url = 'wx/getWXPhone';
    const params = {
        code: this.code,
        encryptedData: this.encryptedData,
        iv: this.iv
    }
    console.log('微信登录传递参数', params)
    this.$fetch({url, data: params}).then(res => {
        //  console.log('merchantOfWeChatLogin succ', data);
        console.log(res);
        wx.hideLoading();
        if (res.code === 200 && res.success) {
            console.log(res)
        } else if (res.code === 80) {
            that.visibleOfDialog = true
        } else {
            that.visibleOfDialog = true
            wx.showToast({
                title: res.message,
                icon: 'none'
            })
        }	
    });
},

后台接口实现

说明:因为我的小程序前面有微信登录的操作,已经根据code获得过sessionkey,并存在redis上了,所以在获取手机号的时候,先从redis里取sessionkey,如果没有再重新经过code2session方法获取sessionkey,再解密,从而获取用户的手机号。

java">@ApiOperation(value = "获取微信手机号")
@GetMapping(value = "/getWXPhone")
public Result getWXPhone(CustomerWxLoginVo customerWxLoginVo, HttpServletRequest req) throws Exception {
    Result result = new Result<LoginVo>();
    try {
        /** 参数属性 */
        String code = customerWxLoginVo.getCode();
        String encryptedData = customerWxLoginVo.getEncryptedData();
        String iv = customerWxLoginVo.getIv();
        // 校验信息
        Boolean isExist = redisUtil.hasKey("wx-sessionkey"+code);
        String sessionkey = null;
        if (isExist) {
            sessionkey = (String) redisUtil.get("wx-sessionkey"+code);
            if (StringUtils.isBlank(sessionkey)) {
                throw new Exception("获取手机号失败");
            }
        } else {
            // 根据code获取登录密钥
            JSONObject jsonObject = wxLoginUtil.code2session(appId, appSecret, code);
            if (jsonObject == null) {
                return Result.error("获取手机号失败");
            }
            if (jsonObject.getIntValue("errcode") != 0) {
                return Result.error("获取手机号失败");
            }
            // 本次登录的会话密钥
            sessionkey = jsonObject.getString("session_key");
            if(StringUtils.isBlank(sessionkey)) {
                return Result.error("获取手机号失败");
            }
            redisUtil.set("wx-sessionkey"+code,sessionkey,60*60*24);
        }
        JSONObject jsonObject = wxLoginUtil.wXBizDataCrypt(encryptedData, sessionkey, iv);
        return result.setResult(jsonObject);
    } catch (Exception e) {
        result.error500(e.getMessage());
    }
    return result;
}

wxLoginUtil.code2session 方法实现:

java">// 微信小程序获取openId, sessionKey, unionId
public JSONObject code2session(String appId, String appSecret, String code) throws Exception {
    String url = String.format("https://api.weixin.qq.com/sns/jscode2session?        appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appId, appSecret, code);
    JSONObject result = JSON.parseObject(HttpUtil.get(url));
    log.info("code2session的返回结果:" + result);
    if (!result.containsKey("errcode")) {
        result.put("errcode", "0");
    }
    return result;
}

HttpUtil 使用 hutool 的Api:

hutool: 🍬小而全的Java工具类库,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.16</version>
</dependency>

wxLoginUtil.wXBizDataCrypt 方法实现:

java实现微信小程序加密数据解密_女IT玩家-彬彬的博客-CSDN博客

结果

 接下的就根据需求自己实现吧!!!


http://www.niftyadmin.cn/n/1365347.html

相关文章

不小心把Android Studio的文件夹删了, Android Studio最新版的安装教程图解

总结 不小心误删了Android Studio文件夹也没事&#xff0c;重新装回来了就好&#xff0c;但是别不小心把项目文件夹删了&#xff0c;因为如果你没有push&#xff0c;你本地commit就都没了。。。。所以清空回收站的操作一定要谨慎啊&#xff01; 1 Android Studio 官网 Downl…

JavaScript中各种转换规则记录

阅读目录 前言 Boolean转换规则 Number转换规则 String转换规则 Boolean转换规则 结束语 前言 在javascript中&#xff0c;我学习中比较混乱的就是各种数值类型之间的转换&#xff0c;所以写这篇文章作为记录&#xff0c;如果文中有任何不正确的地方&#xff0c;请大家尽量拍砖…

Program type already present: com.tencent.a.a.a.a.a的解决方法

解决 当你run你的项目的时候&#xff0c;build的过程报错 “Program type already present: com.tencent.a.a.a.a.a” 你就先清除缓存&#xff0c;clean project&#xff0c;然后重新rebuild项目 原因 我产生这个问题是因为&#xff0c;这个app项目是多人开发&#xff0c;我…

小红伞 Avira comctl32 Bad Image 错误

最近电脑休眠后&#xff0c;更新小红伞总是出现错误。 avcenter.exe - Bad Image错误 提示消息如下 avcenter.exe - Bad Image c:\windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\COMCTL32.dll is either not d…

git使用,git上传项目,如何把自己的项目上传到云效 Codeup

为了标识身份&#xff0c;建议先完成 Git 全局设置 git config --global user.name "xxx" git config --global user.email "xxxxxxxxxxqq.com" 方式一&#xff1a;克隆仓库 ( 这个最简单&#xff0c;把仓库拉到本地以后再开发&#xff0c;然后是add、co…

linux+php5.1.6+mysql5.0.2+apache2.0.55安装配置说明

linuxphp5.1.6mysql5.0.2apache2.0.55安装配置说明&#xff1a;一、mysql5.0.2的安装配置过程及说明&#xff1a;1、 #tar -zvxf mysql-5.0.2-alpha.tar.gz2、 cd mysql5.0.23、 ./configure --prefix/usr/local/mysql --sysconfdir/etc --localstatedir/var/lib/mysql --with-…

H5的js调用安卓的方法

前言 一个应用既有安卓端又有ios端&#xff0c;为了同步时间进度&#xff0c;打算用H5网页替代原生的方法&#xff0c;那么在H5中&#xff0c;网页的返回按钮怎么调用安卓的方法&#xff0c;finish掉Activity呢&#xff1f; 方法1 安卓&#xff1a; // webview的配置 webvi…

javascript判断窗口关闭事件

<script languagejavascript>function window.onbeforeunload(){if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey||event.ctrlKey) {//判断event.altKey是为了AltF4关闭的情况&#xff1b;判断event.ctrlKey是为了CtrlW关闭的…