Taro:授权手机号并登录

一,前台: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)
            }
          })
        }
      }
    })
  }, []);

了解一下
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值