一,前台:taro框架,ts,这里我们用到的modx,也可不用嘻嘻就直接展示吧~ ~
首先是组件(AtButton)这个重要openType=“getPhoneNumber”,其次在onGetPhoneNumber写你的方法名
<AtButton className={'At_Btn'} openType="getPhoneNumber" onGetPhoneNumber={getTel}>
<Text style={{marginLeft:"10px"}}>微信一键登录</Text>
</AtButton>
详细可以参考 wx平台
//授权登录
const getTel = (e: { detail: { iv: any; encryptedData: any; errMsg: string } }) => {
console.log(e.detail)
const { encryptedData, iv } = e.detail;
if (e.detail.errMsg === "getPhoneNumber:ok") {
Taro.showLoading({ title: "登录中" })
Taro.login({ //这个code也可以在useEffect方法上写,怎么来都可以,最下面我会附上代码
success: res => {
if(res.code){
Taro.request({
url:''//这里写自己的接口地址,
method:''//接口类型,大写!
data: { //参数
encryptedData: encryptedData,
Iv: iv,
SessionKey:res.code, //code:手机号获取凭证:动态令牌,可通过动态令牌换取用户手机号
},
success:(res)=>{
console.log("res",res)
const { body, businesscode} = res.data;
if (businesscode == 1) {
const { token, user } = body;
//设置token
Taro.setStorageSync("token", "Bearer " + token);
Taro.setStorageSync("user", user);
Taro.switchTab({ url: "成功后你的url" });
}
else{
showToast({
title: '错误',
icon: "none",
});
}
}
})
}
}
})
else{
Taro.showModal({
title: '警告',
content: '您点击了拒绝授权,将无法进入小程序,请授权之后再进入!!!',
showCancel: false,
confirmText: '返回授权',
success: function (res) {
if (res.confirm) {
console.log('用户点击了“返回授权”');
}
}
});
}
}
二,后台:core 3.1,其余在配置里完成就可,没有那么繁琐
其他的业务逻辑可以在加
/// <summary>
/// 获取OpenID、session_key
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public string wxlogin(string code)
{
try
{
string AppID = //"自己的id";
string AppSecret = //"认证后的密钥";
//获取 AccessToken AppID, AppSecret,
string AccessTokenUrl = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code";
//通过地址参数拿到想要的数据,这些可以参考weixin平台
string AccessTokenResult = RequestUrl(string.Format(AccessTokenUrl, AppID, AppSecret, code), "GET");
string AccessToken = GetJsonValue(AccessTokenResult, "access_token");
string ExpiresIn = GetJsonValue(AccessTokenResult, "expires_in");
string RefreshToken = GetJsonValue(AccessTokenResult, "refresh_token");
string OpenID = GetJsonValue(AccessTokenResult, "openid");
string session_key = GetJsonValue(AccessTokenResult, "session_key");
string ErrCode = GetJsonValue(AccessTokenResult, "errcode");
string ErrMsg = GetJsonValue(AccessTokenResult, "errmsg");
//这是我们需要的
return session_key;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 获取手机号
/// </summary>
/// <param name="encryptedData"></param>
/// <param name="aesIv"></param>
/// <param name="session_key"></param>
/// <returns></returns>
public string getPhoneNumber(string encryptedData, string aesIv, string session_key)
{
try
{
session_key = session_key.Replace("\\", "");
byte[] encryData = Convert.FromBase64String(encryptedData); //这里转一下
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Key = Convert.FromBase64String(session_key); //定义一下
rijndaelCipher.IV = Convert.FromBase64String(aesIv);
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
byte[] plainText = transform.TransformFinalBlock(encryData, 0, encryData.Length);
string results = Encoding.Default.GetString(plainText);
dynamic model = Newtonsoft.Json.Linq.JToken.Parse(results);//json
string phoneNumber = model.phoneNumber;
if (string.IsNullOrEmpty(phoneNumber))
{
return "";
}
return phoneNumber;
}
catch (Exception ex)
{
return "";
}
}
三,这个是微信返回的参数(上面https返回的)
{
"errcode":0,
"errmsg":"ok",
"phone_info": {
"phoneNumber":"xxxxxx",
"purePhoneNumber": "xxxxxx",
"countryCode": 86,
"watermark": {
"timestamp": 1637744278,
"appid": "xxxx"
}
}
补充前台拿code另一方法(看情况)
useEffect(() => {
Taro.login()
.then(({ code }) => setCode(code))
.catch((error) => console.log(error));
Taro.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
Taro.getUserInfo({
success(res) {
console.log('res.userInfo !!!!!!',res.userInfo)
}
})
}
}
})
}, []);
了解一下