zoukankan      html  css  js  c++  java
  • .NET微信小程序获取用户手机号(转载)

    官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

    功能 介绍 使用方法
    获取手机号
    获取微信用户绑定的手机号,需先调用wx.login接口。
    因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。
    注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。
    wx.login获取的code有效期为5分钟,5分钟后需要重新获取。
     
    <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
     
    上面是获取手机号五部曲

    获取手机号一共需要五步

    第一步:使用button组件;设置open-type属性值为getPhoneNumber,设置bindgetphonenumber事件的方法
    (ps:截至到目前必须使用button,官方的按钮,我使用的第三方Vantn按钮也支持,有的人觉得按钮跟小程序里的UI组件有差异不美观,我是这样做的,去掉官方按钮的默认样式,自己根据第三发的组件样式来改并不是改的一模一样,只要不影响美观就好了)
    1 <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
    第二步:通过上一步绑定的方法getPhoneNumber获取iv和encryptedData,此时还缺少session_key
    复制代码
    1 getPhoneNumber (e) {
    2     console.log(e.detail.iv)            //加密算法的初始向量
    3     console.log(e.detail.encryptedData) //包括敏感数据在内的完整用户信息的加密数据
    4   }
    复制代码
    第三步:使用wx.login获取code
    复制代码
    1 wx.login({
    2       success(res) {
    3         if (res.code) {
    4           app.globalData.code = res.code //res.code重点为了获取session_key
    5         } else {
    6         }
    7       }
    8     })
    复制代码
    第四步:获取到code之后,传入自己的API接口中获取session_key
    (ps:接口是VB.NET webservice。个人觉得不会VB没有关系,只要有基础不管你用的JAVA、C#均可看懂以下代码)
    复制代码
     1     //https://api.weixin.qq.com/sns/jscode2session  微信官方API
     2     //需要三个参数:appid:小程序ID(AppID);secret:小程序密钥(AppSecret);grant_type:授权类型,此处只需填写 authorization_code;js_code:通过 wx.login 接口获得临时登录凭证 code
     3     Public Function GetSessionKey() As Boolean
     4         Dim relust As Boolean = False
     5         Try
     6             Dim urlStr As String = "https://api.weixin.qq.com/sns/jscode2session"
     7             Dim currStr As String = "appid=" & iWeiChatInfo.appid & "&secret=" & iWeiChatInfo.secret & "&js_code=" & iWeiChatInfo.js_code & "&grant_type=" + iWeiChatInfo.grant_type
     8             Dim jsonStr As String = httpHelper.GetData(urlStr, currStr)
     9             Dim ijson As New JavaScriptSerializer
    10             iSessionKeyInfo = ijson.Deserialize(Of SessionKeyInfo)(jsonStr)
    11         Catch ex As Exception
    12         End Try
    13     End Function
    复制代码
    复制代码
     1 Imports System.Net
     2 Imports System.IO
     3 Imports System.Text
     4 Public Class httpHelper
     5     Public Shared Function GetData(ByVal url As String, ByVal data As String) As String
     6         Dim request As HttpWebRequest = WebRequest.Create(url + "?" + data)
     7         request.Method = "GET"
     8         Dim sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream)
     9         Return sr.ReadToEnd
    10     End Function
    11     Public Shared Function PostData(ByVal url As String, ByVal data As String) As String
    12         ServicePointManager.Expect100Continue = False
    13         Dim request As HttpWebRequest = WebRequest.Create(url)
    14         'Post请求方式
    15         request.Method = "POST"
    16         '内容类型
    17         request.ContentType = "application/x-www-form-urlencoded"
    18         '将URL编码后的字符串转化为字节
    19         Dim encoding As New UTF8Encoding()
    20         Dim bys As Byte() = encoding.GetBytes(data)
    21         '设置请求的 ContentLength 
    22         request.ContentLength = bys.Length
    23         '获得请 求流
    24         Dim newStream As Stream = request.GetRequestStream()
    25         newStream.Write(bys, 0, bys.Length)
    26         newStream.Close()
    27         '获得响应流
    28         Dim sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream)
    29         Return sr.ReadToEnd
    30     End Function
    31 End Class
    复制代码
    第五步:此时iv、encryptedData、session_key三个参数我们有了值使用Encrypt.DecryptAesForWeChart方法进行AES解密
    复制代码
     1 Public Class Encrypt
     2     Public Shared Function DecryptAesForWeChart(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String    '使用标准AES对称解密 
     3         Try
     4             Dim aes As New System.Security.Cryptography.AesCryptoServiceProvider 'DES算法  
     5             Dim buffer As Byte() = Convert.FromBase64String(SourceStr)
     6             aes.Key = Convert.FromBase64String(myKey)
     7             aes.IV = Convert.FromBase64String(myIV)
     8             aes.Mode = System.Security.Cryptography.CipherMode.CBC
     9             aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7
    10             Dim ms As New System.IO.MemoryStream(buffer)
    11             Dim cs As New System.Security.Cryptography.CryptoStream(ms, aes.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read)
    12             Dim sr As New System.IO.StreamReader(cs)
    13             Return sr.ReadToEnd()
    14         Catch ex As Exception
    15             Return ""
    16         End Try
    17     End Function
    18     
    19     Public Shared Function EncryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String '使用的DES对称加密
    20         Try
    21             Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES算法  
    22             Dim inputByteArray As Byte()
    23             inputByteArray = System.Text.Encoding.Default.GetBytes(SourceStr)
    24             des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8个字符,TripleDES要24个字符  
    25             des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8个字符,TripleDES要24个字符  
    26             Dim ms As New System.IO.MemoryStream
    27             Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
    28             Dim sw As New System.IO.StreamWriter(cs)
    29             sw.Write(SourceStr)
    30             sw.Flush()
    31             cs.FlushFinalBlock()
    32             ms.Flush()
    33             EncryptDes = Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
    34         Catch ex As Exception
    35             Return ""
    36         End Try
    37     End Function
    38 
    39     Public Shared Function DecryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String    '使用标准DES对称解密 
    40         Try
    41             Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES算法  
    42             des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8个字符,TripleDES要24个字符  
    43             des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8个字符,TripleDES要24个字符  
    44             Dim buffer As Byte() = Convert.FromBase64String(SourceStr)
    45             Dim ms As New System.IO.MemoryStream(buffer)
    46             Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read)
    47             Dim sr As New System.IO.StreamReader(cs)
    48             Return sr.ReadToEnd()
    49         Catch ex As Exception
    50             Return ""
    51         End Try
    52     End Function
    53 End Class
    复制代码

    最后通过接口返回就OK

  • 相关阅读:
    常用函数
    MySQL查询
    mysql的数据类型
    swoole简单demo测试
    linux下搭建lamp环境以及安装swoole扩展
    Linux下NAT模式和桥接模式的网络配置
    PhpStorm+xdebug+postman调试
    windows Apache 环境下配置支持HTTPS的SSL证书
    Yii2 restful api创建,认证授权以及速率控制
    Windows下开启composer镜像服务来安装yii
  • 原文地址:https://www.cnblogs.com/nnnnnn/p/13532757.html
Copyright © 2011-2022 走看看