uniapp+.netcore实现微信小程序获取手机号功能
本攻略将介绍如何使用 uniapp 和 .NET Core 实现微信小程序获取手机号功能。我们将使用微信提供的 API 来获取用户的手机号,并将其保存到数据库中。
步骤1:创建微信小程序
首先,我们需要在微信公众平台上创建一个小程序,并获取小程序的 AppID 和 AppSecret。我们还需要在小程序中添加获取手机号的权限。
步骤2:创建 .NET Core 项目
在 Visual Studio 中创建一个名为“WxPhone”的 .NET Core 项目。
步骤3:添加依赖项
在 .NET Core 项目中,我们需要添加以下依赖项:
- Microsoft.AspNetCore.Mvc
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
我们可以使用 NuGet 包管理器来添加这些依赖项。
步骤4:创建数据库
在 SQL Server 中创建一个名为“WxPhone”的数据库,并添加以下表:
CREATE TABLE [dbo].[User] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[OpenId] NVARCHAR (50) NOT NULL,
[PhoneNumber] NVARCHAR (20) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
步骤5:创建 API
在 .NET Core 项目中,我们需要创建一个 API处理获取手机号的请求。我们可以在 Controllers 文件夹中创建一个名为“UserController”的控制器,并添加以下代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json.Linq;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using WxPhone.Models;
namespace WxPhone.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
private readonly WxPhoneContext _context;
public UserController(WxPhoneContext context)
{
_context = context;
}
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody] JObject data)
{
var code = data["code"].ToString();
var encryptedData = data["encryptedData"].ToString();
var iv = data["iv"].ToString();
var url = $"https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=APPSECRET&js_code={code}&grant_type=authorization_code";
url = url.Replace("APPID", "your appid").Replace("APPSECRET", "your appsecret");
using (var client = new HttpClient())
{
var response = await client.GetAsync(url);
var content = await response.Content.ReadAsStringAsync();
var json = JObject.Parse(content);
var openId = json["openid"].ToString();
var user = await _context.Users.FirstOrDefaultAsync(u => u.OpenId == openId);
if (user == null)
{
var sessionKey = json["session_key"].ToString();
var phoneNumber = WxPhoneHelper.DecryptPhoneNumber(encryptedData, sessionKey, iv);
user = new User { OpenId = openId, PhoneNumber = phoneNumber };
_context.Users.Add(user);
await _context.SaveChangesAsync();
}
return Ok(user);
}
}
}
}
这个控制器包含一个名为“PostAsync”的方法,该方法接收一个包含 code、encryptedData 和 iv 的 JSON 对象。我们将使用这些数据来获取用户的手机号。首先,我们使用 code 调用微信 API 来获取用户的 openId 和 session_key。然后,我们使用 session_key 和 iv 来解密 encryptedData,以获取用户的手机号。最后,我们将用户的 openId 和手机号保存到数据库中,并返回用户的信息。
步骤6:创建 uniapp 项目
在 HBuilderX 中创建一个名为“WxPhone”的 uniapp 项目。
步骤7:创建页面
在 uniapp 项目中,我们需要创建一个页面来获取用户的手机号。我们可以在 pages 文件夹中创建一个名为“Index”的页面,并添加以下代码:
<template>
<view class="container">
<button type="primary @click="getPhoneNumber">获取手机号</button>
<view v-if="phoneNumber">{{phoneNumber}}</view>
</view>
</template>
<script>
export default {
data() {
return {
phoneNumber: ''
}
},
methods: {
async getPhoneNumber() {
const res = await uni.login()
const code = res.code
const encryptedData = this.encryptedData
const iv = this.iv
const data = { code, encryptedData, iv }
const response = await uni.request({
url: 'http://localhost:5000/api/user',
method: 'POST',
data
})
this.phoneNumber = response.data.phoneNumber
}
}
}
</script>
这个页面包含一个按钮,当用户点击该按钮时,我们将调用 uni.login 方法来获取用户的 code。然后,我们将使用 code、encryptedData 和 iv 来调用我们的 API 来获取用户的手机号。最后,我们将用户的手机号显示在页面上。
示例1:获取用户的 openId
我们可以使用以下代码来获取用户的 openId:
uni.login({
success(res) {
console.log(res.code)
}
})
这个代码将调用 uni.login来获取用户的 code。我们可以将 code 发送到我们的 API 来获取用户的 openId。
示例2:解密用户的手机号
我们可以使用以下代码来解密用户的手机号:
const phoneNumber = WxPhoneHelper.decryptPhoneNumber(encryptedData, sessionKey, iv)
这个代码将调用我们的解密方法来解密 encryptedData,并返回用户的手机号。