目次
wx.getUserProfile
bindgetuserinfo
ログインプロセス
ミニ プログラム ログイン | WeChat オープン ドキュメント (qq.com)
ミニ プログラムは、WeChat が提供する公式ログイン機能を通じて、WeChat が提供するユーザー ID を簡単に取得し、ミニ プログラム内でユーザー システムを迅速に確立できます。
説明 wx.login(Object object) | WeChat Open Documentation (qq.com) を呼び出して、 一時的な ログイン資格情報コードを取得し、それを開発者サーバーに送り返します。 Mini Program Login | WeChat Open Documentation (qq.com) auth.code2Session インターフェイスを呼び出して、 ユーザー の一意の ID OpenID 、WeChat Open Platform アカウントの下のユーザーの 一意 (現在の Mini Program がバインドされている場合) WeChat Open Platform アカウント) および セッション キー session_key 。その後、開発者サーバーはユーザー ID に従ってカスタム ログイン ステータスを生成できます。このユーザー ID は、後続のビジネス ロジックでフロントエンドとバックエンドの対話中にユーザーの ID を識別するために使用されます。セッションキー session_key は、ユーザーデータを暗号化および署名するためのキーです . サーバーはオープンデータ | WeChat オープンドキュメント (qq.com) を取得します. アプリケーション自体のデータを保護するために、開発者 サーバーはセッション キーをアプレットに送信したり、このキーを外部に提供したりしないでください。 . 一時的なログイン認証コードは 1 回だけ使用できます. appId 関数は、appid が WeChat アカウントの一意の識別子であることを示しています, これは固定されています. WeChat 公式アカウントの開発を理解している場合, 注意を払う必要があります, の appidアプレットと公式アカウントの appid が一致しない session_key 関数の説明 WeChat クライアントは wx.getUserInfo() を介してユーザー情報を取得する バックグラウンドは WeChat クライアントのユーザー情報を取得する必要がある場合があるため、シークレットを使用する必要がありますキー session_key を使用して WeChat プラットフォームから公式文書を取得. 署名の検証とデータの暗号化と復号化には、ユーザーのセッション キー session_key が必要です。開発者は事前に wx.login ログイン プロセスでセッション キー session_key を取得し、サーバーに保存する必要があります。データを改ざんしないために、開発者は、session_key をアプレット クライアントなどのサーバー外の環境に渡さないでください。
ログインアプレット
- wx.login を実行してログインし、アプレットのコードを取得します
- サーバーは、コードに従って WeChat から session_key を取得してキャッシュし、同時に access_token を生成してアプレットに保存し、ログイン状態を維持します。
- アプレットがサーバーのユーザー データを要求すると、まず wx.checkSession が有効な場合は access_token でユーザーを特定し、session_key を見つけます; 無効な場合は wx.login を実行して再ログインし、access_token を再生成し、サーバーが session_key を再取得します。
- ミニ プログラムを長期間使用しないと、サーバー上の session_key が無効になり、session_key を使用して WeChat からデータを取得できなくなり、ミニ プログラムは再度ログイン操作を実行する必要があります。ミニプログラムのログインを通じてのみ session_key を取得します。
wx.checkSession
ログイン状態の有効期限が切れていないか確認する
wx.login
インターフェイスを呼び出してログイン資格情報を取得します (コード)
wx.request
独自のミニ プログラム サーバーを要求し、コード、userInfo 情報を運ぶ
バックステージ
データシートを準備する
DROP TABLE IF EXISTS `wx_user`;
CREATE TABLE `wx_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名称',
`password` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户密码',
`gender` tinyint(3) NOT NULL DEFAULT 0 COMMENT '性别:0 未知, 1男, 1 女',
`birthday` date NULL DEFAULT NULL COMMENT '生日',
`last_login_time` datetime(0) NULL DEFAULT NULL COMMENT '最近一次登录时间',
`last_login_ip` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '最近一次登录IP地址',
`user_level` tinyint(3) NULL DEFAULT 0 COMMENT '用户层级 0 普通用户,1 VIP用户,2 区域代理用户',
`nickname` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称或网络名称',
`mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户手机号码',
`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户头像图片',
`weixin_openid` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '微信登录openid',
`status` tinyint(3) NOT NULL DEFAULT 0 COMMENT '0 可用, 1 禁用, 2 注销',
`add_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除',
`share_user_id` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `user_name`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Compact;
リバース ビルド ツールが生成する
- WxUser.java
- WxUserMapper.java
- WxUserMapper.xml
フロントエンドから渡されたデータをカプセル化する準備をする
- ユーザー情報
package com.zking.ssm.model;
import lombok.Data;
import java.io.Serializable;
/**
* 封装微信UserInfo用户信息
*/
@Data
public class UserInfo implements Serializable {
private static final long serialVersionUID = -5813029516433359765L;
private Integer userId;
private String nickName;
private String avatarUrl;
private String country;
private String province;
private String city;
private String language;
private Byte gender;
private String phone;
private Byte userLevel;// 用户层级 0 普通用户,1 VIP用户,2 区域代理用户
private String userLevelDesc;// 代理用户描述
private Byte status;//状态
private String registerDate;//注册日期
}
- WxLoginInfo
package com.zking.ssm.model;
import lombok.Data;
import java.io.Serializable;
/**
* 封装请求数据
*/
@Data
public class WxLoginInfo implements Serializable {
private static final long serialVersionUID = -7722430332896313642L;
private String code;
private UserInfo userInfo;
}
ミニ プログラム サーバー構成
WeChat Mini プログラム SDK のインポート
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>3.3.0</version>
</dependency>
WxProperties
oa.wx のデータをカプセル化する
@Data
@Configuration
@ConfigurationProperties(prefix = "oa.wx")
public class WxProperties {
/**
* 设置微信小程序的appId
*/
private String appId;
/**
* 设置微信小程序的Secret
*/
private String appSecret;
/**
* 消息数据格式
*/
private String msgDataFormat;
}
WxConfig
WxMaService を登録する
@Configuration
public class WxConfig {
@Autowired
private WxProperties properties;
@Bean
public WxMaConfig wxMaConfig() {
WxMaInMemoryConfig config = new WxMaInMemoryConfig();
config.setAppid(properties.getAppId());
config.setSecret(properties.getAppSecret());
config.setMsgDataFormat(properties.getMsgDataFormat());
return config;
}
@Bean
public WxMaService wxMaService(WxMaConfig maConfig) {
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(maConfig);
return service;
}
}
WxAuthController
@RequestMapping("/wx/auth")
public class WxAuthController {
@Autowired
private WxMaService wxService;
@PostMapping("login_by_weixin")
public Object loginByWeixin(@RequestBody WxLoginInfo wxLoginInfo, HttpServletRequest request) {
//客户端需携带code与userInfo信息
String code = wxLoginInfo.getCode();
UserInfo userInfo = wxLoginInfo.getUserInfo();
if (code == null || userInfo == null) {
return ResponseUtil.badArgument();
}
//调用微信sdk获取openId及sessionKey
String sessionKey = null;
String openId = null;
try {
WxMaJscode2SessionResult result = this.wxService.getUserService().getSessionInfo(code);
sessionKey = result.getSessionKey();//session id
openId = result.getOpenid();//用户唯一标识 OpenID
} catch (Exception e) {
e.printStackTrace();
}
if (sessionKey == null || openId == null) {
log.error("微信登录,调用官方接口失败:{}", code);
return ResponseUtil.fail();
}else{
log.info("openId={},sessionKey={}",openId,sessionKey);
}
//根据openId查询wx_user表
//如果不存在,初始化wx_user,并保存到数据库中
//如果存在,更新最后登录时间
//....
// token
UserToken userToken = null;
try {
userToken = UserTokenManager.generateToken(user.getId());
} catch (Exception e) {
log.error("微信登录失败,生成token失败:{}", user.getId());
e.printStackTrace();
return ResponseUtil.fail();
}
userToken.setSessionKey(sessionKey);
log.info("SessionKey={}",UserTokenManager.getSessionKey(user.getId()));
Map<Object, Object> result = new HashMap<Object, Object>();
result.put("token", userToken.getToken());
result.put("tokenExpire", userToken.getExpireTime().toString());
result.put("userInfo", userInfo);
//....
log.info("【请求结束】微信登录,响应结果:{}", JSONObject.toJSONString(result));
return ResponseUtil.ok(result);
}
クライアントへの応答データは次のとおりです。
token userInfo
ログインアプレット
login.js
user.loginByWeixin(res.userInfo).then(res => {
app.globalData.hasLogin = true;
wx.navigateBack({
delta: 1
})
})
user.js
function loginByWeixin(userInfo) {
return new Promise(function(resolve, reject) {
return login().then((res) => {
//登录远程服务器
util.request(api.AuthLoginByWeixin, {
code: res.code,
userInfo: userInfo
}, 'POST').then(res => {
if (res.errno === 0) {
//存储用户信息
wx.setStorageSync('userInfo', res.data.userInfo);
wx.setStorageSync('token', res.data.token);
resolve(res);
} else {
reject(res);
}
})
userInfo とトークン データをローカルに保存する
ユーティリティ.js
function request(url, data = {}, method = "GET") {
return new Promise(function (resolve, reject) {
wx.request({
url: url,
data: data,
method: method,
timeout:6000,
header: {
'Content-Type': 'application/json',
'X-OA-Token': wx.getStorageSync('token')
},
util.request 関数を使用する場合、各リクエストは 'X-OA-Token': wx.getStorageSync('token'); を運び、サーバーはすべてのトークンを保存しているので、サーバーは各クライアントをトークンで区別します
絵文字
Mysql の utf8 は最大 3 バイトの文字をエンコードしますが、絵文字表現は 4 バイトであるため、utf8 は絵文字表現の保存をサポートしていません。しかし、utf8 のスーパーセットである utf8mb4 は、1 文字あたり最大 4 バイトを持つことができるため、絵文字式のストレージをサポートできます。
Linux システムの MySQL の構成ファイルは my.cnf です。
Windows の構成ファイルは my.ini です。
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\\tools\\mysql-5.7.23-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\\tools\\mysql-5.7.23-winx64\\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
バックグラウンドとフロントエンドのコード共有 ----
フロントデスク: oa-mini.rar - Lanzuoyun