微信小程序获取手机号
wxml 代码:
<!-- 授权 -->
<button type="primary" open-type="getUserInfo" bind:tap="getUserProfile">授权登录</button>
<!-- 获取用户手机号 -->
<button open-type="getPhoneNumber" bindgetphonenumber="getphone">获取手机号</button>
<!-- 展示手机号 -->
<view>您的手机号:{{phone}}</view>

wxjs:代码
// 授权登录
getUserProfile(e) {
// 获取用户信息
wx.getUserProfile({
desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
// 头像
let avatarUrl=res.userInfo.avatarUrl;
// 昵称
let nickName=res.userInfo.nickName;
wx.login({
success:res=>{
// 获取code
let code=res.code;
wx.request({
url: 'http://www.yan.com/api/xcx/getLogin',
data: {
code:code,
avatarUrl:avatarUrl,
nickName:nickName,
},
method:"POST",
header: {
'content-type': 'application/json' // 默认值
},
// 数据返回json格式
success (res) {
console.log(res);
// 存储openid 用户获取手机号
wx.setStorageSync('openid', res.data.data.openid );
// 存储session_key用于获取手机号
wx.setStorageSync('sessionKey', res.data.data.sessionKey);
// 存储用户id
wx.setStorageSync('userid',res.data.data.uid);
}
}) }
})
}
})
},
将用户信息发送后台
/*获取用户信息的路由*/
Route::post('xcx/getLogin','xcx\LoginController@getLogin');
控制器代码:
public function getLogin(Request $request){
// 接受code
$code=$request->post('code');
// 接受头像
$avatarUrl=$request->post('avatarUrl');
// 接受昵称
$nickName=$request->post('nickName');
// 获取appid
$appid = "wx64832aa6eaea82b0";
// 从微信公众平台获得secret
$secret = "95e2acaf355dbcb443f5cd4748a152ed";
// 发送请求换取openid和sessionkey
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=" . $code. "&grant_type=authorization_code";
// 暂使用file_get_contents()发送请求,你可以使用CURL扩展的形式实现,获取opid和session_key
$res = json_decode(file_get_contents($url), true);
// 给$params追加openid
$params['openid'] = $res['openid'];
// 给$params追加session_key
$params['sessionKey'] = $res['session_key'];
// 查看数据库里是否有openid,有就修改,没有就添加
$user = Wxuser::where('openid', $params['openid'])->first();
$params['uid']=$user['id'];
// 有就修改用户的额openID
if ($user) {
// 将sessionKey 发送至小程序缓冲用于获取手机号
Wxuser::where('openid', $params['openid'])->update(['sessionKey'=>$params['sessionKey']]);
return ['code' => 201, 'meg' => '修改成功', 'data' => $params];
} else {
// 没有就添加新用户
$add = Wxuser::create($params);
return ['code' => 200, 'meg' => '添加成功', 'data' => $res];
}
}
小程序点击获取手机号按钮

<!-- 获取用户手机号 -->
<button type="primary" open-type="getPhoneNumber" bindgetphonenumber="getphone">获取手机号</button>
wx.js代码
需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。
// 获取手机号
getphone(e){
// open-type="getPhoneNumber" bindgetphonenumber="getphone" 获取encryptedData
var encryptedData =e.detail.encryptedData;
var iv =e.detail.iv;
// 取出授权登录的openid
let openid= wx.getStorageSync('openid')
// 取出授权登录的sessionKey
let sessionKey= wx.getStorageSync('sessionKey')
// 取出用户id
var userid= wx.getStorageSync('userid')
wx.request({
url: 'http://www.yan.com/api/xcx/send',
data: {
encryptedData:encryptedData,
iv:iv,
openid:openid,
sessionKey:sessionKey,
userid:userid
},
method:"POST",
header: {
'content-type': 'application/json' // 默认值
},
// 数据返回json格式
success :res=> {
console.log(res);
if (res) {
this.setData({
phone:res.data.data
})
}
} })
}
laravel 路由
/*获取手机号*/
Route::post('xcx/send','xcx\LoginController@send');
laravel控制器
//获取手机号
public function send(Request $request){
$encryptedData = $request->post('encryptedData');
$iv = $request->post('iv');
$sessionKey = $request->post('sessionKey');
$id=$request->post('userid');
$appid = 'wx64832aa6eaea82b0';
$pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
$phone = json_decode($data, true)['phoneNumber'];
//根据用户id 将手机号添加到数据表里面
Wxuser::where('id','=',$id)->update(['phone' => $phone]);
return ['code' => 200, 'meg' => 'success', 'data' => $phone];
} else {
return ['code' => 500, 'meg' => 'error', 'data' => $errCode];
}
模型代码
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Wxuser extends Model
{
//
protected $guarded=[];
public $timestamps=false;
}
解密官方文档:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

