微信内网页开发 - 授权登录
接口文档:http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html
一、开发者需要先到公众平台官网中的开发者中心页配置授权回调域名,也就是授权链接里面的redirect_url指向的服务器域名。
二、举例:公众号底部设置一个菜单:登录, 它的链接可以如下:
1、静默授权(不需要用户手动点击同意)SCOPE是snsapi_base,只能获取用户的openid
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://www.iteye.com/cgi-bin/wechat.pl&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
2、SCOPE是snsapi_userinfo,用来获取用户的基本信息的。但需要用户手动同意(无须关注),就可在授权后获取该用户的基本信息。
三、如果用户同意授权,微信服务器将重定向到redirect_uri,也就是http://www.iteye.com/cgi-bin/wechat.pl/?code=CODE&state=STATE,也就是将code返回给服务端的CGI脚本,脚本就可以获取openid(用户基本信息)
if ($cgi->param('code')) {
my $code = $cgi->param('code');
my $state = $cgi->param('state');
my $wechat = GetOpenidToken($code, $state);
my $openid = $wechat->{openid};
my $token = $wechat->{access_token};
my $unionid = $wechat->{unionid};
write_log("code=$code, openid=$openid, token=$token, unionid=$unionid\nstate=".$state."\n");
$redirect_url = "http://xxxx/test.html?openid=$openid&state=".$state;
print $cgi->redirect($redirect_url);
}
sub GetOpenidToken {
my $code = $_[0];
my $state = $_[1];
//通过code换取网页授权access_token
my $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$APPID."&secret=".$SECRET."&code=".$code."&grant_type=authorization_code";
my $json = JSON->new();
my $ua = LWP::UserAgent->new();
#runging curl,get this json respons
my $req = HTTP::Request->new('POST', $url);
my $response = $ua->request($req);
//如果网页授权作用域为snsapi_userinfo,则可以通过access_token和openid拉取用户信息了。
my $url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=".$ACCESS_TOKEN."&openid=".$OPENID."&lang=zh_CN";
}
关于state
重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节。
服务端获得用户信息后可以根据 不同的state值 来跳转到不同的H5页面
关于UnionID机制
1、请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号(H5应用)、移动APP应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
2、UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。
关于移动APP授权登录
现在大多数移动APP都支持通过微信直接登录应用,无需注册账号,那么服务端一般就会通过获取用户的微信信息(unionid, 微信昵称,头像,性别等)来创建用户账号。
流程一般是:APP前端调用微信提供的SDK授权登录,获得用户的access_token,openid然后传给服务端,服务端通过access_token和openid拉取用户信息,然后创建账号。