微信小程序获取手机号需要完成认证,才能获取得到
否则会出现下列情况
一、搭建后台服务器(WebApI)
新建webapi2空控制器 OnLoginController
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Web.Http;
using WebApplication1.Models;//引入实体类命名空间
using System.Web.Http.Cors;//跨域请求命名空间
namespace WebApplication1.Controllers
{
//跨域请求
[EnableCors(origins:"*",headers:"*",methods:"*")]
[RoutePrefix("api/OnLogin")]
public class OnLoginController : ApiController
{
[Route("Get")]
[HttpGet]
public object Get(string code)
{
string cod = code;
string html = string.Empty;
string url = "https://api.weixin.qq.com/sns/jscode2session?appid=wxb2f63b12a7371f2a&secret=110dc84617c235b5809a7f5d8d43af3a&js_code="+cod+"&grant_type=authorization_code";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream ioStream = response.GetResponseStream();
StreamReader sr = new StreamReader(ioStream, Encoding.UTF8);
html = sr.ReadToEnd();
sr.Close();
ioStream.Close();
response.Close();
RepParamrep rep = JsonConvert.DeserializeObject<RepParamrep>(html);
return rep;
}
}
}
新建实体类RepParamrep ,保存session_key和open_id
namespace WebApplication1.Models
{
public class RepParamrep
{
public string session_key { get; set; }
public string openid { get; set; }
}
}
解析手机号码
[Route(“Get”)]
[HttpGet]
public string Get(string encryptedData, string iv, string session_key)
{
string _telPhone = getPhoneNumber(encryptedData, iv, session_key);
return _telPhone;
}
private string getPhoneNumber(string encryptedData, string IV, string Session_key)
{
try
{
byte[] encryData = Convert.FromBase64String(encryptedData);
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Key = Convert.FromBase64String(Session_key);
rijndaelCipher.IV = Convert.FromBase64String(IV);
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
byte[] plainText = transform.TransformFinalBlock(encryData, 0, encryData.Length);
string result = Encoding.Default.GetString(plainText);
dynamic model = Newtonsoft.Json.Linq.JToken.Parse(result) as dynamic;
return model.phoneNumber;
}
catch (Exception ex)
{
return "";
}
}
二、设计前端界面及逻辑
//index.wxss
<view>
<button class="cu-btn bg-blue margin-tb-xs lg" hidden="{{hid1}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">授权</button>
<button class="cu-btn bg-blue margin-tb-xs lg" hidden="{{hid2}}" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">进入</button>
</view>
//index.js
const app = getApp();
Page({
data: {
userPhone: '',
userNicheng: '',
hid1: false,
hid2: true
},
bindGetUserInfo: function(e) {
this.setData({
userNicheng: e.detail.userInfo.nickName,
hid1: true,
hid2: false
})
},
getPhoneNumber: function(e) {
var that = this;
console.log("getPhoneNumberok" + e.detail.errMsg);
if (e.detail.errMsg == "getPhoneNumber:ok") {
//端口号是由后端服务器生成
wx.request({
url: 'https://localhost:44358/api/OnLogin/Get',
data: {
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
session_key: app.globalData.session_key
},
method: "get",
success: function(res) {
console.log(res)
that.setData({
userPhone: res.data
})
},
fail:function(res){
console.log(res.errMsg)
}
})
}
}
})
//app.js
App({
globalData:{
session_key:'',
openid:''
},
onLaunch: function() {
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
console.log(res)
if (res.code) {
console.log("code========" + JSON.stringify(res));
//发起网络请求
wx.request({
url: 'https://localhost:44358/api/OnLogin/Get',
data: {
code: res.code
},
success: data => {
console.log("data" + JSON.stringify(data.data));
this.globalData.session_key = data.data.session_key;
this.globalData.openid = data.data.openid;
console.log("openid" + this.globalData.openid);
},
fail:data=>{
console.log(data)
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
}
})