下载php

将文件放入开发的项目中,并修改文件名称和修改命名空间



demo.php
<?php
namespace App\Service\PHP;
use App\Service\PHP\wxBizDataCrypt;
//include_once "WXBizDataCrypt.php"; $appid = 'wx4f4bc4dec97d474b';
$sessionKey = 'tiihtNczf5v6AKRyjwEUhQ=='; $encryptedData="CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM
QmRzooG2xrDcvSnxIMXFufNstNGTyaGS
9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+
3hVbJSRgv+4lGOETKUQz6OYStslQ142d
NCuabNPGBzlooOmB231qMM85d2/fV6Ch
evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6
/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw
u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn
/Hz7saL8xz+W//FRAUid1OksQaQx4CMs
8LOddcQhULW4ucetDf96JcR3g0gfRK4P
C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB
6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns
/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd
lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV
oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG
20f0a04COwfneQAGGwd5oa+T8yO5hzuy
Db/XcxxmK01EpqOyuxINew=="; $iv = 'r7BXXKkLb8qrSNn05n0qiA=='; $pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data ); if ($errCode == 0) {
print($data . "\n");
} else {
print($errCode . "\n");
}
ErrorCode.php
<?php
namespace App\Service\PHP;
/**
* error code 说明.
* <ul> * <li>-41001: encodingAesKey 非法</li>
* <li>-41003: aes 解密失败</li>
* <li>-41004: 解密后得到的buffer非法</li>
* <li>-41005: base64加密失败</li>
* <li>-41016: base64解密失败</li>
* </ul>
*/
class ErrorCode
{
public static $OK = 0;
public static $IllegalAesKey = -41001;
public static $IllegalIv = -41002;
public static $IllegalBuffer = -41003;
public static $DecodeBase64Error = -41004;
} ?>
WXBizDataCrypt.php
<?php namespace App\Service\PHP;
use App\Service\PHP\errorCode; class WXBizDataCrypt
{
private $appid;
private $sessionKey;
/**
* 构造函数
* @param $sessionKey string 用户在小程序登录后获取的会话密钥
* @param $appid string 小程序的appid
*/
public function __construct( $appid, $sessionKey)
{
$this->sessionKey = $sessionKey;
$this->appid = $appid;
} /**
* 检验数据的真实性,并且获取解密后的明文.
* @param $encryptedData string 加密的用户数据
* @param $iv string 与用户数据一同返回的初始向量
* @param $data string 解密后的原文
*
* @return int 成功0,失败返回对应的错误码
*/
public function decryptData( $encryptedData, $iv, &$data )
{
if (strlen($this->sessionKey) != 24) {
return ErrorCode::$IllegalAesKey;
}
$aesKey=base64_decode($this->sessionKey); if (strlen($iv) != 24) {
return ErrorCode::$IllegalIv;
}
$aesIV=base64_decode($iv); $aesCipher=base64_decode($encryptedData); $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV); $dataObj=json_decode( $result );
if( $dataObj == NULL )
{
return ErrorCode::$IllegalBuffer;
}
if( $dataObj->watermark->appid != $this->appid )
{
return ErrorCode::$IllegalBuffer;
}
$data = $result;
return ErrorCode::$OK;
} }
tp框架获取手机号的代码,参看以下链接
https://blog.csdn.net/guanj0623/article/details/121139157?spm=1001.2014.3001.5501
微信小程序获取手机号的更多相关文章
- 微信小程序-获取经纬度
微信小程序-获取经纬度 最近公司新功能 要求在外的市场人员 发送位置信息回来. 用的还是微信小程序开发.... 微信小程序 提供一个接口 getLocation 这个接口反回来的位置 相对实际位置 相 ...
- 微信小程序-获取当前城市位置及再次授权地理位置
微信小程序-获取当前城市位置 1. 获取当前地理位置,可通过wx.getLocation接口,返回经纬度.速度等信息; 注意---它的默认工作机制: 首次进入页面,调用该api,返回用户授权结果,并保 ...
- 微信小程序获取Access_token和页面URL生成小程序码或二维码
1.微信小程序获取Access_token: access_token具体时效看官方文档. using System; using System.Collections.Generic; using ...
- [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息
因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...
- C# 微信小程序获取openid sessionkey
项目介绍 1.微信小程序获取openid和session_key 2.后台使用C#开发 项目流程 准备工作 1 获取appid 1.1 下载微信web开发工具 https://developers.w ...
- JavaScript和微信小程序获取IP地址的方法
最近公司新加了一个需求,根据用户登录的IP地址判断是否重复登录,重复登录就进行逼退,那么怎么获取到浏览器的IP地址呢?最后发现搜狐提供了一个JS接口,可以通过它获取到客户端的IP. 接口地址如下: h ...
- 微信小程序获取输入框(input)内容
微信小程序---获取输入框(input)内容 wxml <input placeholder="请输入手机号码" maxlength="11" type= ...
- .Net之微信小程序获取用户UnionID
前言: 在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理).这段时间就有一个这样的需求,之前有个客户做了一个微信小程序 ...
- 微信小程序获取手机号码看这篇文章就够了
前言 微信小程序获取手机号码,从官方文档到其他博主的文档 零零散散的 (我就是这样看过来 没有一篇满意的 也许是我搜索姿势不对) 依旧是前人栽树 后人乘凉 系列.保证看完 就可以实现获取手机号码功能 ...
随机推荐
- Go 学习路线(2022)
原文链接: Go 学习路线(2022) Go 语言的发展越来越好了,很多大厂使用 Go 作为主要开发语言,也有很多人开始学习 Go,准备转 Go 开发. 那么,怎么学呢? 我发现,在互联网时代,学习的 ...
- Android 关于Intent的一些简略总结
感谢大佬:https://www.jianshu.com/p/19147a69e970 Intent 常用构造方法: | 方法 | 描述 | |Intent() | 构造一个空 Intent | | ...
- Android 如何让EditText不自动获取焦点&隐藏软键盘
感谢大佬:https://blog.csdn.net/a18615971648/article/details/72869345 有时候的项目当中进入某个页面edittext会自动获取焦点弹出软键盘, ...
- Redis 哨兵模式
主从切换技术的方法是:当主服务器宕机了,需要手动将一台从服务器切换为主服务器,这就需要人工干预,这可能会造成一段时间的服务不可用. 一.哨兵模式的概述: 哨兵是一个独立的进程,作为一个进程,他会独立地 ...
- oracle修改密码、添加用户及授权
解锁某个用户 sqlplus/as sysdba; alter user scott account unlock; 忘记密码处理 登录:sqlplus/as sysdba;修改:alter user ...
- linux内存不足时,为了防止报错,可以使用swap
1. 创建分区文件, 大小 2G dd if=/dev/zero of=/swapfile bs=1k count=2048000 2. 生成 swap 文件系统 mkswap /swapfile 3 ...
- Docker的数据管理、网络通信和dockerfile
Docker的数据管理.网络通信和dockerfile 目录 Docker的数据管理.网络通信和dockerfile 一.Docker的数据管理 1. 数据卷 1.1 数据卷定义 1.2 数据卷配置 ...
- docker基础——4.网络待补
docker network ls bridge:NAT桥 host:共用宿主机namespace的UTS.IPC.Network none:只有lo,没有网卡 其他待补
- shell——并发工具parallel
官方文档:https://www.gnu.org/software/parallel/parallel_tutorial.html 安装 (wget -O - pi.dk/3 || curl pi.d ...
- Windows系统禁止自动更新
Windows + R键 输入services.msc(服务管理窗口) 找到Windows Update 停止且禁用 恢复->第一次失败 无操作 Windows + r 输入gpedit.msc ...
