微信小程序获取手机号
图
微信小程序获取手机号

代码示例

/**
     * 获取微信凭证
     */
    private String getWxToken() {
        // 优先从缓存读取
        String accessToken = redisTemplate.opsForValue().get(RedisKeyEnum.KEY_WEIXIN_ACCESS_TOKEN.value());
        if (Objects.isNull(accessToken)) {
            String url = "https://api.weixin.qq.com/cgi-bin/stable_token";
            JsonObject json = new JsonObject();
            json.addProperty("grant_type", "client_credential");
            json.addProperty("appid", "wxbe2c771ca621f869"); // appid
            json.addProperty("secret", "b6b460c4de6ad06fc77ef0c3dcacda71"); // secret 从微信小程序开发管理中生成
            log.debug(String.valueOf(json));
            RestTemplate restTemplate = new RestTemplate();
            HttpHeaders headers = new HttpHeaders();
            MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
            headers.setContentType(type);
            headers.add("Accept", MediaType.APPLICATION_JSON.toString());
            HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
            String sdResponse = restTemplate.postForEntity(url, formEntity, String.class).getBody();
            log.debug(sdResponse);
            if (Objects.isNull(sdResponse)) {
                throw new RuntimeException("获取微信凭证失败");
            }
            accessToken = JsonParser.parseString(sdResponse).getAsJsonObject().get("access_token").getAsString();
            log.debug(accessToken);
            if (Objects.isNull(accessToken)) {
                throw new RuntimeException("获取微信凭证无法解析Token");
            }
            // 缓存
            redisTemplate.opsForValue().set(RedisKeyEnum.KEY_WEIXIN_ACCESS_TOKEN.value(), accessToken, 7000, TimeUnit.SECONDS);
        }
        return accessToken;
    }

    /**
     * 根据动态令牌获取手机号
     */
    private String getPhone(String accessToken, String code) {
        String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken;
        JsonObject json = new JsonObject();
        json.addProperty("code", code);
        log.debug(String.valueOf(json));
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
        String sdResponse = restTemplate.postForEntity(url, formEntity, String.class).getBody();
        log.debug(sdResponse);
        if (Objects.isNull(sdResponse)) {
            throw new RuntimeException("根据code获取手机号失败");
        }
        JsonObject phoneInfo = JsonParser.parseString(sdResponse).getAsJsonObject().get("phone_info").getAsJsonObject();
        // 手机号
        String phoneNumber = phoneInfo.get("purePhoneNumber").getAsString();
        // 国外手机号会有区号
//        String countryCode = phoneInfo.get("countryCode").getAsString();
        log.debug(phoneNumber);
        if (Objects.isNull(phoneNumber)) {
            throw new RuntimeException("根据code获取手机号无法解析");
        }
        return phoneNumber;
    }

小程序

<button open-type="getPhoneNumber" @getphonenumber="phonenumber">授权测试</button>

methods: {
            phonenumber(e) {
                uni.request({
                    url: this.http + '/authorization',
                    method: 'POST',
                    data: {
                        code: e.detail.code,
                    },
                    success(res) {
                        console.log('获取access_token信息:', res)
                    }
                })
            },
        }