微信小程序获取手机号
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
前言: 在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理).这段时间就有一个这样的需求,之前有个客户做了一个微信小程序 ...
- 微信小程序获取手机号码看这篇文章就够了
前言 微信小程序获取手机号码,从官方文档到其他博主的文档 零零散散的 (我就是这样看过来 没有一篇满意的 也许是我搜索姿势不对) 依旧是前人栽树 后人乘凉 系列.保证看完 就可以实现获取手机号码功能 ...
随机推荐
- STC8H开发(九): STC8H8K64U模拟USB HID外设
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- Linux中Swap与Memory内存简单介绍 (转)
https://blog.csdn.net/zwan0518/article/details/12059213 一.背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇 ...
- Android中ActionBar和ToolBar添加返回箭头
感谢大佬:https://blog.csdn.net/baidu_32682229/article/details/77927745 ActionBar添加返回箭头 //onCreate方法中 Act ...
- kubeadm/flannel/dashboard/harbor部署以及服务发布
kubeadm/flannel/dashboard/harbor部署以及服务发布 目录 kubeadm/flannel/dashboard/harbor部署以及服务发布 一.部署kubeadm 1. ...
- web虚拟主机、日志分割以及日志分析
目录 一.构建虚拟web主机 1.1 概述 1.2 支持的虚拟主机类型 1.3 部署虚拟主机步骤 1.3.1 基于域名的虚拟主机 (1)为虚拟主机提供域名解析 (2)为虚拟主机准备网页文档 (3)添加 ...
- linux_16
对常用I/O模型进行比较说明 nginx中的模块分类及常见核心模块有哪些 描述nginx中worker_processes.worker_cpu_affinity.worker_rlimit_nofi ...
- Innodb之索引与算法
目录 一.概述 二.数据结构与算法 1.二分查找 2.二叉查找树和平衡二叉树 1)二叉查找树 2)平衡二叉树 三.B+树 1.B+树完整定义 2.关于 M 和 L的选定案例 四.B+树索引 1.聚集索 ...
- [技术干货-算子使用] mindspore.scipy 入门使用指导
1. MindSpore框架的SciPy模块 SciPy 是基于NumPy实现的科学计算库,主要用于数学.物理学.生物学等科学以及工程学领域.诸如高阶迭代,线性代数求解等都会需要用到SicPy.Sci ...
- 10、架构--keepalive、四层负载均衡
笔记 1.晨考 1.HTTPS的作用,怎么实现的呢? 2.全栈部署HTTPS 只需在代理中部署HTTPS 3.反向代理 BBS 步骤 1.部署WEB机器 2.部署代理 4.如果 LB01 宕机了,怎么 ...
- erange.heetian.com 回显任意账号
首先获取你想登录ID的REG标识符,例如合天课程专家 获取标识符ba84d3c3-a4a1-4cd2-a00d-2f5722ee86a2 一般用户前缀为REG,这个肯定是管理员之类的= =.. ...