首页 > 编程语言 >微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)

微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)

时间:2023-06-08 14:06:22浏览次数:58  
标签:code return String appCode 微信 程序开发 getPhoneNumber 进阶篇 log



文章目录

  • 一、前言
  • 二、前端代码wxml
  • 三、前端代码js
  • 四、后端java
  • 五、程序流程
  • 六、参考


一、前言

微信小程序开发笔记——导读

  • 大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码
  • 但是,因为小程序用户的手机号码属于重要信息,为了安全,所以需要如下一系列较为复杂的方法和步骤。
  • 我前期主要通过小程序云的方法获取用户手机号码,后面因为微信政策变更,小程序云不再提供免费版本,最低每月也要收费19元
  • 所以,我才转用方法二和方法三。否则方法一小程序云的方法是最简单的。

微信小程序开发笔记 进阶篇④——getPhoneNumber 获取用户手机号码(小程序云)

微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)
微信小程序开发笔记 进阶篇⑥——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之后)

  • 首先确保基础库版本在2.21.2之前

微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)_前端

二、前端代码wxml

  • 必须要有这个button,并且用户点击了,才能有下一步
<button type="default" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" class="weui-vcode-btn" wx:else>获取手机号</button>

微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)_解密_02

三、前端代码js

  • 定义一个code全局变量
var code = ""
  • 该界面onShow的时候,调用wx.login函数获取code
  • 这边这里有个风险,这个code存在有效期,到你用的时候可能会过期
onShow() {        
    wx.login({
        success: function (res) {
            console.log("wx.login success", res)
            if (res.code) {    
                code = res.code
            } else {
                _this.showToast('失败!' + res.errMsg)
            }
        },
        fail: function (res) {
            console.log('wx.login fail' + res)
        }
    })
},
  • bindgetphonenumber="getPhoneNumber"按钮的回调函数
getPhoneNumber(e) {
    var _this = this
    console.log("getPhoneNumber", e)
    
    keyueliSdk.getPhoneNumber({
        code: code,
        encryptedData: e.detail.encryptedData,
        iv: e.detail.iv,
        appId: app.globalData.appId,
    },
    (res) => {
        console.log("getPhoneNumber", "success", res)
        _this.setData({
            mobile: res.data.data.phoneNumber
        })
    },
    (res) => {
        console.log("getPhoneNumber", "fail", res)
    })
},
  • keyueliSdk.js接口工具类
//获取用户手机号码
const getPhoneNumber = (data, success, fail) => {
  console.log("getPhoneNumber", data)
  request(
    endpoint + "/v1/app/user/getPhoneNumber", {
      // 'content-type': 'application/x-www-form-urlencoded'
      'content-type': 'application/json'
    },
    data,
    "POST",
    success, fail
  )
}

module.exports = {
  getPhoneNumber: getPhoneNumber,
}

四、后端java

  • controller.java
@ApiOperation("查询用户手机号码")
@PostMapping("/getPhoneNumber")
public AjaxResult getPhoneNumber(@ApiParam() @RequestBody AppCode appCode)
{
    log.info(appCode.toString());
    return AjaxResult.success(loginService.getPhoneNumber(appCode));
}
  • loginService.java
public JSONObject getPhoneNumber(AppCode appCode){
    if(!WXUtils.checkAppId(appCode.getAppId())){
        log.error("appId异常: "+ appCode.toString());
        throw new CustomException("AppId 异常");
    }

    JSONObject codeData = WXUtils.codeAnalysis(appCode.getCode(), appCode.getAppId());
    if(ObjectUtil.isNull(codeData)){
        log.error("code异常: "+ appCode.toString());
        throw new CustomException("code 异常");
    }
    String sessionKey = codeData.getString("session_key");
    String openId = codeData.getString("openid");
    String unionId = codeData.getString("unionid");

    JSONObject decryptObject = WXUtils.decrypt(appCode.getAppId(), appCode.getEncryptedData(), sessionKey, appCode.getIv());
    if(ObjectUtil.isNull(decryptObject)){
        log.error("encryptedData异常: "+ appCode.toString());
        throw new CustomException("encryptedData 异常");
    }
    log.info(decryptObject.toJSONString());

    return decryptObject;
}
  • WXUtils.java
/**
 * 解密数据
 * @return
 * @throws Exception
 */
