開發前建議先閱讀微信小程序官方開發文檔
1.微信小程序登錄
// 登錄
wx.login({
success: res => {
// 發送 res.code 到后台換取 openId, sessionKey, unionId
if (res.code) {
console.log("code========" + JSON.stringify(res));
//發起網絡請求
wx.request({
url: 'http://xxxxxx/Weixin/'+res.code,
method: 'GET',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (res) {
console.log(res)
console.log('response.data----'+JSON.stringify(res.data));
wx.setStorageSync('sessionKey', res.data.session_key); //存儲sessionKey在Storage
wx.setStorageSync('app_openid', res.data.openid); //存儲openid在Storage
}
})
} else {
console.log('登錄失敗!' + res.errMsg)
}
}
})
2.后端登錄接口
[HttpGet("{code}")]
public RepParamrep Get(string code)
{
string appid = "xxxxx";
string secret = "xxxxx";
return Get(code, appid, secret);
}
public RepParamrep Get(string code, string appid, string secret)
{
string cod = code;
string html = string.Empty;
string url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&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;
}
public class RepParamrep
{
public string session_key { get; set; }
public string openid { get; set; }
}
3.前端獲取用戶信息
// 獲取用戶信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已經授權,可以直接調用 getUserInfo 獲取頭像昵稱,不會彈框
wx.getUserInfo({
success: res => {
console.log(res);
}
})
}
}
})
4.前端獲取手機號
<button type="primary" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">獲取手機號</button>
getPhoneNumber: function(e) {
if (e.detail.errMsg == "getPhoneNumber:ok") {
wx.request({
url: 'http://xxxx/Weixin',
method:'post',
header:{
'Content-type':'application/json'
},
data: {
encryptedData:e.detail.encryptedData,
iv:e.detail.iv,
session_key:wx.getStorageSync('sessionKey')
},
success: function (res) {
console.log(res)
},
fail: function (res) {
//錯誤處理
app.ylShowLog(res)
},
complete: function (res) {
//完成處理
wx.hideLoading();
}
})
}},
5.后端手機號解碼接口
[HttpPost]
public string getPhoneNumber(UserRepParamrep userRepParamrep)
{
String encryptedData = userRepParamrep.encryptedData;
String iv = userRepParamrep.iv;
String session_key = userRepParamrep.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;
string phoneNumber = model.phoneNumber;
//return model.phoneNumber;
if (string.IsNullOrEmpty(phoneNumber))
{
return "";
}
return phoneNumber;
}
catch (Exception ex)
{
return "";
}
}
public class UserRepParamrep
{
public string session_key { get; set; }
public string iv { get; set; }
public string encryptedData { get; set; }
}