小程序中自动获取手机号为很常见的一个功能点,可以减少用户输入,目前小程序规则是不允许系统直接自动获取,需要用户手动触发
本文中的实现方式:前端使用uniapp生成小程序,后端使用springboot

首先,上效果图

1、前端uniapp代码

小程序原生代码类似,可以看微信开放平台官网示例

<u-form-item  :label-position="labelPosition"label="手机号码" prop="phone" label-width="150"><u-input :border="border" placeholder="请输入手机号" v-model="model.phone" type="number" :disabled="false"></u-input><!-- #ifndef H5 --><u-button slot="right" type="success" size="mini" open-type="getPhoneNumber"  @getphonenumber="getPhoneNumber">获取手机号</u-button><!-- #endif -->
</u-form-item>

目前获取手机号不需要先做登录授权

// 获取微信小程序绑定的手机号
getPhoneNumber(e) {let data1 = {};data1.code = e.detail.code;data1.iv=e.detail.iv;data1.encryptedData=e.detail.encryptedData;_this._post_form('system/phone', data1, (result) => {if (result && result != null && result.code=='200'){uni.setStorageSync('user_phone', result.data.phone);console.info(result.data.phone);_this.model.phone = result.data.phone;}else{uni.showModal({showCancel: false,title: '错误',content: "获取手机号失败,请联系管理员处理",}); }});
}

2、后端代码

注意:
1、这里后端不再使用旧版的解密方式获取手机号,而是直接请求微信获取
相关说明见微信公众平台API说明
2、这里的代码,最有用的是,使用post请求的时候,参数需要为raw的形式,否则,微信会返回47001的错误

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;import org.apache.commons.collections4.map.HashedMap;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.WxDecPhone;
import com.ruoyi.common.enums.BusinessType;/*** 获取微信手机号Controller* * @author * @date 2022-03-23*/
@RestController
@RequestMapping("/system/phone")
public class WxController extends BaseController {// 小程序appid@Value("${APP_ID}")private String APP_ID;// 小程序的app secret@Value("${APPSECRET}")private String APPSECRET;@Log(title = "解密手机号", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult deciphering(@RequestBody WxDecPhone wxDecPhone) {String code = wxDecPhone.getCode();//code 为getPhoneNumber(e)后的e.detail.codeString phone = "";String access_token = getAccess_token();System.out.println("code:" + code);System.out.println("access_token:" + access_token);String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + access_token;JSONObject body = new JSONObject();body.put("code", code);try {String ret = httpPostRaw(url, body.toString(), null, null);if(ret != null && !"".equals(ret)) {JSONObject json = JSONObject.parseObject(ret);JSONObject phone_info = json.getJSONObject("phone_info");phone = phone_info.getString("phoneNumber");}} catch (Exception e) {e.printStackTrace();}Map<String, Object> data = new HashedMap<String, Object>();data.put("phone", phone);AjaxResult ajax = AjaxResult.success(data);return ajax;}/*** 微信接口请求令牌:生产环境下 要用redis缓存起来* @return*/public String getAccess_token() {String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ APP_ID + "&secret=" + APPSECRET;String accessToken = null;try {URL urlGet = new URL(url);HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();http.setRequestMethod("GET"); // 必须是get方式请求http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");http.setDoOutput(true);http.setDoInput(true);System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒http.connect();InputStream is = http.getInputStream();int size = is.available();byte[] jsonBytes = new byte[size];is.read(jsonBytes);String message = new String(jsonBytes, "UTF-8");JSONObject demoJson = JSONObject.parseObject(message);accessToken = demoJson.getString("access_token");is.close();} catch (Exception e) {e.printStackTrace();}return accessToken;}/*** 参数以raw的方式做post请求* * @param url* @param stringJson* @param headers* @param encode* @return*/public static String httpPostRaw(String url, String stringJson, Map<String, String> headers, String encode) {String str = "";if (encode == null) {encode = "utf-8";}// HttpClients.createDefault()等价于 HttpClientBuilder.create().build();CloseableHttpClient closeableHttpClient = HttpClients.createDefault();HttpPost httpost = new HttpPost(url);// 设置headerhttpost.setHeader("Content-type", "application/json");if (headers != null && headers.size() > 0) {for (Map.Entry<String, String> entry : headers.entrySet()) {httpost.setHeader(entry.getKey(), entry.getValue());}}// 组织请求参数StringEntity stringEntity = new StringEntity(stringJson, encode);httpost.setEntity(stringEntity);String content = null;CloseableHttpResponse httpResponse = null;try {// 响应信息httpResponse = closeableHttpClient.execute(httpost);HttpEntity entity = httpResponse.getEntity();content = EntityUtils.toString(entity, encode);System.out.println(content);str = content;} catch (Exception e) {e.printStackTrace();} finally {try {httpResponse.close();} catch (IOException e) {e.printStackTrace();}}try { // 关闭连接、释放资源closeableHttpClient.close();} catch (IOException e) {e.printStackTrace();}return str;}}

微信小程序获取手机号:前后端源码示例,解决47001这个错误提示相关推荐

