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

微信小程序获取手机号的更多相关文章

  1. 微信小程序-获取经纬度

    微信小程序-获取经纬度 最近公司新功能 要求在外的市场人员 发送位置信息回来. 用的还是微信小程序开发.... 微信小程序 提供一个接口 getLocation 这个接口反回来的位置 相对实际位置 相 ...

  2. 微信小程序-获取当前城市位置及再次授权地理位置

    微信小程序-获取当前城市位置 1. 获取当前地理位置,可通过wx.getLocation接口,返回经纬度.速度等信息; 注意---它的默认工作机制: 首次进入页面,调用该api,返回用户授权结果,并保 ...

  3. 微信小程序获取Access_token和页面URL生成小程序码或二维码

    1.微信小程序获取Access_token: access_token具体时效看官方文档. using System; using System.Collections.Generic; using ...

  4. [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息

    因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...

  5. C# 微信小程序获取openid sessionkey

    项目介绍 1.微信小程序获取openid和session_key 2.后台使用C#开发 项目流程 准备工作 1 获取appid 1.1 下载微信web开发工具 https://developers.w ...

  6. JavaScript和微信小程序获取IP地址的方法

    最近公司新加了一个需求,根据用户登录的IP地址判断是否重复登录,重复登录就进行逼退,那么怎么获取到浏览器的IP地址呢?最后发现搜狐提供了一个JS接口,可以通过它获取到客户端的IP. 接口地址如下: h ...

  7. 微信小程序获取输入框(input)内容

    微信小程序---获取输入框(input)内容 wxml <input placeholder="请输入手机号码" maxlength="11" type= ...

  8. .Net之微信小程序获取用户UnionID

    前言: 在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理).这段时间就有一个这样的需求,之前有个客户做了一个微信小程序 ...

  9. 微信小程序获取手机号码看这篇文章就够了

    前言 微信小程序获取手机号码,从官方文档到其他博主的文档 零零散散的 (我就是这样看过来 没有一篇满意的 也许是我搜索姿势不对) 依旧是前人栽树 后人乘凉 系列.保证看完 就可以实现获取手机号码功能 ...

随机推荐

  1. debian下编译安装redis并加入到systemd启动管理

    原文地址: http://blog.duhbb.com/2022/02/09/compile-and-install-redis-debian-and-add-to-systemd/ 欢迎访问我的个人 ...

  2. Atcoder ARC-104

    D 可以发现,从整体上来看这个式子是不好计数的,可以考虑反过来将贡献拆到单个的每个数上: \[\sum\limits_{i = 1} ^ n a_i \times (i - x) = 0 \] 于是每 ...

  3. Tomcat临时目录及java.io.tmpdir对应的目录

    最近客户现场的技术支持接连反馈了一个问题:导入数据的时候,上传的excel会在服务器上生成一个临时文件,而这个临时文件都在  tomcat 的安装目录下,如果上传次数比较多的话,就会导致tomcat安 ...

  4. NSMutableArray基本概念

    1.NSMutableArray介绍 什么是NSMutableArray NSMutableArray是NSArray的子类 NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, ...

  5. Nginx中的Location和Rewrite

    Nginx中的Location和Rewrite 目录 Nginx中的Location和Rewrite 一.location 1. location的分类 2. location常用的匹配规则 3. l ...

  6. 如何综合运用对称加密技术、非对称加密技术(公钥密码体制)和Hash函数 保证信息的保密性、完整性、可用性和不可否认性?

    一.几个问题 在提出问题之前,先创建一个使用场景,发送方(甲方)要给接收方(乙方)发送投标书.大家知道,投标书都包括发送方的标的,这个标的是不能被竞标者知晓,更不能被竞标者修改的.在传输的投标书时,提 ...

  7. 基于6U CPCIe的TMS320C6678+KU060的信号处理板卡

    一.产品概述 基于6U CPCIe的C6678+KU060的信号处理板卡是新一代FPGA的高性能处理板卡.板卡采用一片TI DSP TMS320C6678和一片Xilinx公司 XCKU060-2FF ...

  8. 期中架构&防火墙¥四表五链

    今日内容 架构图 包过滤防火墙 Iptables 新建虚拟机 内容详细 一.架构图 用户通过域名访问一个网站类比开车去饭店用餐 访问网站的流程 1.浏览器输入网站的域名(www.baidu.com), ...

  9. Solution -「AGC 036D」「AT 5147」Negative Cycle

    \(\mathcal{Descriprtion}\)   Link.   在一个含 \(n\) 个结点的有向图中,存在边 \(\lang i,i+1,0\rang\),它们不能被删除:还有边 \(\l ...

  10. Vue2.0源码学习(1) - 数据和模板的渲染(上)

    准备 一.首先去GitHub上把vue源码download下来,传送门:https://github.com/vuejs/vue 二.搭建一个vue-cli跑起来,用于代码调试,不看着代码动起来只看源 ...