当前位置: 首页 > 后端技术 > PHP

PHP实现微信网页登录授权开发

时间:2023-03-30 03:25:57 PHP

网站应用准备微信登录是基于OAuth2.0协议标准的微信OAuth2.0授权登录系统。在进行微信OAuth2之前。在进行微信OAuth2.0授权登录接入之前,先在微信开放平台注册一个开发者账号,有一个通过审核的网站申请,并获取对应的AppID和AppSecret,申请微信登录,审核通过后,接入过程可以开始。授权流程说明微信OAuth2.0授权登录允许微信用户使用微信身份安全登录第三方应用或网站。微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获得用户的接口调用Credentials(access_token),通过access_token可以调用授权关系接口微信开放平台,获取微信用户基本开放信息,帮助用户实现基本开放功能。微信OAuth2.0授权登录目前支持authorization_code方式,适用于服务端应用授权。该模式的整体流程为:  1。第三方发起微信授权登录请求。微信用户允许第三方应用授权后,微信会启动应用或重定向到第三方网站,并带上授权临时票码参数;  2。通过代码参数等添加AppID和AppSecret,通过API换取access_token;  3。通过access_token进行接口调用,获取用户基础数据资源或帮助用户实现基础操作。获取access_token时序图:第一步:请注意在请求CODE第三方使用网站申请授权登录前,您已经获取了对应的网页授权范围(scope=snsapi_login),然后您可以打开以下链接PC端:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect如果提示“此链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或范围不是snsapi_login。参数说明返回表示用户允许授权后,重定向到redirect_uriurl,带code和state参数redirect_uri?code=CODE&state=STATE如果用户禁止授权,重定向后不带code参数,只会带状态参数redirect_uri?state=STATE请求示例登录一号店网站https://passport.yhd.com/wechat/login.do打开后,一号店会生成一个状态参数并跳转到https:///open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b048166edirect#4a415.com/connect/qrConnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2f%2f%2fpassport.yhd.com%2FWECHAT%2FCALLBACK.DO&RESSICTS_TYPE=CODE&SCOPE&SCOPE&SCOPE&SCOPE=SNSAPI_LOGIN&State991991111111111117FFFFFFFDRFFFDRBBBBBBBBBBBBBBBBBBBBBBBBBBBIR=EB4BBBBBBBIR=EB4BBBBIR=eb4bbbbback信扫描写二维码并确认登录后,PC端会跳转到https://passport.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a4035d839573b04816624a415e第二种获取方式是支持网站将微信登录二维码嵌入自己的页面。使用微信扫码授权后,通过JS将代码返回给网站。JS微信登录的主要目的:网站希望用户可以在网站内部完成登录,而不必跳转到微信域登录再返回,从而提高微信登录的流畅度和成功率。网站内嵌二维码微信登录JS的实现方法:第一步:在页面中引入如下JS文件(支持https):步骤2:在在使用微信登录登录的地方地方以下js:varobj=newwxlogin({id{id:“login_container”,“login_container”,appid::"",状态:"",样式:"",href:""""});参数说明第二步:获取Access_token通过代码获取access_tokenhttps://api.weixin.qq.com/Sns/aCess_tokeen?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code参数说明返回说明正确返回:{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE","unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"}错误返回示例:{"errcode":40029"errmsg":"invalidcode"}刷新access_token有效期access_token是调用授权关系接口的调用凭证,因为access_token的有效期(目前为2小时)较短,当access_token超时后,可以使用refresh_token进行刷新。access_token的刷新结果有两种:1.如果access_token已经超时,那么refresh_token会得到一个新的access_token,并有新的超时时间;2.如果access_token还没有超时,那么refresh_token不会改变access_token,但是会刷新timeout,相当于更新了access_tokenrefresh_token有更长的有效期(30天)。当refresh_token过期后,用户需要重新授权。请求方法获取第一步code后,请求refresh_token如下链接:https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN参数说明返回说明正确返回:{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE"}返回说明正确返回:{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE"}错误返回示例:{"errcode":40030,"errmsg":"invalidrefresh_token"}注意:1.Appsecret是应用接口使用的key。一旦泄露,可能导致应用数据泄露、应用用户数据泄露等高危后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);2、access_token是用户授权第三方应用发起接口调用的凭据(相当于用户登录状态),保存在客户端。恶意获取access_token后可能会导致用户数据泄露,恶意启动用户微信相关接口功能。3、refresh_token是用户授权第三方应用的长期凭证,仅用于刷新access_token,但泄露后相当于access_token泄露,风险是同上。建议将secret和用户数据(如access_token)放在App云服务器上,云端会中转接口调用请求。第三步:通过access_token调用接口获取到access_token后,调用该接口需要满足以下条件:1.access_token有效且未超时;2、微信用户已授权第三方应用账号对应的接口范围(scope)。对于接口作用域(scope),可以调用的接口如下:snsapi_base属于基础接口。如果应用已经有其他scope的权限,则默认有snsapi_base的权限。使用snsapi_base可以让手机网页授权绕过跳转到授权登录页面请求用户授权的动作,直接跳转到第三方网页,带授权临时票据(code),但用户的授权范围(scope)只有snsapi_base,导致无法获取需要用户授权的数据和基本功能。常见问题解答Q1。什么是授权临时客票(代码)?答:第三方需要使用code获取access_token。代码的超时时间为10分钟。一个code只能成功兑换一次access_token,之后就失效了。代码的临时性保证了微信授权登录的安全性。第三方可以通过https和state参数进一步增强自己授权登录的安全性。2、什么是授权范围(scope)?答:授权范围(scope)代表用户授权给第三方的接口权限。第三方应用需要向微信开放平台申请相应作用域的使用权限后,使用文档中描述的方法让用户授权。用户授权后,获取到的接口只有对应access_token后才能调用。3、网站内嵌二维码微信登录的JS代码中style字段的作用是什么?答:第三方页面的颜色样式可能是浅色也可能是深色。如果第三方页面为浅色背景,则样式字段应提供值“black”(或不提供,默认为黑色),对应的微信登录文字样式为黑色。相关效果如下:如果提供“white”值,对应的文字描述会显示为白色,适合深色背景。相关效果如下:4、网站内嵌二维码的JS代码中href字段的作用是什么?答:如果第三方觉得微信团队提供的默认样式与自己的页面样式不匹配,可以提供样式文件覆盖默认样式。比如第三方觉得默认二维码太大,可以提供相关的css样式文件,在href字段填写链接地址.impowerBox.qrcode{width:200px;}.impowerBox.title{display:none;}.impowerBox.info{width:200px;}.status_icon{display:none}.impowerBox.status{text-align:center;}相关效果如下:获取用户个人信息(UnionID机制??)接口说明这个接口用于获取用户个人信息信息。开发者可以通过OpenID获取用户基本信息。特别是如果开发者有多个移动应用、网站应用和公众号,可以通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要同一个微信开放平台账号下的移动应用,网站申请和公众账号,用户的unionid是唯一的。也就是说,对于同一个用户,同一个微信开放平台下的不同应用,unionid是相同的。请求说明HTTP请求方式:GEThttps://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID参数说明返回正确的Json返回结果:{"openid":"OPENID","nickname":"NICKNAME","sex":1,"province":"PROVINCE","city":"CITY","country":"COUNTRY","headimgurl":"http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0","privilege":["PRIVILEGE1","PRIVILEGE2"],"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"}错误的Json返回示例:{"errcode":40003,"errmsg":"invalidopenid"}Call限频代码示例:第三方发起微信授权登录请求。微信用户授权第三方应用后,微信会启动应用或重定向到第三方网站,并带上授权临时票证码参数;添加代码参数AppID、AppSecret等通过API换取access_token;通过access_token进行接口调用,获取用户基础数据资源或帮助用户实现基础操作。Login.php如下:返回码state*/$appid='wxea1xxxxxxxx20cb62';$url="https://open.weixin.qq.com/connect/qrconnect?appid=$appid&redirect_uri=http://zhiliaoke.com.cn/weixi..._type=code&scope=snsapi_login&state=1&connect_redirect=1#wechat_redirect";标头('位置:'。$url);验证过程如下:error('授权失败');$token\_url='https://api.weixin.qq.com/sns/oauth2/access\_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant_type=authorization_code';$token=json\_decode(file\_get\_contents($token_url));if(isset($token->errcode)){echo'

