最近一个朋友要去给他做个微信小程序,会涉及到获取用户手机号的场景,这里,我前端用的uniapp,后端则用的.NET6,如果用.NET开发微信公众号或小程序的话,我相信大部分人应该都有听说过盛派微信SDK
引入盛派SDK
这里先引入Senparc.Weixin.AspNet和Senparc.Weixin.WxOpen两个包,安装完成后进入appsetting.json配置小程序的相关信息,
1
2
3
4
5
  | "SenparcWeixinSetting": {
  "IsDebug": false,
  "WxOpenAppId": "小程序appId",
  "WxOpenAppSecret": "小程序Secret"
}
  | 
再进入Program.cs注册盛派微信SDK的相关配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  | builder.Services.AddMemoryCache();
builder.Services.AddSenparcWeixinServices(builder.Configuration);
var app = builder.Build();
var senparcWeixinSetting = app.Services.GetService<IOptions<SenparcWeixinSetting>>()!.Value;
//启用微信配置(必须)
var registerService = app.UseSenparcWeixin(app.Environment,
    null /* 不为 null 则覆盖 appsettings  中的 SenpacSetting 配置*/,
    null /* 不为 null 则覆盖 appsettings  中的 SenpacWeixinSetting 配置*/,
    register => { },
    (register, weixinSetting) =>
    {
        //注册公众号信息(可以执行多次,注册多个小程序)
        register.RegisterWxOpenAccount(weixinSetting, "小程序");
    });
  | 
现在,我们及可使用盛派微信SDK提供的API来获取手机号了。新建一个controller来调用API
1
2
3
4
5
6
7
8
9
10
11
12
13
  | public class WxOpenController : ControllerBase
    {
        public static readonly string WxOpenAppId = Config.SenparcWeixinSetting.WxOpenAppId;
        public static readonly string WxOpenAppSecret = Config.SenparcWeixinSetting.WxOpenAppSecret;
        [HttpGet("get-phone/{Code}")]
        public string GetUserPhone(string Code)
        {
            //通过`getPhoneNumber`得到的Code来获取手机号
            var result = BusinessApi.GetUserPhoneNumber(WxOpenAppId, Code);
            return result.phone_info.phoneNumber;
        }
    }
  | 
uniapp获取code
在2.21.2版本之后,获取手机号不需要提前调用login进行登录,直接通过按钮触发getPhoneNumber获得的code去换取手机号或者是encryptedData和IV去解密,
我们先在界面新增一个按钮
1
2
3
4
5
6
  | <template>
	<view class="content">
		<u-button size="normal" icon="account-fill" plain type="warning" open-type="getPhoneNumber"
			@getphonenumber="getPhoneNumber" text="获取手机号"></u-button>
	</view>
</template>
  | 
然后,编写getPhoneNumber方法
1
2
3
4
5
6
7
8
9
10
11
12
  | getPhoneNumber(e) {
				console.log(e);
				if (e.detail.errMsg != 'getPhoneNumber:ok') {
					uni.$u.toast("获取手机号失败");
					return;
				}
				console.log(e.detail.code);
				let url = `http://localhost/api/WxOpen/get-phone/${e.detail.code}`;
				uni.$u.http.get(url).then(result => {
					console.log(result);
				});
			},
  | 
这里的$u.http.get是uView里面的工具类,如果没有用到uView就直接用uniapp里面的请求方法。
这里,我们是用的code获取手机号的方式。盛派SDK也提供了encryptedData和IV解密的API,用起来还是非常方便。