精华内容
下载资源
问答
  • 无认证 防止第三方应用获取手机号的此规则可防止第三方通过ISP API获取您的电话号码。 谢谢
  • android手机获取手机号

    千次阅读 2019-06-26 09:03:40
    最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。 网上不符合需求的方法 Google了一下,网上的做法如下: //获取手机号码 TelephonyManagertm=(TelephonyManager)this....

    来源:http://www.cnblogs.com/android100/p/android-get-num.html

    最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。

    网上不符合需求的方法

    Google了一下,网上的做法如下: 

    1. //获取手机号码  
    2. TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);  
    3.   String deviceid = tm.getDeviceId();//获取智能设备唯一编号  
    4.   String te1  = tm.getLine1Number();//获取本机号码  
    5.   String imei = tm.getSimSerialNumber();//获得SIM卡的序号  
    6.   String imsi = tm.getSubscriberId();//得到用户Id  

    添加权限: 

    1. <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.READ_PHONE_STATE"/  

    以上做法有可能获取sim卡号,但是现在最起码在电信手机卡上获取不到。

    原因好像、似乎是:

    手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。试想,你的SIM卡丢失后,补办一张新的会换号码吗?是不会的.就是因为在你的手机号码对应的IMSI号 在移动运营商中被修改成新SIM卡的IMSI号码。 

    那么我们怎么解决这个问题呢?

    不好实现?一个原因搞定你:项目需要!!

    查了下手机的基本信息那一栏里,也没有找到手机号,看来手机中似乎没有存储这手机号。那么我就只有使用变通的手法来获取手机号了。

    就是给10001发送一个短信,找了一下,发个501查询套餐情况就可以。10001会给你个反馈信息,其中包含手机号码

    那么我们发送短信,然后监听得到此短信,然后分解字符串那么就可以得到手机号了。

    如果是联通或者移动应该也是有类似的情况。何况给他们发短信应该不会收费。。。O(∩_∩)O~

    程序如何实现?

     

    1.监听短信类 

    1. package com.example.smsmanager;  
    2.   
    3. import android.content.BroadcastReceiver;  
    4. import android.content.Context;  
    5. import android.content.Intent;  
    6. import android.telephony.SmsMessage;  
    7.   
    8. public class SMS_Receiver extends BroadcastReceiver {  
    9.   
    10.     final String GetNumberAddress="10001";  
    11.     @Override  
    12.     public void onReceive(Context context, Intent intent) {  
    13.         // TODO Auto-generated method stub  
    14.         if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){  
    15.               
    16.             Object[] pdus=(Object[])intent.getExtras().get("pdus");  
    17.             //不知道为什么明明只有一条消息,传过来的却是数组,也许是为了处理同时同分同秒同毫秒收到多条短信  
    18.             //但这个概率有点小  
    19.             SmsMessage[] message=new SmsMessage[pdus.length];  
    20.             StringBuilder sb=new StringBuilder();  
    21.             System.out.println("pdus长度"+pdus.length);  
    22.             String address="";  
    23.             for(int i=0;i<pdus.length;i++){  
    24.                 //虽然是循环,其实pdus长度一般都是1  
    25.                 message[i]=SmsMessage.createFromPdu((byte[])pdus[i]);  
    26.                 sb.append("接收到短信来自:\n");  
    27.                 address=message[i].getDisplayOriginatingAddress();  
    28.                 sb.append(address+"\n");  
    29.                 sb.append("内容:"+message[i].getDisplayMessageBody());  
    30.             }  
    31.             System.out.println(sb.toString());  
    32.             if(SMSCore.PhoneNumber==""&&address.equals(GetNumberAddress)){  
    33.                 SMSCore.PhoneNumber=SMSCore.GetPhoneNumberFromSMSText(sb.toString());  
    34.                 MessageTools.ShowDialog(context, address);  
    35.             }  
    36.             MessageTools.ShowDialog(context, sb.toString().trim());  
    37.             MessageTools.ShowDialog(context, SMSCore.PhoneNumber);  
    38.         }  
    39.     }  
    40.   
    41. }  



    2.短信操作类 

    1. package com.example.smsmanager;  
    2.   
    3. import java.sql.Date;  
    4. import java.util.ArrayList;  
    5. import java.util.List;  
    6. import java.util.regex.Matcher;  
    7. import java.util.regex.Pattern;  
    8.   
    9. import android.view.View;  
    10. import android.view.View.OnClickListener;  
    11. import android.content.BroadcastReceiver;  
    12. import android.app.Activity;  
    13. import android.app.PendingIntent;  
    14. import android.content.Context;  
    15. import android.content.Intent;  
    16. import android.content.IntentFilter;  
    17. import android.telephony.SmsManager;  
    18. import android.util.Log;  
    19. import android.content.ContextWrapper;  
    20.   
    21. public class SMSCore {  
    22.       
    23.         public static String PhoneNumber="";  
    24.         //==============Get Phone Number ==============================  
    25.           
    26.         //get the phone number from sms  
    27.         public static String GetPhoneNumberFromSMSText(String sms){  
    28.               
    29.             List<String> list=GetNumberInString(sms);  
    30.             for(String str:list){  
    31.                 if(str.length()==11)  
    32.                     return str;  
    33.             }  
    34.             return "";  
    35.         }  
    36.         public static List<String> GetNumberInString(String str){  
    37.             List<String> list=new ArrayList<String>();  
    38.                 String regex = "\\d*";  
    39.                         Pattern p = Pattern.compile(regex);  
    40.   
    41.                         Matcher m = p.matcher(str);  
    42.   
    43.                         while (m.find()) {  
    44.                         if (!"".equals(m.group()))  
    45.                          list.add(m.group());  
    46.                           }  
    47.                       return list;  
    48.         }  
    49.           
    50.         //===========================================================  
    51.         //  
    52.         //  
    53.         //=============Send SMS================  
    54.         public  void SendSMS(String number,String text,Context context){  
    55.                
    56.             PendingIntent pi = PendingIntent.getActivity(context, 0,  
    57.                     new Intent(context, context.getClass()), 0);  
    58.             SmsManager sms = SmsManager.getDefault();  
    59.             sms.sendTextMessage(number, null, text, pi, null);  
    60.   
    61.         }  
    62.           
    63.         public void SendSMS2(String number,String text,Context context){  
    64.             String SENT = "sms_sent";  
    65.             String DELIVERED = "sms_delivered";  
    66.             PendingIntent sentPI = PendingIntent.getActivity(context, 0, new Intent(SENT), 0);  
    67.             PendingIntent deliveredPI = PendingIntent.getActivity(context, 0, new Intent(DELIVERED), 0);  
    68. //            
    69. //          //  
    70. //           registerReceiver(new BroadcastReceiver(){  
    71. //                  @Override  
    72. //                  public void onReceive(Context context, Intent intent){  
    73. //                      switch(getResultCode())  
    74. //                      {  
    75. //                          case Activity.RESULT_OK:  
    76. //                              Log.i("====>", "RESULT_OK");  
    77. //                              System.out.println("RESULT_OK");  
    78. //                                
    79. //                              break;  
    80. //                          case Activity.RESULT_CANCELED:  
    81. //                              Log.i("=====>", "RESULT_CANCELED");  
    82. //                              break;  
    83. //                      }  
    84. //                  }  
    85. //              }, new IntentFilter(DELIVERED));  
    86. //            //  
    87.               
    88.             SmsManager smsm = SmsManager.getDefault();  
    89.             smsm.sendTextMessage(number, null, text, sentPI, deliveredPI);  
    90.         }  
    91.           
    92.         //=====================================  
    93. }  

     

    3.弹出框操作类 

    1. package com.example.smsmanager;  
    2.   
    3. import android.app.AlertDialog;  
    4. import android.app.AlertDialog.Builder;  
    5. import android.content.Context;  
    6. import android.content.DialogInterface;  
    7. import android.content.DialogInterface.OnClickListener;  
    8.   
    9. public class MessageTools {  
    10.     public static void ShowDialog(Context context, String text){  
    11.         AlertDialog.Builder builder = new Builder(context);  
    12.           builder.setMessage(text);  
    13.   
    14.           builder.setTitle("提示");  
    15.   
    16.           builder.setPositiveButton("确认", new OnClickListener() {  
    17.   
    18.            @Override  
    19.            public void onClick(DialogInterface dialog, int which) {  
    20.             dialog.dismiss();  
    21.   
    22.             dialog.dismiss();  
    23.            }  
    24.           });  
    25.   
    26.           builder.setNegativeButton("取消", new OnClickListener() {  
    27.   
    28.            @Override  
    29.            public void onClick(DialogInterface dialog, int which) {  
    30.             dialog.dismiss();  
    31.            }  
    32.           });  
    33.   
    34.           builder.create().show();  
    35.     }  
    36. }  


     

     

    4.调用如下: 

    1. //  
    2.     private static final String ACTION_SMS_SEND = "lab.sodino.sms.send";    
    3.     private static final String ACTION_SMS_DELIVERY = "lab.sodino.sms.delivery";    
    4.     private static final String ACTION_SMS_RECEIVER = "android.provider.Telephony.SMS_RECEIVED";  

     

    1. // 注册接收下行receiver    
    2.        SMS_Receiver smsReceiver= new SMS_Receiver();    
    3.        IntentFilter receiverFilter = new IntentFilter(ACTION_SMS_RECEIVER);    
    4.        registerReceiver(smsReceiver, receiverFilter);    
    5. //发送短信  
    6. SMSCore smscore=new SMSCore();  
    7. smscore.SendSMS2("10001", "501", context);  

     

    运行结果:

    我们可以得到了想要的手机号码了!

     

     

     

     

     

     

     

     

     

    ------------------------------------------------------------------------------------------------------------------------------------------------

     

     

     

     

     

     

     

     

    android 安卓APP获取手机设备信息和手机号码的代码示例

     

    下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码

     

    准备条件:一部安卓手机、手机SIM卡确保插入手机里、eclipse ADT和Android-sdk开发环境

     

    第一步:新建一个android工程(JinshanTest),

     

    并需要在工程的AndroidManifest.xml文件中,添加权限

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

     

    图例:

     

     

    第二步:新建一个工具类PhoneInfo.Java

     

    [java] view plain copy

     

     print?

    1. package com.jinshan.test;  
    2.   
    3.   
    4. import android.content.Context;  
    5. import android.telephony.TelephonyManager;  
    6.   
    7. /** 
    8.  * 读取手机设备信息测试代码 
    9.  * http://www.souapp.com 搜应用网  
    10.  * song2c@163.com 
    11.  * 宋立波 
    12.  */  
    13. public class PhoneInfo {  
    14.   
    15.     private TelephonyManager telephonyManager;  
    16.     /** 
    17.      * 国际移动用户识别码 
    18.      */  
    19.     private String IMSI;  
    20.     private Context cxt;  
    21.     public PhoneInfo(Context context) {  
    22.         cxt=context;  
    23.         telephonyManager = (TelephonyManager) context  
    24.                 .getSystemService(Context.TELEPHONY_SERVICE);  
    25.     }  
    26.   
    27.     /** 
    28.      * 获取电话号码 
    29.      */  
    30.     public String getNativePhoneNumber() {  
    31.         String NativePhoneNumber=null;  
    32.         NativePhoneNumber=telephonyManager.getLine1Number();  
    33.         return NativePhoneNumber;  
    34.     }  
    35.   
    36.     /** 
    37.      * 获取手机服务商信息 
    38.      */  
    39.     public String getProvidersName() {  
    40.         String ProvidersName = "N/A";  
    41.         try{  
    42.         IMSI = telephonyManager.getSubscriberId();  
    43.         // IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。  
    44.         System.out.println(IMSI);  
    45.         if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {  
    46.             ProvidersName = "中国移动";  
    47.         } else if (IMSI.startsWith("46001")) {  
    48.             ProvidersName = "中国联通";  
    49.         } else if (IMSI.startsWith("46003")) {  
    50.             ProvidersName = "中国电信";  
    51.         }  
    52.         }catch(Exception e){  
    53.             e.printStackTrace();  
    54.         }  
    55.         return ProvidersName;  
    56.     }  
    57.       
    58.     public String  getPhoneInfo(){  
    59.          TelephonyManager tm = (TelephonyManager)cxt.getSystemService(Context.TELEPHONY_SERVICE);  
    60.             StringBuilder sb = new StringBuilder();  
    61.   
    62.             sb.append("\nDeviceId(IMEI) = " + tm.getDeviceId());  
    63.             sb.append("\nDeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion());  
    64.             sb.append("\nLine1Number = " + tm.getLine1Number());  
    65.             sb.append("\nNetworkCountryIso = " + tm.getNetworkCountryIso());  
    66.             sb.append("\nNetworkOperator = " + tm.getNetworkOperator());  
    67.             sb.append("\nNetworkOperatorName = " + tm.getNetworkOperatorName());  
    68.             sb.append("\nNetworkType = " + tm.getNetworkType());  
    69.             sb.append("\nPhoneType = " + tm.getPhoneType());  
    70.             sb.append("\nSimCountryIso = " + tm.getSimCountryIso());  
    71.             sb.append("\nSimOperator = " + tm.getSimOperator());  
    72.             sb.append("\nSimOperatorName = " + tm.getSimOperatorName());  
    73.             sb.append("\nSimSerialNumber = " + tm.getSimSerialNumber());  
    74.             sb.append("\nSimState = " + tm.getSimState());  
    75.             sb.append("\nSubscriberId(IMSI) = " + tm.getSubscriberId());  
    76.             sb.append("\nVoiceMailNumber = " + tm.getVoiceMailNumber());  
    77.            return  sb.toString();  
    78.     }  
    79. }  


     

     

    第三步:在启动的Activity,JinshanTestActivity中添加,调用代码:

     

    [java] view plain copy

     

     print?

    1. package com.jinshan.test;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5.   
    6. public class JinshanTestActivity extends Activity {  
    7.     /** Called when the activity is first created. */  
    8.     @Override  
    9.     public void onCreate(Bundle savedInstanceState) {  
    10.         super.onCreate(savedInstanceState);  
    11.         setContentView(R.layout.main);  
    12.           
    13.         PhoneInfo siminfo = new PhoneInfo(JinshanTestActivity.this);  
    14.         System.out.println("getProvidersName:"+siminfo.getProvidersName());  
    15.         System.out.println("getNativePhoneNumber:"+siminfo.getNativePhoneNumber());  
    16.         System.out.println("------------------------");  
    17.         System.out.println("getPhoneInfo:"+siminfo.getPhoneInfo());  
    18.     }  
    19.       
    20.       
    21.       
    22. }  


    第四步,把手机使用USB线,连接到电脑上,确保是连通性,开始运行工程

     

     

     

    最后,我们看LOGCAT日志,结果如下:

    ------------------------------------------------------------

    04-01 16:20:57.105: I/System.out(952): 460003121934674
    04-01 16:20:57.105: I/System.out(952): getProvidersName:中国移动
    04-01 16:20:57.115: I/System.out(952): getNativePhoneNumber:136XXXXXXX
    04-01 16:20:57.115: I/System.out(952): ------------------------
    04-01 16:20:57.145: I/System.out(952): getPhoneInfo:
    04-01 16:20:57.145: I/System.out(952): DeviceId(IMEI) = 352XXXXXXXX61328
    04-01 16:20:57.145: I/System.out(952): DeviceSoftwareVersion = 01
    04-01 16:20:57.145: I/System.out(952): Line1Number = 136XXXXXXX
    04-01 16:20:57.145: I/System.out(952): NetworkCountryIso = cn
    04-01 16:20:57.145: I/System.out(952): NetworkOperator = 46000
    04-01 16:20:57.145: I/System.out(952): NetworkOperatorName = 中国移动
    04-01 16:20:57.145: I/System.out(952): NetworkType = 2
    04-01 16:20:57.145: I/System.out(952): PhoneType = 1
    04-01 16:20:57.145: I/System.out(952): SimCountryIso = cn
    04-01 16:20:57.145: I/System.out(952): SimOperator = 46000
    04-01 16:20:57.145: I/System.out(952): SimOperatorName = CMCC
    04-01 16:20:57.145: I/System.out(952): SimSerialNumber = 898xxxxxx90108
    04-01 16:20:57.145: I/System.out(952): SimState = 5
    04-01 16:20:57.145: I/System.out(952): SubscriberId(IMSI) = 46000xxxxxxxx4674

    那么我们来解释一下上面的信息具体代表啥意思。

     

    getNativePhoneNumber 获取的手机号

    DeviceId(IMEI)手机  国际移动用户识别码

    NetworkOperator  移动运营商编号

    NetworkOperatorName  移动运营商名称

    SimSerialNumber  SimOperator  SimCountryIso  SimSerialNumber  SubscriberId(IMSI)   关于手机SIM卡的一些详细信息

     

    其实代码中没有写 获取System.ANDROID_ID这个操作,因为很多手机设备获取不到andnroid_id

     

    当然了,我们今天主要讲述<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 光使用这个权限我们可以获得的手机设备信息和手机号

    如果想获得WIFI,蓝牙,GPS,读写SDCARD更多的信息,就需要添加其它的权限。

     

    此外,本次测试我拿自己的手机SIM卡测试是可以获取到手机号码的,当然了有些手机号码是获取不到的,这里也给大家罗列了原因,

     

    手机号码不是所有的都能获取。只是有一部分可以拿到。

    这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。试想,你的SIM丢失后,补办一张新的会换号码吗?是不会的.就是因为在你的手机号码对应的IMSI号 在移动运营商中被修改成新SIM卡的IMSI号码。
      那么手机号为什么有的就能显示呢?
      这个就像是一个变量,当移动运营商为它赋值了,它自然就会有值。不赋值自然为空。
      对于移动的用户,手机号码(MDN)保存在运营商的服务器中,而不是保存在SIM卡里。SIM卡只保留了IMSI和一些验证信息。手机每次入网注册的时候,都会以短信的形式将IMSI及验证信息上传到运营商的服务器,服务器在完成注册动作之后,会以短信的形式将注册的结果下发到手机里。下发的内容会因条件不同而不同。
      如果服务器在下发的短信中,不包含手机的号码,手机是无法取得电话号码。如果短信中包含了号码,手机才会将其缓存,以备他用.此外,对于其他运行商的SIM卡或者UIM卡,MDN有可能保存在UIM卡中。100%能够取得本机号码不太可能。
      移动神州行,联通的卡是可以取到的.动感地带的取不到.别的卡还没有试过.
      能够读取SIM卡号的话应该有前提.那就是SIM卡已经写入了本机号码,不然是无法读取的。

    http://bbs.gfan.com/android-323295-1-1.html

    展开全文
  • 主要介绍了Android获取应用版本与版本名称的相关资料,需要的朋友可以参考下
  • 在小程序中,获取手机号有下面两种方式:一、用户进入首页(或某一页面),通过弹窗获取用户手机号,如下图所示:在用户进入小程序后,会弹出获取手机号提醒,用户点击授权,即可获得用户手机号码:开启办法:可视化...

    在小程序获客过程中,我们有非常多的应用场景希望获取当前访客的手机号,通过小程序提供的这一便利功能,可以大大增强我们的营销效果。

    在小程序中,获取手机号有下面两种方式:

    一、用户进入首页(或某一页面),通过弹窗获取用户手机号,如下图所示:

    fcde1cbec9e411067b43a5e44c2e69fb.png

    在用户进入小程序后,会弹出获取手机号提醒,用户点击授权,即可获得用户手机号码:

    812bde47538fe0db5c26f5a50a516a09.png

    开启办法:

    可视化制作工具 - 页面 - 首页,在右侧找到“登录”选项卡,即可设置手机号获取开关。

    1827904e747a0b158b057e114d6d6c37.png

    二、在用户填写表单时,获取手机号码:

    bf93bca0c08ce6ecc2c597a6e6e3b849.png

    开启办法:

    可视化制作工具 - 组件,拖拽“表单”组件进入工作区,然后拖拽“单行文本框”组件至表单内,在属性设置去,为“单行文本框”开启“自动读取用户手机号”即可。

    当用户点击手机号文本框时,会自动弹出授权提示窗口。

    请注意,小程序需要满足官方要求才能获取手机号,否则将会读取失败:

    1. 微信小程序获取手机号功能,仅支持企业主体注册的小程序,并且小程序已通过微信认证

    2. 百度小程序获取手机号功能,需要在百度小程序后台申请开通后才能使用

    展开全文
  • 获取微信手机号码

    千次阅读 2020-07-10 20:24:38
    普通的access_token,是微信开发者调用微信所提供的各种借口的一个凭证,有效时间为7200秒,也就是两个小时,而且一个公众号每天获取它的次数微信那边是有限制的,上限是2000次。 使用范围:通过网页授权获得的...

     

     

    access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需要使用access_token。

    微信开发需要用到的access_token,其实是分为两个种类的,一种是普通的access_token,另一种是网页授权access_token。

    普通的access_token,是微信开发者调用微信所提供的各种借口的一个凭证,有效时间为7200秒,也就是两个小时,而且一个公众号每天获取它的次数微信那边是有限制的,上限是2000次。

    使用范围:通过网页授权获得的access_token,只能获取到对应的微信用户信息,与微信用户是一对一关系;而普通的access_token在有效期内可以使用,可以获取所有用户信息

    网页授权access_token,是第三方网页若需要使用用户的微信账户登录,需要获取它,从而来获取用户微信账户的信息。

    另外,获取用户微信账户信息也有两种情况:

    1. 普通的获取用户信息,只需要调用微信用户信息接口就能获取,因而使用的是第一种普通的access_token。

    2. 网页授权时获取微信用户信息,用的就是第二种,网页授权access_token。

    两种access_token混淆的话就会有 “invalid access_token” 的错误。

    要注意的是,第一种普通的access_token是全局性的,就是说一旦重新调用接口获取一个新的普通的access_token,之前的那个旧的普通的access_token就会失效,因而用旧的普通的access_token就无法成功地调用相关的接口。所以这种特性可能会导致一些情况,比如说,多个不同的进程独立的去获取这种普通的access_token,就会导致有些接口没办法正常地调用相关的微信接口。一般的话,可以用定时器定时地更新access_token,或者将其缓存在缓存或者数据库当中,设置失效时间,在缓存当中找不到或者已经失效的情况下,再通过接口重新获取的方式来解决类似的问题。

    原文:https://blog.csdn.net/huangyuehong914/article/details/82492628 

    网页授权access_token

    微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息。

    OAuth2.0

    说到信息获取,不得不提OAuth2.0。OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。

    OAuth的思路就是在第三方应用程序和服务提供商之间,设置一个授权层(authorization layer)。第三方应用程序不能直接登录服务提供商,只能登录授权层,以此将用户与第三方应用程序区分开来。第三方应用程序登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。具体流程图如下: 

    •  step1:用户访问公众号页面。
    • step2:回调授权。(后面详解)。
    • step3:用户同意授权。
    • step4:重定向到公众号,并返回code。
    • step5:公众号通过code获取网页授权access_token。
    • step6:刷新access_token(如果需要)。
    • step7:公众号通过access_token来获取用户信息。

    上述step2的具体授权分析 
    若用户只获取用户的openid,则是默认授权,用户不会感知到授权的发生,而是直接进入了回调页(往往是用户页面)。在没有关注的情况下,若想获取其他用户信息snsapi_userinfo,就需要用户手动同意。对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是snsapi_userinfo,也是静默授权,用户无感知。
    所以在这里问题就有归结于,用户openid的获取,获取我知道的有两种方式:

    1.在用户完成支付之后的回调接口当中,可以获取到用户的openid

    2.用access_token 获取用户授权的code,再使用code 取获取用户的openid

    支付我们就不说了,来看一下第二种获取的方式:

    code的获取,具体可以去看微信的开发文档

    参数:

    用户同意授权后,页面将跳转至上步设置的回调链接上,并带上code和state参数。
    code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

    通过code换取网页授权access_token

    如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止

    具体是将上步获取到的code值传给下面的链接,即替换code=CODE中的CODE。 
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 
    参数说明:

     响应会得到如下json数据,参数如下:

    刷新access_token

    由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。 
    具体做法:利用上步获取到的refresh_token来重新授权。
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN 
    链接中的参数只需要将REFRESH_TOKEN替换成上一步获取到的access_token值,APPID换成自己公众号的appid就可以重新获得授权。返回的参数和上一步获取access_token返回的参数一样,都是那五种。

    利用access_token获取用户信息

    如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。 
    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    参数说明:

    返回json数据,参数说明:

     

    利用普通access_token获取用户信息

    在关注者与公众号产生信息交互后,公众号可获得关注者(注意:用此种方法获取用户信息,前提是用户必须关注公众号)的openid(加密后的微信号,每个用户对每个公众号的openid是唯一的)。公众号可通过本接口来根据openid获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
    调用接口https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN,请求方式为GET。

     

    参数说明:

    返回参数:

    除此之外获取到的信息还有:

    subscribe_scene:返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENEPROFILE LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他
    qr_scene:二维码扫码场景(开发者自定义)

    qr_scene_str:二维码扫码场景描述(开发者自定义)

    大家可以看到的就是,普通的access-token获取到的用户信息是多余 授权获取到的,授权获取到的都是写基本的用户信息;

    以上就是两种token的相关内容的理解,如有不合理的地方,可以留言指正;

    参考文章:
    1. 微信公众平台技术文档

    2.https://blog.csdn.net/benben_2015/article/details/79703508

    3.https://blog.csdn.net/huangyuehong914/article/details/82492628

     

    小程序开发文档

    https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html

    微信获取手机号码地址

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

    展开全文
  • 微信小程序如何获取用户手机号

    千次阅读 2020-03-09 10:52:30
    微信小程序如何获取用户手机号 ? 本篇文章将教会你微信小程序快速、有效获取用户手机号。 微信小程序获取手机号,仅企业小程序支持,个人小程序账号暂不支持。 1、小程序端调用 wx.login() 方法,获取 code 后,...

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

    本篇文章将教会你,使用微信小程序快速、有效获取用户手机号的方法。
    微信小程序获取手机号,仅企业小程序支持,个人小程序账号暂不支持。

    1、小程序端调用 wx.login() 方法,获取 code 后,将 code 通过后台 api 接口传递到后台。

      /**
       * 获取openid、userToken
       */
      getServerUserInfo: function (e) {
        let that = this
        wx.login({
          success: function (res) {
            if (res.code) {
              wx.request({
                url: app.serverUrl + 'api/login/getUserInfo',
                data: {
                  code: res.code
                },
                header: {
                  'content-type': 'application/json'
                },
                success: function (e) {
                  that.setData({
                    userToken: e.data.userToken,
                  })
                }
              })
            }
          }
        })
      },
    

    2、后台 api 接口收到 code 后,调用微信接口 jscode2session , 换取 openid 、 session_key 、 unionid

    这里有三个知识点必须十分清楚:

    1)unionid : 同一用户 ,在同一开发平台下,多个应用 unionid 相同 。 不同应用下 openid 是不同的 , 若需要打通多个应用的用户体系 , unionid 是唯一的做法。

    2) session_key : 为应用安全,session_key 不应该直接传递到小程序端 , 正确的做法是将 session_key 存储在服务器端 。

    session_key 存储方式这里以 redis 为例进行讲解,调用 jscode2session 接口返回的数据有 openid 和 session_key , openid 是唯一的 , 因此 redis 存储的 key 可以为 openid 的 MD5 加密字符串 , value 为 session_key , 有效期可设置为 10 min(你认为的合适的有效期) , openid 的加密字符串作为 userToken 返回给小程序 , 这样我们在使用的时候 , 就可以通过 userToken 来换取 session_key 。

    3)session_key 有效期:微信平台不会告诉我们 session_key 准确的有效期 , 会有过期的情况出现 , 如何验证 session_key 的有效性呢 ? 在小程序端可以使用 wx.checkSession() 方法来验证 session_key 有效性 ,若 session_key 失效 ,则需要重新执行 wx.login() 方法 , 也就是从第一步开始重新执行 。

    这里使用 Java 语言编写 , 代码如下 :

        /**
         * 获取用户信息
         * @param request
         * @return
         */
        @RequestMapping("/getUserInfo")
        @ResponseBody
        private WxLoginResult getUserInfo(HttpServletRequest request) {
            String code = request.getParameter("code");
            WxLoginResult wxLoginResult = null;
            String urlStr = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code";
            try {
                URL url = new URL(urlStr);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
                String line;
                StringBuilder sb = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }
                br.close();
                connection.disconnect();
                System.out.println(sb.toString());
                String result = sb.toString();
                wxLoginResult = new Gson().fromJson(result, WxLoginResult.class);
                String userToken = Md5Util.encode(wxLoginResult.getOpenid());
                wxLoginResult.setUserToken(userToken);
                redisCacheUtil.setCacheObject(userToken, wxLoginResult.getSession_key());
            } catch (Exception e) {
                e.printStackTrace();
            }
            wxLoginResult.setSession_key("");
            return wxLoginResult;
        }
    

    3、小程序端提交 code 调用后台 api 接口后 , 获取 api 接口返回的 userToken ,通过页面 button 点击调用后台接口 , 传递参数 userToken 、 iv 、 encryptedData 到后台进行数据解密,得到 phoneNumber

    1)页面设置

    <button class="btn"  open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">{{phoneNumber==null?'获取手机号':phoneNumber}}</button>
    

    2) 获取手机号 button 点击后将获取到 encryptedData 和 iv ,即可调用后台 api 接口获取手机号

    getPhoneNumber: function (e) {
        var that = this;
        if (e.detail.errMsg == "getPhoneNumber:ok") {
          wx.request({
            url: app.serverUrl+'/api/login/decodePhone',
            data: {
              encryptedData: e.detail.encryptedData,
              iv: e.detail.iv,
              userToken: that.data.userToken,
            },
            header: {
              'content-type': 'application/json' 
            },
            success: function (res) {
              that.setData({
                phoneNumber:res.data.phoneNumber
              })
            }
          })
        }
      },
    

    3) 后台 api 接口接收参数 : encryptedData 、 iv 、 userToken 解密出手机号 phoneNumber ,这里解密算法为 Java 语言编写 , 代码如下 :

        /**
         * 解密用户信息
         */
        public static String getUserInfo(String encryptedData, String sessionKey, String iv) {
            byte[] dataByte = Base64.decode(encryptedData);
            byte[] keyByte = Base64.decode(sessionKey);
            byte[] ivByte = Base64.decode(iv);
            try {
                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;
                }
                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(Cipher.DECRYPT_MODE, spec, parameters);
                byte[] resultByte = cipher.doFinal(dataByte);
                if (null != resultByte && resultByte.length > 0) {
                    String result = new String(resultByte, "UTF-8");
                    return result;
                }
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidParameterSpecException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            } catch (NoSuchProviderException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    总结:

    1) 解密 encryptedData 数据十分重要 , 我第一次做 encryptedData 解密的时候花了不少时间。

    2) session_key 的正确处理方式是服务器保存 , 将可以获取 session_key 的钥匙传递给小程序端 , 防止出现安全问题 。

    3) 小程序端发起获取用户手机号操作,必须使用 button 并设置 open-type=“getPhoneNumber” ,并从 button 的绑定事件中获取所需信息 。

    以上就是微信小程序获取用户手机号的详细过程 , 你学会了吗 ? 如果你有任何疑问 , 欢迎加我个人微信 study2100 , 我会为你做进一步解答 。

    展开全文
  • Delphi D10.X安卓APP开发中获取硬件信息及手机号,完整代码,安卓5.1到10可使用。请查看压缩包里说明,及https://blog.csdn.net/tanqth/article/details/104779089文章。
  • Android 获取手机号码

    千次阅读 2018-06-13 14:16:25
    部分应用需要获取手机的号码,可以采用代码的方式来获取。代码如下:public String getNativePhoneNumber() { telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); if ...
  • 支付宝小程序获取手机号码跟微信小程序的不一样,所以获取的流程也有很多的不同,所以第一步并不是直接写代码。 流程如下: 一、登录支付宝小程序开发管理平台 ->开发中心->小程序应用->选择你的小程序...
  • auto.js源码,可以直接获取手机应用的详细信息,以对话框的方式弹出信息
  • 运单号获取用户手机号

    千次阅读 2019-09-22 12:01:25
    遇到一个需求,需要通过扫描运单号获取手机人手机号信息,这个功能主要运用于快递柜扫描单号快捷入库,百度了一波,说什么的都有,下面分享一下从百度上分享到的答案: 一、有这种接口的,但是一般都是不会公开的...
  • 微信小程序授权登录+获取手机号

    千次阅读 2021-04-27 16:19:17
    微信小程序授权登录+获取手机号一、官方文档背景:小程序登录的链接:微信小程序获取手机号的链接:二、微信小程序授权登录+获取手机号1、简单说明官方文档的操作:先授权登录后拿手机号2、前端代码:(1)自定义util....
  • Android开发,获取当前手机安装的所有应用、根据包名获取应用信息、获取当前应用程序的包名、获取程序 图标、获取程序的版本获取程序的名字、获取程序的权限、获取程序的签名、获取当前包名的 SHA1、将获取到得...
  • react-native-version-number, 获取应用程序的版本和内部版本 react-native-version-number 返回 CFBundleShortVersionString 上的和 CFBundleVersion 和 bundleIdentifier 。 对于 Android,返回
  • Android开发,获取手机上的某个应用应用名称、应用图标、应用包名、应用签名、应用SHA1、应用版本、打开应用、卸载应用的一些信息的安装包。(可以用于微信支付时需要的一些签名)
  • 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 之后开发者服务器可以根据用户标识来生成自定义登录态,用于...
  • 获取手机号码

    千次阅读 热门讨论 2018-10-15 10:25:47
    //获取手机号码  TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);  String deviceid = tm.getDeviceId();//获取智能设备唯一编号  String te1 = tm....
  • Loading...android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法1)获取运营商sim卡imsi号:String android_imsi = telephonyManager.getSubscriberId();//获取手机IMSI号String IMSI = android.os.System...
  • 获取手机应用列表和APP应用信息

    千次阅读 2016-11-02 13:31:20
    各种获取应用信息小功能,做个笔记: /** * 获取版本名 * * @param context * @return 获取版本名 */ public static String getVersionName(Context context) { PackageInfo packageInfo = null;
  • 微信小程序授权登录和获取手机号码 1.授权登录 前端这里,在app.js里面,写获取openid onLaunch: function() { this.getOpenID() }, //封装了登录 getOpenID获取openid的公共函数 getOpenID: async function()...
  • 微信解密手机号注意事项。 session_key可能会过期,有人为了解决这种问题,采取每次解密都获取最新session_key的... 获取手机号解密成功:进行登录操作 手机号解密失败: wx.login 调用后端接口getMsg获得session_ke
  • 获取当前微信用户手机号码

    千次阅读 2020-07-24 11:24:02
    java实现获取微信用户手机号码。
  • 创建小程序项目(测试即可) 创建Java后台项目(此处为SpringBoot 普通项目) 二、前端代码  WXML 代码 &lt;!--index.wxml--&gt; &lt;view class="container"&gt; &lt;view ...
  • 微信登入及获取微信手机号

    千次阅读 2019-02-25 17:42:15
    调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。 调用 code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 之后开发者服务器可以根据用户标识来生成自定义登录态,...
  • 采集用户手机上安装应用的各种信息,目前可以采集到的有:应用名称、版本、、安装时间、更新时间等 代码: private void getPackages() { // 获取已经安装的所有应用, PackageInfo 系统类,包含应用...
  • 需要验证手机号的功能,但是国内的手机多是双卡双待的,无法获取到两个号码。在Android的官方文档是没有提供相应的Api的,因为标准的Andoird是没有双卡的,好像也只有国内才会搞双卡双待的神器吧。以下记录一下做这...
  • Html5 获取手机短信号码

    万次阅读 2016-06-15 15:44:50
    "请输入手机号码" > < input type = "button" id = "getting" value = "获取验证码" > div > body > html > ——————————————————————— 有需求者请加qq:...
  • 微信小程序获取手机号php

    千次阅读 2018-10-30 13:40:11
    微信小程序授权获取手机号 &lt;?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/7/16 0016 * Time: 上午 10:50 */ //require_once '../../../../lib/wxBizDataCrypt.php'; class top...
  • 【第一个问题获取手机中所有应用的包名与权限】 有时候你的App需要跳转到其他的App,你需要知道他的包名,最简单的方法就是通过Android自带的方法去获取了。一般的包名都是能够一眼看出来的,要么是应用名的拼音...
  • 在android2.3以下的系统中,可以使用如下的代码来获取Android系统的本地IP地址: private String getLocalIPAddress1() throws SocketException{   for(Enumeration en = NetworkInterface.getNetworkInterfaces...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,422
精华内容 62,968
关键字:

如何禁止应用获取手机号