This project is not covered by Drupal’s security advisory policy.

微信认证模块,支持Drupal 8原生网站。
支持rest 模块认证(simple_oauth方式),有公众号H5 SPA和手机APP两种模式。

开发正在Github进行,欢迎参与:https://github.com/solody/wechat_connect

# wechat_connect

当移动应用或H5 SPA这种客户端以 drupal 8 为服务端时,它们是通过RESTful接口与Drupal通信的。
rest 模块是 Drupal 8的核心模块,提供了实现 RESTful接口的支持,它支持多种认证方式:
- cookies
- http basic
- oauth2.0

在与第三方进行用户整合的情况下,需要使用 oauth2.0认证,前俩种认证方式都不能满足场景要求,
而 rest 的 oauth2.0 认证是由 simple_oauth模块 提供的。

### 支持的微信登录类型

image
- 网站登录

Drupal 8 原生网站登录,只能配置一个。

- 微信公众号登录

微信公众号内H5 SPA应用登录。H5 SPA客户端发起微信授权,得到Authorization Code,
通过接口换取 drupal/simple_oauth 的 Authorization Code,从而获取 simple_oauth
的 access_token。

- 移动应用微信登录

Android\ios原生APP微信登录。原理与微信公众号H5 SPA登录是一样的,
不同的是在客户端发起登录时,使用的不是Web跳转,而是调起原生微信APP进行授权。

### 客户端登录过程
- 发起微信授权,得到 Authorization Code。
- 调用 wechat/connect 接口,drupal获取 access_token和 open_id,并保存。
- 如果用户已注册,直接返回 drupal/simple_oauth 的 Authorization Code。
- 如果没有注册,返回用户信息
- 如果没有注册,客户端调用 wechat/register 接口进行注册,drupal将创建用户账号,
并绑定微信用户到此账号。 此接口可以提供一个手机号码,如果已有用户账号使用此手机号,
那么 drupal将不会创建新的用户,而是直接把微信用户绑定到此账号。
- 注册成功后,返回 drupal/simple_oauth 的 Authorization Code。
- 客户端使用simple_oauth 的 Authorization Code 获取 simple_oauth 的 access_token。

### union_id的处理
如果微信应用开通了union_id,模块会自动处理。
如果发现拉取的微信用户信息中存在 union_id,把它和 open_id 一同记录到数据库。
在 wechat/connect 接口中,会同时检查 union_id,如果已经存在,那么说明用户已经注册。
这时接口会创建 wechat_user 记录,但不会创建新的Drupal user。

# How to use

- PC网站
1. [申请微信开放平台账号](http://open.weixin.qq.com),并认证。
2. 在微信开放平台`管理中心`添加 `网站应用`,注意填写正确的回调域,提交审核通过后,获取 `AppID` 和 `AppSecret`。
3. 在 Drupal 中 `admin/config/wechat/wechat_application/add` 页面添加一个 `Web Site` 类型的微信应用。
- Drupal 服务端渲染
4. 在浏览器中访问 `user/login/wechat-connection/{app_id}`。
- SPA + Headless Drupal
4. 在 Drupal 后台 `/admin/config/services/consumer/add` 添加 Oauth2 Client,正确填写 `Redirect URI`
为 SPA 地址,比如是 `http://localhost:8080/`,`Is this consumer 3rd party?` 选项取消钩选。
5. 在 SPA 中跳转到 `/oauth/wechat-authorize` 进行微信登录,登录完成后跳带 Token 转回 SPA。如:
`http://headless-drupal-domain/oauth/wechat-authorize?app_id=微信开放平台网站应用ID&response_type=token&client_id=b46a8989-d545-4c34-9c92-7e8237891452&redirect_uri=http%3A//localhost%3A8080/&scope=&state=`
跳转并带有 Token:
`http://localhost:8080/#/access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiI...`
- 公众号网站
1. [申请微信公众平台账号](https://mp.weixin.qq.com),并认证。
2. 在微信公众号后台填写正确的回调域,获取 `AppID` 和 `AppSecret`。
3. 在 Drupal 中 `admin/config/wechat/wechat_application/add` 页面添加一个 `Media Platform` 类型的微信应用。
- Drupal 服务端渲染
4. 在微信内置浏览器中访问 `user/login/wechat-connection/{app_id}`。
- SPA + Headless Drupal
4. 在 Drupal 后台 `/admin/config/services/consumer/add` 添加 Oauth2 Client,正确填写 `Redirect URI`
为 SPA 地址,比如是 `http://localhost:8080/`,`Is this consumer 3rd party?` 选项取消钩选。
5. 微信内置浏览器中打开发 SPA 页面中跳转到 `/oauth/wechat-authorize` 进行微信登录,登录完成后跳带 Token 转回 SPA。如:
`http://headless-drupal-domain/oauth/wechat-authorize?app_id=wx7da03a1e72...`
跳转并带有 Token:
`http://localhost:8080/#/access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiI...`
- 微信小程序
1. [申请微信小程序账号](https://mp.weixin.qq.com)。
2. 在微信小程序后台填写正确的回调域,获取 `AppID` 和 `AppSecret`。
3. 在 Drupal 中 `admin/config/wechat/wechat_application/add` 页面添加一个 `Wechat mini App` 类型的微信应用。
4. 在小程序获取 login code。
5. 在小程序调用 Drupal 接口:
```curl
POST {{host}}/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=wechat_native_app_code&client_id={{client_id}}&client_secret={{client_secret}}&code={{wechat_native_app_code}}&scope=
```
- 原生APP
1. [申请微信开放平台账号](http://open.weixin.qq.com),并认证。
2. 在微信开放平台`管理中心`添加 `移动应用`,注意填写正确的回调域,提交审核通过后,获取 `AppID` 和 `AppSecret`。
3. 在 Drupal 中 `admin/config/wechat/wechat_application/add` 页面添加一个 `MobileApp` 类型的微信应用。
4. APP通过微信登录 SDK 获取 login code。
5. APP 调用 Drupal 接口:
```curl
POST {{host}}/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=wechat_mini_program_code&client_id={{client_id}}&client_secret={{client_secret}}&code={{wechat_native_app_code}}&scope=

```

Project information

Releases