精华内容
下载资源
问答
  • 最近在做一款微信小程序,需要获取用户手机号,具体步骤如下:流程图:1、首先,客户端调用wx.login,回调数据了包含js_code,用于获取openid(用户唯一标识)和sessionkey(会话密钥)。2、拿到js_code后,将其发送...
  • 微信小程序获取用户手机号

    千次阅读 2020-12-23 16:11:58
    微信小程序获取用户手机号 一、微信小程序获取用户手机号分四步: 1.微信前端登录接口wx.login获取临时登录凭证code 微信文档...

    微信小程序获取用户手机号

    一、微信小程序获取用户手机号分四步:

    1.微信前端登录接口wx.login获取临时登录凭证code

    微信文档 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

     

    2.后台根据code换取sessionKey

    URL:https://api.weixin.qq.com/sns/jscode2session?appid={appId}&secret={appSecret}&grant_type=authorization_code&js_code={code}

    该接口同时也会返回 openId和unionid

    微信参考文档 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

     

    3.前端获取到encryptedData、iv

    使用微信小程序的组件 button,open-type值为getPhoneNumber。

    微信文档 https://developers.weixin.qq.com/miniprogram/dev/component/button.html

                 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

    4.encryptedData、iv、sessionKey三个参数调用后台解密接口解密即可得到微信小程序用户手机号

    这一步有坑,详见下面

    Java版解密工具类demo:

    复制代码

    package com.meritdata.cloud.middleplatform.dataservice.cashier.utils;
    
    import org.apache.commons.codec.binary.Base64;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    import javax.crypto.*;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.security.*;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.InvalidParameterSpecException;
    import java.util.Arrays;
    
    
    /**
     * 2020/12/14 5:08 PM
     *
     * @author shoo
     * @describe 解密工具类
     */
    public class SecretUtilTools {
        public SecretUtilTools() {
        }
    
        public static String encryptForDES(String souce, String key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
            SecureRandom sr = new SecureRandom();
            DESKeySpec dks = new DESKeySpec(key.getBytes("UTF-8"));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey key1 = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(1, key1, sr);
            byte[] encryptedData = cipher.doFinal(souce.getBytes("UTF-8"));
            String base64Str = (new BASE64Encoder()).encode(encryptedData);
            return base64Str;
        }
    
        public static String decryptForDES(String souce, String key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IOException, IllegalBlockSizeException, BadPaddingException {
            SecureRandom sr = new SecureRandom();
            DESKeySpec dks = new DESKeySpec(key.getBytes());
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey key1 = keyFactory.generateSecret(dks);
            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(2, key1, sr);
            byte[] encryptedData = (new BASE64Decoder()).decodeBuffer(souce);
            byte[] decryptedData = cipher.doFinal(encryptedData);
            return new String(decryptedData, "UTF-8");
        }
    
        public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
            byte[] dataByte = Base64.decodeBase64(data);
            byte[] keyByte = Base64.decodeBase64(key);
            byte[] ivByte = Base64.decodeBase64(iv);
            int base = 16;
            if (keyByte.length % base != 0) {
                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                byte[] temp = new byte[groups * base];
                Arrays.fill(temp, (byte)0);
                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                keyByte = temp;
            }
    
            try {
                Security.addProvider(new BouncyCastleProvider());
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
                SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
                AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
                parameters.init(new IvParameterSpec(ivByte));
                cipher.init(2, spec, parameters);
                byte[] resultByte = cipher.doFinal(dataByte);
                if (null != resultByte && resultByte.length > 0) {
                    String result = new String(resultByte, encodingFormat);
                    return result;
                }
    
                return null;
            } catch (NoSuchAlgorithmException var13) {
                var13.printStackTrace();
            } catch (NoSuchPaddingException var14) {
                var14.printStackTrace();
            } catch (InvalidParameterSpecException var15) {
                var15.printStackTrace();
            } catch (InvalidKeyException var16) {
                var16.printStackTrace();
            } catch (InvalidAlgorithmParameterException var17) {
                var17.printStackTrace();
            } catch (IllegalBlockSizeException var18) {
                var18.printStackTrace();
            } catch (BadPaddingException var19) {
                var19.printStackTrace();
            } catch (UnsupportedEncodingException var20) {
                var20.printStackTrace();
            }
    
            return null;
        }
    }

    复制代码

       调用方法:

     

    复制代码

        public static MinAppUser getMiniUserInfo(String encryptedData, String iv, String sessionKey) throws IOException {
            MinAppUser minAppUser = new MinAppUser();
            String result = "";
    
            try {
                result = SecretUtilTools.decrypt(encryptedData, sessionKey, iv, "UTF-8");
                if (null != result && result.length() > 0) {
                    minAppUser = (MinAppUser)(new ObjectMapper()).readValue(result, MinAppUser.class);
    
                } else {
                    System.out.println("getMiniUserInfo error");
                }
            } catch (Exception var11) {
                var11.printStackTrace();
            }
            return minAppUser;
        }

    复制代码

     

    二、以上四步步骤顺序不能错,否则各种报错。如:

    1.解密报错 pad block corrupted

    2.解密那一步,通过URL传参,不知道什么机制会自动把 "+" 换成 " ",导致你的encryptedData、iv错误。解决方法是反替换:

    encryptedData = encryptedData.replaceAll(" ","+");
    iv = iv.replaceAll(" ","+");

     

    展开全文
  • 小程序获取用户手机号登录

    千次阅读 2019-06-14 11:39:51
    小程序获取用户手机号登录 使用方法 需要将 < button > 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, ...

    2018年9月27日星期四
    小程序获取用户手机号登录

    使用方法

    需要将 < button > 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。

    <button open-type=“getPhoneNumber” bindgetphonenumber=“getPhoneNumber”>

    注意:获取微信用户绑定的手机号,需先调用login接口

     在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免login 刷新登录态。
    

    通过bindgetphonenumber绑定的事件来获取回调。回调的参数有三个,
    errMsg:用户点击取消或授权的信息回调。
    iv:加密算法的初始向量(如果用户没有同意授权则为undefined)。
    encryptedData: 用户信息的加密数据(如果用户没有同意授权同样返回undefined)

    在这里插入图片描述
    encryptedData 解密后为以下 json 结构
    在这里插入图片描述
    //app.js

    App({
        onLaunch: function () {
    	    // 登录
    	    wx.login({
    		    success: function (res) {
    			    var code = res.code;
    				    wx.request({
    					    url: 'https://*****.com',
    					    method: 'POST',
    					    data: {
    					    	js_code: code
    					    }, //传递后台code值 
    					    header: {
    					    	'Accept': "*/*"
    					    },
    					    success: function (res) {
    					    var wechat = { 
    						    openid: res.data.openid,
    						    thirdkey: res.data.session_key
    					    }
    					    wx.setStorage({  //返回openid session_key  本地缓存
    						    key: 'wechat',
    						    data: wechat
    					    })
    				    }
    			    })
    		    },
    		    fail: function (res) {
    		    console.log("登陆失败")
    		    }
    	    })
        }
    })
    

    // login.js

    getPhoneNumber: function (e) {
        var that = this;
        // 拒绝授权
        if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
    	    wx.showModal({
    	    title: '提示',
    	    showCancel: false,
    	    content: '未授权您将无法登陆',
    	    success: function (res) { }
    	    })
        } else {
    	    // 接受授权
    	    wx.getStorage({
    		    key: 'wechat',
    		    success: function (res) {
    		    var openid = res.data.openid;			//openid
    		    var thirdkey = res.data.thirdkey;	//session_key
    		    wx.request({
    			    url: 'https://www.*****.com',
    			    method: 'POST',
    			    data: {
    				    encryptedData: e.detail.encryptedData,
    				    iv: e.detail.iv,
    				    openid: openid,
    				    thirdkey: thirdkey
    			    },
    			    header: {'Accept': "*/*"},
    			    success: function (res) {
    				    console.log("提交到服务器成功了~~~~手机号登录")
    				    console.log(res.data)
    			    },
    			    fail: function (res) {
    			    	console.log("提交到服务器失败了")
    			    }
    		    })//end of wx.request
    		    }
    	    })
        }
    }
    
    展开全文
  • 微信小程序获取用户手机号,利用云开发云函数拿到session_key.pdf
  • 微信小程序获取用户手机号码

    万次阅读 多人点赞 2018-11-28 17:19:07
    零基础的我刚接触小程序写出来这个功能的时候我的心理活动是 好 开始写了  为了方便我给你们解释我给你们找了个图:    第一步:我们看看上边的说明书(获取登录凭证code)  这个code码是使用小程序...

    零基础的我刚接触小程序写出来这个功能的时候我的心理活动是

    好  开始写了 

    为了方便我给你们解释我给你们找了个图:

     

     第一步:我们看看上边的说明书(获取登录凭证code)

                   这个code码是使用小程序登录接口完成后取的,这个wx.request()请求是为了把code发送到后端,后端用code换区session_key和openid。

     wx.login({
        success: function (res) {
          if (res.code) { //使用小程序登录接口完成后端用户登录
            wx.request({
              url: app.d.hostUrl + 'getOpenid',//你自己api接口的路径
              data: {
                code: res.code,
                appid: "你的小程序AppID",
                secret: "你的小程序secret",
              },
              success: function (res) {
                //把openid保存到缓存里
                wx.setStorageSync("openid", res.openid);
                wx.setStorageSync("session_key", res.session_key);
              }
            })
          } else {
            console.log('获取用户登录态失败!' + res.errMsg)
          }
        }
      });

    前端已经把获取openid和session_key需要的参数传给后端了,后端怎么写呢,嘻嘻,这样写:

     

    //用code换session_key和openid
    public function getOpenid(){
    	global $_GPC;//这是微擎框架 $_GPC想当于$_GET和$_POST
    	$code = $_GPC['code'];
    	$appid = $_GPC['appid'];
    	$secret = $_GPC['secret']; 
    	$api = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
        $str = $this->httpGet($api);
            return $str;
    }
    private function httpGet($url){
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_TIMEOUT, 500);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
            curl_setopt($curl, CURLOPT_URL, $url);
            $res = curl_exec($curl);
            curl_close($curl);
            return $res;
    }

    这样,前端success就能拿到openid和session_key了,现在,我们要在后端用session_key和openid来解密手机号码了

    第二步:我们来写个解密手机号码的接口,看说明书,我们现在要开始写getPhoneNumber了,等会小程序端要调用,看代码之前先给你们看看官方文档

    链接:开放数据校验与解密

    往下翻,点击下载解压后长下面这样

     然后,看demo,把里面的固定参数换成我们自己的,简化一下就是这面这点代码,我是完全复制,顺序都没改:

    public function getPhoneNumber(){
    //这是解密手机号码的接口,等会前端还要写个请求访问这个接口拿到手机号码
    		global $_GPC;
    		require_once dirname(__FILE__) . '/mail/WXBizDataCrypt.php';
    		$appid = $_GPC['appid'];
            $sessionKey = $_GPC['session_key'];
            $encryptedData = $_GPC['encryptedData'];
            $iv = $_GPC['iv'];
            $pc = new WXBizDataCrypt($appid, $sessionKey);
    		$errCode = $pc->decryptData($encryptedData, $iv, $data );
    		if ($errCode == 0) {
    		    print($data . "\n");
    		} else {
    		    print($errCode . "\n");
    		}
    	}

    然后这里面的wxBizDataCrypt.php和errorCode.php的路径根据你的项目路径改一下1:要在这个接口里面改wxBizDataCrypt.php的路径2:到wxBizDataCrypt.php文件改errorCode.php路径。

    第三步:写完这个接口我们看一下上面的说明书,我们要开始调用了,调用这个接口同样是写一个请求,这个接口需要什么呢,看里面,他需要appid、session_key、encryptedData、iv。

    那现在(wmxl)是不是要有一个按钮触发,点了那个按钮就能获取手机号码了(我要写的非常详细)

    <button bindgetphonenumber='getPhoneNumber'> 使用微信登录 </button>

     最后,手机号码就获取到了。

     

    getPhoneNumber:function (e) {
        var detail = e.detail;
        wx.request({
          url: app.d.hostUrl + 'getPhoneNumber',  //解密手机号码接口
          data: {
            "appid": app.d.appId,
            "session_key": wx.getStorageSync('session_key'),
            "encryptedData": detail.encryptedData,
            "iv": detail.iv
          },
          success: function (res) {
            console.log(res.data.phoneNumber);
            wx.setStorageSync("phonenumber", res.data.phoneNumber);
            
          }
        })
      },

    有什么不对的地方欢迎纠正。

                                                            此时,一位热心网友离开现场去给你们买点桔子。

                                                                   

     

    展开全文
  • 前端微信小程序获取code,后台使用php获取session_key和openid;然后结合iv和encryptedData解密出微信用户手机号码 【操作步骤】 第1步:wx.login获取code 第2步:传递code到服务器,获取session_key和openid 第3步...
  • 前端微信小程序获取code,后台使用asp获取session_key和openid;然后结合iv和encryptedData解密出微信用户手机号码【操作步骤】第1步:wx.login获取code第2步:传递code到服务器,获取session_key和openid第3步:...
  • 微信小程序获取用户手机号–官方示例 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html 有C++,PHP,Java,Python等。 我失败的原因在于: 注意:目前该接口针对非...

    微信小程序获取用户手机号–官方示例
    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
    有C++,PHP,Java,Python等。
    我失败的原因在于:
    注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。

    展开全文
  • 前端微信小程序获取code,后台使用asp获取session_key和openid;然后结合iv和encryptedData解密出微信用户手机号码 【操作步骤】 第1步:wx.login获取code 第2步:传递code到服务器,获取session_key和openid 第3步...
  • 需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。 官网地址如下: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html ...
  • 最近在写一个小程序,用了云开发,然后在获取手机号这出现了点小问题 坑爹的百度一搜出来,都是好多重复且错误的例子 上面的答案都是这个样子的,但总感觉哪里不对 微信小程序云开发获取手机号码还需要通过code发到...
  • 小程序授权,经常用到的,获取手机号码,获取用户信息,都是用的bindgetphonenumber 和bindgetuserinfo <button class="phone" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">手机号...
  • 微信小程序获取用户手机号后端处理官网流程概述后端逻辑数据校验后端实现 官网流程概述 微信官方网页对于微信小程序获取用户手机号的处理描述如下 这页主要是对前端做法的描述,主要描述了前端应该提前通过wx....
  • 微信小程序获取手机号的项目中。小程序将encryptedData和iv,code值传到服务器后,进行解密,但是解密一直报错-41003 问题的根源在于 encryptedData中有+号,在http传递过程中,被转义为空格,所以服务器端拿到的值...
  • 获取用户手机号码 有两种方法获取用户手机号码; 第一种:一条数据提交 code 、encryptedData、iv 一起提交; 思路解析: 1.根据缓存 判断用户是否登录; 2.wx.login 发送 res.code 存储到公共数据中,等数据提交时...
  • 微信小程序 用户手机号码 openid session_key java
  • 微信小程序获取用户手机号java后端

    千次阅读 2020-09-17 09:53:15
    小程序端会先调用登录:wx.login获取code,往后端传入的参数有:iv,encryptedData,code,这里注意用post结构体接受参数,不要去url中传,会导致无法准确解密。 代码: @RequestMapping(value = "obtainPhone",...
  • 第一步,登录,获取用户的session_key; 第二步,点击按钮调用bindgetphonenumber 事件,通过该事件得到encryptedData 和 iv 第三步,把session_key,encryptedData 和 iv 传递给后端解密得到用户的手机号信息 ...
  • 微信小程序获取用户手机号授权

    千次阅读 2018-05-31 14:01:10
    &lt;text class='mobile'&gt;{{phoneNumber}}&lt;/text&gt; &lt;span style="font-size:14px;"&gt; &lt;button open-type="...手机号码授权&lt;/butto
  • 第一步,登录,获取用户的session_key; 第二步,点击按钮调用bindgetphonenumber 事件,通过该事件得到encryptedData 和 iv 第三步,把session_key,encryptedData 和 iv 传递给后端解密得到用户的手...
  • 写的很好的文章 记录一下 https://ask.dcloud.net.cn/article/37452 这个文章写的很详细,有需求的可以去看看。
  • 最近公司小程序有个获取用户手机号功能,废话不多说直接上代码。 1.login方法获取code,用code调用后端接口获取sessionKey(即code2sessionAPI) function getSessionKey() { return new Promise((resolve, reject...
  • //小程序appid和appsecret配置 string appid = "小小星星亮晶晶"; string secret = "小小星星亮晶晶"; string code = Request["code"];//微信获取登录的口令 Stream s_re = WebRequest.Create(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,322
精华内容 26,128
关键字:

小程序获取用户手机号