一、背景
近期实现微信招聘公众号的需求,需要在微信用户同意公众号授权后,获取到微信用户信息。这一步操作在前端无法完成,所以这里我们使用了C# WebApi项目,通过接口实现后台获取微信用户数据再重定向到前端页面。
二、思路
具体而言,微信网页授权流程分为四步:
1、引导用户进入授权页面同意授权,获取code;
2、通过code换取网页授权access_token(与基础支持中的access_token不同);
3、如果需要,开发者可以刷新网页授权access_token,避免过期;
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制);
首先,我们需要明确传递给后台的参数,以及后台返回的数据是什么。根据上述思路,前端第一次请求后台是需要引导用户进入授权页面同意授权,获取code,只要这一过程发生在微信端并且用户点击同意,就可以获取到code;此时操作仍然在后台,我们还需要进一步获取用户信息,所以我们在后台需要伪跳转(在后台接口进行跳转至另一信息获取接口),调用微信接口获取到用户信息。这个时候鉴权、获取用户信息都完成了,后台如何把用户信息给前端、如何定位前端页面呢?所以我们需要在前端传递给后台的参数里,加上鉴权、获取用户信息后的重定向URL,并将用户信息拼接到URL上。
看到这里,思路就很清晰了。前端请求后台鉴权并带上重定向URL、后台获取用户信息并将用户信息添加到URL上、后台重定向此URL,最终微信端展示页面的就是每个用户的个人数据了。
三、代码实现
ConfigurationManager.AppSettings["appid"]配置为微信公众号的AppID;
ConfigurationManager.AppSettings["appsecret"]配置为微信公众号的AppSecret;
ConfigurationManager.AppSettings["apppath"]配置为后台接口服务器域名,这个是需要在公众号后台配置的.
下面这种方法可以获取微信OpenID,但不能获取到微信UnionID。
/// <summary>
/// 微信公众号用户信息获取
/// </summary>
public class AuthController : Controller
{
private static string appId = ConfigurationManager.AppSettings["appid"];
private static string secret = Co