
当前通过获取session_key与encryptedData与iv进行解密获取手机号的方法已经不行了,只能通过点击按钮来实现获取微信用户的手机号
1:需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到动态令牌code,然后把code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号。每个code有效期为5分钟,且只能消费一次。
注:getPhoneNumber 返回的 code 与 wx.login 返回的 code 作用是不一样的,不能混用。
代码如下:
wxss代码:
<button type="primary" bindgetphonenumber="onGetPhoneNumber" open-type="getPhoneNumber">获取</button>
复制
js代码:
- onGetPhoneNumber (e){
- if(e.detail.code==null||e.detail.code==""){
- wx.showToast({
- title: '请允许获取您的手机号',
-
- 'icon':'none',
-
- })
-
- return;
-
- }else{
- wx.request({
- data: {
- code: e.detail.code,
-
- time:config.dt,
-
- openid: storage.get('openid')
-
- },
-
- header: {'content-type': 'application/json'},
-
- url: config.api+'/getWxPhone',
-
- success: function(res) {
- console.log(res.data.data.phone);
-
- }
-
- })
-
- }
-
-
-
- },
复制
2:后端PHP代码【此处我用的是tp5】根据传过来的动态令牌code去获取手机号
- /**
- * @param Request $request
- * 获取手机号码
- */
- public function getWxPhone(Request $request){
-
- $params = $request::only(['code']);
-
- $url_get = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.config("appid").'&secret='.config("appsecret");
-
- $tmptoken = json_decode(curlGet($url_get),true);
-
- $token = $tmptoken['access_token'];
-
- $url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=".$token;
-
- $data['code']=$params['code'];
-
- $info = Post(json_encode($data),$url);
-
- $tmpinfo = json_decode($info,true);
-
- $code = $tmpinfo['errcode'];
-
- $phoneNumber = "";
- $phoneNumber = $tmpinfo['phone_info']['phoneNumber'];
-
- if($code == '0'){
-
- self::returnMsg(Error::SUCCESS, '获取手机号码成功',['phone'=>$phoneNumber]);
- }else{
-
- self::returnMsg(Error::FAILED, '获取手机号码失败',['']);
- }
-
- }
复制
附带函数:
- function Post($curlPost, $url, $ssl = false)
- {
- $curl = curl_init();
-
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_HEADER, false);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($curl, CURLOPT_NOBODY, true);
- curl_setopt($curl, CURLOPT_POST, true);
- curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
- if (!$ssl) {
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
- }
- $return_str = curl_exec($curl);
- curl_close($curl);
- return $return_str;
- }
复制
可能出现的错误:errcode“:47001
问题所在:

这里肯定是忘记用json_encode
除了这个问题,某些大聪明娃喜欢把
https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=".$token
这里的access_token变成data里边的参数,这时候就出现了access_token过期的问题。
一切问题来源于没有好好看官方文档
因为你如果将access_token当做参数,接口就变成了用两次access_token(access_token过期或无效)。