C#\.Net实现微信小程序登录功能

669 阅读1分钟

一、配置信息

  1. 微信公众平台: mp.weixin.qq.com/

  2. 步骤: 开发 -> 开发管理 -> 开发设置-> 拿到小程序专属的 AppId, Secret

二、实现思路

1、微信小程序通过 wx.login方法获取到用户登录code

2、后端使用 code,appId,secret 去访问微信获取用户openIdsessionKey

3、微信小程序 open-type="getPhoneNumber" 类型的按钮去获取encryptedDataiv

<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumberLocal">一键登录</button>

4、后端通过 sessionKey,iv,encryptedData 去解析用户信息,得到用户手机号

三、后端代码

获取openId的实体类

public class WeChatResult
{
    public string session_key { get; set; }
    public string openid { get; set; }
}

解析用户数据的实体类

public class WeChatUserResult
{
    public string phoneNumber { get; set; }
    public string purePhoneNumber { get; set; }
    public string countryCode { get; set; }
    public object watermark { get; set; }
}

1、GetOpenIdAndSessionKey方法 => 获取用户的openid 和 session_key

//获取微信用户openid sessionkey 的url
static string OpenIdAndSessionKeyUrl = "https://api.weixin.qq.com/sns/jscode2session?" +
    "appid={0}&secret={1}&js_code={2}&grant_type=authorization_code";

public static WeChatResult GetOpenIdAndSessionKey(string code)
{
    string appId = "小程序的appId";
    string secret = "小程序的secret";

    //获取openId的微信url配置
    string url = string.Format(OpenIdAndSessionKeyUrl, appId, secret, code);
    WebClient wbClient = new WebClient() { Encoding = Encoding.UTF8 };
    string resultStr = wbClient.DownloadString(url);
    
    //反序列化微信返回的数据
    WeChatResult weChatResult = JsonConvert.DeserializeObject<WeChatResult>(resultStr);
    if (weChatResult == null ||
        string.IsNullOrEmpty(weChatResult.session_key) ||
        string.IsNullOrEmpty(weChatResult.openid))
    {
        result.Code = 201;
        result.Message = "code已失效!";
    }
    else
    {
        result.Data = weChatResult;
    }

    return weChatResult;
}

2、WeChatLoginGetPhone方法 => 获取用户的手机号

public static WeChatUserResult WeChatLoginGetPhone(string iv, string encryptedData, string sessionKey)
{
   AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        //设置解密器参数
        aes.Mode = CipherMode.CBC;
        aes.BlockSize = 128;
        aes.Padding = PaddingMode.PKCS7;
        //格式化待处理字符串
        byte[] byte_encryptedData = Convert.FromBase64String(encryptedData);
        byte[] byte_iv = Convert.FromBase64String(iv);
        byte[] byte_sessionKey = Convert.FromBase64String(sessionKey);
        aes.IV = byte_iv;
        aes.Key = byte_sessionKey;
        //根据设置好的数据生成解密器实例
        ICryptoTransform transform = aes.CreateDecryptor();
        //解密
        byte[] final = transform.TransformFinalBlock(byte_encryptedData, 0, byte_encryptedData.Length);
        //生成结果
        string weChatUsrtStr = Encoding.UTF8.GetString(final);
        //反序列化结果,生成用户信息实例
        WeChatUserResult userInfo = JsonConvert.DeserializeObject<WeChatUserResult>(weChatUsrtStr);
        
    return userInfo;
}

以上就是c#后端配置 实现微信小程序获取openid、sessionkey、手机号实现登录的功能流程。