Cet article s'adresse aux utilisateurs du framework laravel du langage PHP. Il présente une méthode de connexion WeChat intégrée simple basée sur ce framework. Comment l'utiliser :
1. Installez php_weixin_provider
Exécutez composer nécessite des fournisseurs tiers/weixin dans le cadre du projet pour terminer l'installation. Après une installation réussie, vous devriez pouvoir voir le fichier de bibliothèque php_weixin_provider dans le répertoire du fournisseur du projet :
2. Configurez les paramètres de connexion WeChat
Il y a au total 7 paramètres configurables, à savoir :
client_id : correspondant à l'appid d'application créé par le compte officiel
client_secret : correspondant à l'appid d'application créé par le compte public
redirect : correspond à l'adresse de rappel après une autorisation WeChat réussie
proxy_url : correspond à l'adresse du service proxy autorisé par WeChat (vous pouvez lire cet article pour comprendre sa fonction)
appareil : La différence est entre la connexion WeChat sur PC et la connexion WeChat sur mobile. La valeur par défaut est PC. S'il s'agit d'un mobile, elle peut être définie sur vide.
state_cookie_name : le lien d'autorisation contiendra un paramètre d'état aléatoire. Ce paramètre sera renvoyé intact lorsque WeChat rappellera. À ce moment-là, vous pouvez déterminer si la demande est valide en vérifiant si le paramètre d'état est le même que le paramètre transmis dans le fichier. lien d’autorisation. Empêcher les attaques CSRF. Cette solution enregistrera d'abord le paramètre d'état dans le cookie lors de l'autorisation, ce paramètre est donc utilisé pour spécifier le nom du cookie où le paramètre d'état est stocké. La valeur par défaut est wx_state_cookie.
state_cookie_time : Spécifie la période de validité de wx_state_cookie, la valeur par défaut est de 5 minutes
Il existe 2 méthodes de réglage pour ces sept paramètres.
La première consiste à configurer ces paramètres en majuscules dans le fichier de configuration .env :
Remarque : 1. Chaque élément de configuration est en majuscule et commence par WEIXIN_ ; 2. Les trois premiers éléments de configuration ne sont pas exactement les mêmes que les noms de paramètres introduits précédemment. KEY correspond à client_id, SECRET correspond à client_secret et REDIRECT_URI correspond à redirect 3 ; . D'autres sont cohérents avec les noms de paramètres introduits précédemment.
La seconde consiste à configurer ces paramètres dans le fichier config/services.php :
Pour une configuration de cette manière, le nom de chaque élément de configuration est cohérent avec celui introduit précédemment.
Choses à noter :
Puisque php_weixin_provider est implémenté sur la base de laravel/socialite, il nécessite que client_id, client_secret et redirect soient configurés, sinon une erreur se produira lors du processus d'instanciation de php_weixin_provider ; pour client_id et client_secret, je pense qu'il n'y a aucun problème à les configurer en un seul. endroit, mais pour la redirection, s'il est configuré de manière uniforme, il peut ne pas répondre aux besoins de tous les scénarios, car l'adresse de rappel finale n'est pas la même dans tous les endroits où la connexion WeChat est utilisée, il est donc recommandé de configurer la redirection vers un ou valide ; adresse de rappel non vide non valide ; de toute façon. Lorsque vous utilisez php_weixin_provider ultérieurement, vous pouvez également modifier la valeur de ce paramètre lors de l'appel.
Si proxy_url existe, il est recommandé de le configurer dans un lieu public ;
Puisque state_cookie_name et state_cookie_time ont tous deux des valeurs par défaut, il n'est fondamentalement pas nécessaire de les reconfigurer
;
L'appareil peut être spécifié lors de son utilisation.
Tous les paramètres de configuration peuvent être respécifiés pendant l'utilisation.
3. Enregistrez php_weixin_provider
Dans le fichier config/app.php du projet, recherchez la section de configuration des fournisseurs et ajoutez le code suivant à son tableau de configuration :
4. Inscrivez-vous à la surveillance des événements de connexion tiers
Ajoutez le code suivant au fichier app/Providers/EventServiceProvider.php du projet :
Le framework Laravel dans son ensemble est une idée IOC et basée sur les événements. Si vous êtes familier avec js, vous serez très familier avec les modèles de conception, vous serez familier avec IOC (Inversion of Control). , également connu sous le nom de DI : Dependency Injection). C'est la clé pour comprendre le rôle de la configuration dans les étapes 3 et 4.
5. Écrivez une interface pour la connexion à WeChat
Les exemples sont les suivants :
//采用代理跳转,从PC端微信登录 Route::get('/login', function () { return Socialite::with('weixin') ->setProxyUrl('http://proxy.your.com') ->setRedirectUrl(url('/login/notify')) ->redirect(); }); //采用代理跳转,从手机端微信登录 Route::get('/login2', function () { return Socialite::with('weixin') ->setProxyUrl('http://proxy.your.com') ->setDevice('') ->setRedirectUrl(url('/login/notify')) ->redirect(); }); //不采用代理跳转,从PC端微信登录 Route::get('/login', function () { return Socialite::with('weixin') ->setRedirectUrl(url('/login/notify')) ->redirect(); }); //不采用代理跳转,从手机端微信登录 Route::get('/login4', function () { return Socialite::with('weixin') ->setDevice('') ->setRedirectUrl(url('/login/notify')) ->redirect(); });
Socialite::with('weixin') renverra une instance de php_weixin_provider, qui est :
拿到这个实例之后,就可以采用链式的方式调用它提供的所有public方法,比如设置配置参数,setDevice等等。
6. 编写微信登录回调的接口
举例如下:
//登录回调 Route::get('/login/notify', function () { $user = null; try { $user = Socialite::with('weixin')->user(); } catch(\Exception $e) { return '获取微信用户异常'; } return $user->nickname; });
通过Socialite::with('weixin')拿到php_weixin_provider实例后,调用user方法,就会自动跟微信调用相关接口,并把微信的返回值封装成对象返回。如果在此过程中,有任何错误都会以异常的形式抛出,比如state参数校验失败,比如code失效等。
返回的$user对象包含的有效属性有:
小结:
这个方案是基于laravel/socialite实现,并发布到composer来使用的。laravel/socialite是laravel官方提供的第三方登录的模块,基于它可以很方便的集成大部分第三方平台的认证,目前它官方已经提供很多第三方的登录实现:https://socialiteproviders.github.io/。除了国外的facebook,google,github等,国内的微信,微博,qq也都有提供。我在一开始也用的是它官方提供的默认的微信登录provider来做的,但是后来我发现了以下几个问题:
1. 不支持微信授权的代理;
2. pc端跟移动端竟然还是分两个项目来做的:
3. 它封装的user对象里竟然不包含unionid
4. 更改配置参数的方式,实在是让人觉得难以使用:
所以我就在它官方的微信登录provider基础上,按照自己的想法,重新实现了一个来解决我发现的这些问题。
更多Comment intégrer rapidement la connexion WeChat au framework Laravel de PHP相关文章请关注PHP中文网!