  1. 微信小程序聊天室 前后端源码附效果图和数据库结构图

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 122 <!-- <button bindtap='close'>关闭</bu ...

  2. 微信小程序获取手机号,TP6 后端电话短信验证

    public function index(){//接收参数$data = input();//验证集$validate = Validate::rule(['phone'=>'require| ...

  3. 微信小程序获取手机号登录流程

    微信小程序获取手机号登录流程 首先前端使用wx.login 获取code wx.login({success(res) {if (res.code) {that.setData({code: res. ...

  4. uni-app微信小程序获取手机号;微信小程序获取手机号,获取到后需要进行解密;微信小程序获取手机号失败 Error:该appId没有权限

    方法1.uni-app登录加获取手机号解密-直接看此篇即可解决 微信小程序获取手机号注意点: 1.需要先登录,微信小程序登录看这篇 2.手机号获取到时加密的,需要后端解密或者前端自己解密(解密时候就会 ...

  5. 微信小程序获取手机号登录流程(个人开发者账号不支持)

    微信小程序获取手机号登录流程 所需条件 1. 非个人开发者账号 2. AppID+AppSecret 流程思路 **注意:** 代码实现 常见问题 所需条件 1. 非个人开发者账号 获取手机号文档 这 ...

  6. 【项目实战课】微信小程序图像识别模型前后端部署实战

    欢迎大家来到我们的项目实战课,本期内容是<微信小程序图像识别模型前后端部署实战>.所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解. ...

  7. 微信授权绑定手机号 java_微信小程序获取手机号授权用户登录功能

    小程序中有很多地方都会用到注册用户信息的地方,用户需要填写手机号等,有了这个组件可以快速获取微信绑定手机号码,无须用户填写. 1.getPhoneNumber这个组件通过button来实现(别的标签无 ...

  8. 微信小程序获取手机号并解密详解

    微信小程序获取手机号并解密 1 获取手机号 2 解密 2.1 获取所需数据 2.2 解密返回数据 1 获取手机号 获取手机号的过程官方文档有详细的介绍.参考官方链接 要注意的是,此功能只对非个人且完成 ...

  9. 微信小程序---- 获取手机号(微信最新更新)

    微信小程序---- 获取手机号(微信最新更新) 前言:需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphone ...

  10. php 微信小程序获取手机号_实例讲解微信小程序获取手机号授权用户登录功能...

    小程序中有很多地方都会用到注册用户信息的地方,用户需要填写手机号等,有了这个组件可以快速获取微信绑定手机号码,无须用户填写.本文主要给大家分享微信小程序获取手机号授权用户登录功能,需要的朋友参考下吧, ...

最新文章

  1. 大学计算机专业副修课,计算机学院举行本科课程教学大纲修订工作研讨会
  2. Levenshtein 相似度算法——Levenshtein(编辑距离)
  3. es6 工作中常用总结
  4. Mybatis-增删改查模糊查询分页注解(普通类型参数、引用类型参数、Map类型参数)
  5. 解密昇腾AI处理器--DaVinci架构(总览)
  6. 数据科学 IPython 笔记本 7.4 Pandas 对象介绍
  7. 将json转为map的两种方式及前后端开发json Api设计规范总结
  8. rpm常用命令集合1
  9. 简书首页标题配图bug,偶发,未能重现(可以重现2017-12)
  10. PHP数据库扩展 - PDO操作
  11. 大数据技术原理与应用----大数据概述
  12. android 剪贴板增强工具,ClipX - 超级实用的小巧剪贴板增强工具
  13. 【食品加工技术】第一章 食品加工技术概述 笔记
  14. Microsoft Office word 2019教程 - word中的excel表格随着excel表格的变化而变化
  15. 来钱快的3种副业,虽然不起眼,不过很赚钱‍‍‍
  16. Oracle数据库之创建序列
  17. vue-router基本概念总结
  18. Revit API 开发周边:对 Element 进行 Reflection
  19. DateEdit和TimeEdit
  20. 文科生与理科生_戏谈

热门文章

  1. 全球与中国锁孔骨科矫形手术器械市场深度研究分析报告
  2. ORA 00257 归档程序错误 导致无法连接
  3. java怎么写函数_java构造函数怎么写
  4. 解决微信小程序scroll-view高度自适应问题的方法
  5. FPGA接口_N25Q128型号的spi flash驱动verilog代码编写
  6. linux 卸载tcl,tcl电视用adb命令免root卸载系统自带第三方软件
  7. 什么是GBase 8a 并行技术
  8. Python3入门——Python3+PyCharm环境的安装及配置
  9. 第十周CoreIDRAW
  10. 中国古代道家思想与网页重构的思考(转载)