错误:

'.$token->errcode;echo'

错误信息:

'.$token->errmsg;exit;
$access_token_url='https://api.weixin.qq.com/sns..._token?appid='.$appid.'&grant\_type=refresh\_token&refresh\_token='.$token->refresh_token;//转化为对象$access\_token=json\_decode(file\_get\_contents($access_token_url));if(isset($access\_token->errcode)){echo'

error:

'.$access_token->errcode;echo'

错误信息:

'.$access\_token->errmsg;exit;

$user_info_url='https://api.weixin.qq.com/sns..._token='.$access\_token->access\_token.'&openid='.$access_token->openid.'&lang=zh_CN';//转化为对象$user\_info=json\_decode(file\_get\_contents($user_info_url));if(isset($user\_info->errcode)){echo'

Error:

'.$user_info->errcode;echo'

错误信息:

'.$user\_info->errmsg;exit;}$rs=json_decode(json_encode($user\_info),true);//将返回的json数组转化为array数组//打印用户信息echo'
';
print\_r($rs);echo'
';?>微信第三方登录(静默授权和非静默授权)当用户在微信客户端访问第三方网页时,公众号可以通过微信网页的授权机制,进而实现业务逻辑微信授权登录在日常应用中应用广泛。越来越多的平台支持用户使用微信授权第三方登录。使用微信授权登录有什么优势/好处?1、用户量足够大,基本上所有用户都会有微信,登录更方便快捷;2.微信作为一个开放平台,为众多公众号/服务开放了众多服务接口,让公众号能够为其用户提供更加个性化和优质的产品和服务;openid和unionid,这两个id有什么区别;1.openid:follower与公众号互动后,公众号可以获得follower的openid,同一个用户,在不同的公众号或移动端应用2.Unionid:同一个用户下同一个unionID不同的公众号或移动应用程序;前提是如果需要做多个公众号和移动应用的账号相互通信,可以获得唯一身份unionid,需要在微信开放平台绑定多个公众号或移动应用,并且然后我们可以获得联合ID;因此,如果一个应用或服务有联合登录甚至多个公共应用和多账户互操作,可以使用unionid来识别和合并账户系统的用户;即微信平台可以使用unionid进行互通以及基于多个公众号的账号体系的识别与合并;微信联合登录如何登录?两种登录方式;微信联合登录与微信授权登录【授权登录(非静默授权)与静默授权】微信联合登录;即我们常用的微信移动端/PC扫码登录,PC端使用微信扫描微信移动端确认授权登录后,应用可以从微信获取用户的openid或者unionid,关联用户信息微信以自身账号系统中的用户身份获取的;授权登录:需要用户确认登录,这样通过用户的个人确认,无论是否关注相关微信公众号,都可以获得用户的全面信息。静默授权不需要用户确认,只需要用户访问某个网页,属于嵌套在普通网页中的授权形式,但只能获取用户唯一的openid和unionid,无法获取用户的微信个人资料图片和微信名这样的个人信息对于用户的简单认证还是很有用的。如何利用微信账号体系实现多应用、多平台的账号互通体系;如果一个服务同时分发到多个公众号,如何建立账号体系;如何唯一标识用户;1)、同一个不同的用户公众号/app有不同的openid,同一个用户不同的公众号/app有相同的unionid;2)在建立应用账号体系时,使用union标识并合并多个应用/平台之间的用户账号体系;3)在为多个应用/平台建立账号体系时,需要有唯一的userid对应一个唯一的工会编号;对于某项服务,包括手机APP、PC网页、公众号端服务,微信授权登录的用户,数据传输过程是怎样的?1、用户通过微信授权手机应用服务;应用服务可以通过接口获取用户的unionid。此时如果在数据库中找不到该id,则会识别为新用户。直接创建用户id,唯一用户id对应unionid;2、用户在PC端扫码授权联合登录获取PC端服务;应用服务可以通过接口获取用户的unionid。此时,在数据库中如果找到这个id,就会将pc登录账号合并到之前创建的唯一用户id账号中;3.关注公众号服务,用户可微信授权登录公众号服务;应用服务可以通过接口获取用户的unionid。此时如果在数据库中查到该id,则将登录公众号的账号合并到之前创建的唯一用户id账号中;网页授权两种scope的区别说明:1.授权登录以snsapi_base为scope发起的网页授权,用于获取进入页面的用户openid,静默授权,自动跳转到回调页面.用户感知的是直接进入回调页面(通常是业务页面)。特点:无用户感知;2、静默授权以snsapi_userinfo为scope发起的网页授权,用于获取用户的基本信息。但这种授权需要用户手动同意,既然用户已经同意,授权后无需关注即可获取用户的基本信息。特殊场景静默授权:对于已经关注公众号的用户,如果用户从公众号的session或者自定义菜单进入本公众号的网页授权页面,即使scope是snsapi_userinfo,也是静默的授权,用户无感知。网页授权流程:1、引导用户进入授权页面同意授权,并获取code保证微信公众号拥有授权范围的权限(scope参数),引导用户进入授权页面参考链接:scope为snsapi_base注:appid,redirect_uri,状态需要和后台协商https://open.weixin.qq.com/connect/oauth2/authorize?appid="+wx_appid+"&redirect_uri="+api.wx_reg+"&response_type=code&scope=snsapi_login,snsapi_userinfo&state=1,0#wechat_redirectscope是snsapi_userinfohttps://open.weixin.qq.com/connect/oauth2/authorize?appid="+wx_appid+"&redirect_uri="+api.wx_reg+"&response_type=code&scope=snsapi_base,snsapi_userinfo&state=1,0#wechat_redirectuserconsent授权后,如果用户同意授权,页面会跳转到redirect_uri/?code=CODE&state=STATE。2.将页面授权access_token(后台操作)redirect_uri/?code=CODE&state=STATE的code在页面跳转回的url上进行交换。code通过code换取网页授权access_token。如果网页授权的范围是snsapi_base,那么在这一步获取网页授权access_token的同时,也获取了openid,snsapi_base风格的网页授权流程到此结束。