public static JSONObject decrypt(String appId, String encryptedData, String sessionKey, String iv){
    try {
        byte[] resultByte = AESUtils.decrypt(Base64.decodeBase64(encryptedData),Base64.decodeBase64(sessionKey),Base64.decodeBase64(iv));
        if(null != resultByte && resultByte.length > 0){
            String result = new String(WxPKCS7Encoder.decode(resultByte));
            JSONObject jsonObject = JSONObject.parseObject(result);
            String decryptAppId = jsonObject.getJSONObject("watermark").getString("appid");
            if(!appId.equals(decryptAppId)){
                return null;
            }
            return jsonObject;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 获取session_key
 * @return
 * @throws Exception
 */
public static JSONObject codeAnalysis(String code, String appId) {
    try {
        String objectStr = HttpUtil.get(String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
                appId, getAppSecret(appId), code));
        log.info(objectStr);
        JSONObject jsonObject = JSON.parseObject(objectStr);
        return jsonObject;
    }catch (Exception e){
        e.printStackTrace();
        log.error("微信code解析异常", e.getMessage());
    }
    return null;
}
  • AESUtils.java
/**
 * AES解密
 *
 * @param content
 *            密文
 * @return
 * @throws InvalidAlgorithmParameterException
 * @throws NoSuchProviderException
 */
public static byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
    initialize();
    try {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        Key sKeySpec = new SecretKeySpec(keyByte, "AES");
        cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
        byte[] result = cipher.doFinal(content);
        return result;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (NoSuchProviderException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

五、程序流程


注册界面 后端服务器 onShow函数,wx.login获取用户code 按钮点击,getPhoneNumber获取encryptedData和iv https post请求,code/encryptedData/iv/appId等4个参数 拿code和appId通过auth.code2Session获取session_key 密文:Base64_Decode(encryptedData) 秘钥:Base64_Decode(session_key) 初始向量:Base64_Decode(iv) AES-128-CBC 解密,返回phoneNumber 注册界面 后端服务器


六、参考

觉得好,就一键三连呗(点赞+收藏+关注)


标签:code,return,String,appCode,微信,程序开发,getPhoneNumber,进阶篇,log
From: https://blog.51cto.com/u_16081772/6439441

相关文章

  • 微信小程序开发笔记 进阶篇⑥——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之后
    文章目录一、前言二、前端代码wxml三、前端代码js四、后端java五、程序流程六、参考一、前言微信小程序开发笔记——导读大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码。但是,因为小程序用户的手机号码属于重要信息,为了安全,所以需要如下一系列较为复杂的方法和......
  • 体验了【微信问一问】的新功能
    hello,伙伴们,我是索奇相信很多伙伴们已经体验了【微信问一问】的新功能但也有一些伙伴们还不知道如何开启使用,现在并不是所谓的仅内测可用(互联网上很多人说搜一搜都说是内测,一跟十,十跟百,不如自己探索验证一下,目前是否仅内测可用)两种方法开启问一问可以通过「问一问」种子用户招募进......
  • c#简单获取微信openid
    前端js:点击查看代码 varlocal=encodeURIComponent(window.location.href); varappid=$("#appId").text();//公众号 varurl='https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appid+'&redirect_uri='+local+&......
  • 使用Laf云平台,两步将ChatGPT接入微信公众号
    使用Laf云平台,两步将ChatGPT接入微信公众号最近很火的ChatGPT可以说已经满大街可见了,到处都有各种各样的体验地址,有收费的也有免费的,总之是五花八门、花里胡哨。所以呢,最近我就在研究怎么才能方便快捷的体验到ChatGPT的强大功能,其中一个就是:把ChatGPT接入公众号。如下图(成果图):......
  • 微信扫描领取“完整版的Python全套学习资料”的骗子
    网上搜Python学习资料,看到过很多次所谓“这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】”这些领资料的都是骗人的,扫了微信会问你杂七杂八的问题:python基础怎样,为什么学python,安装了pycharm没有等等。只......
  • 从零玩转系列之微信支付
    一、前言halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都要,小程序和PC端) 一、微信支付介绍和接入指引1、微信支付产品......
  • 微信小程序中的基础语法
    微信小程序中的基础语法微信小程序是一种轻量级的应用程序,它具有简单、高效、易用等特点。在学习微信小程序开发的过程中,了解其基础语法非常重要。本文将介绍微信小程序中的基础语法。1.WXMLWXML是微信小程序的模板语言,类似于HTML。WXML与HTML的语法很相似,但是WXML更加轻量级,支持......
  • Appium模拟登录微信
    fromappiumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasECserver='http://localhost:4723/wd/hub'desired_c......
  • 微信小程序输入框光标错乱问题
     会出现这个问题,一般是受到了滚动条的影响,所以,在获取焦点时,需要关闭页面滚动,失去焦点时,就开启滚动,例如页面里存在scroll-view组件示例代码wxml片段<scroll-viewclass="m_scroll"style="height:100vh;"scroll-y="{{aFocus}}"scroll-with-animation></scroll-view><in......
  • java微信公众号 推送消息
    WxConfig.java @Slf4j@ServicepublicclassWxConfig{@ResourceprivateWxClientwxClient;//appIdprivatestaticfinalStringappId="xxxx";//appIdSecretprivatestaticfinalStringappIdSecret="xxxx";privatestat......