ps: springboot と mybatisPlus と mysql を組み合わせて実現、シンプルで分かりやすく、ワンペーストで使えます 詳細は下記↓
ステップ:
1. WeChat 開発プラットフォーム アカウントを登録し、ミニ プログラムを作成し、ミニ プログラムの AppID と AppSecret を取得します。
2. アプレットで、ボタンをクリックして WeChat ログインをトリガーし、コードを取得するようにユーザーを誘導します。
3. コードをバックエンドに送信すると、バックエンドはコードを通じてユーザーの openid と session_key を取得します。
4. session_key を使用してユーザー データを復号化し、ユーザー情報、アバター、携帯電話番号などのデータを取得します。
5. ユーザーデータをデータベースに保存するなどの業務処理を行います。
詳細なコードと手順:
1: データベースを作成する
最初に、MySQL データベースを作成し、名前を付けてwechat_mini_program
、次のデータ テーブルを作成する必要があります。
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`open_id` varchar(255) DEFAULT NULL COMMENT '用户唯一标识',
`session_key` varchar(255) DEFAULT NULL COMMENT '会话密钥',
`nickname` varchar(255) DEFAULT NULL COMMENT '用户昵称',
`avatar_url` varchar(255) DEFAULT NULL COMMENT '用户头像',
`gender` tinyint(1) DEFAULT NULL COMMENT '用户性别(0:未知,1:男性,2:女性)',
`country` varchar(255) DEFAULT NULL COMMENT '用户所在国家',
`province` varchar(255) DEFAULT NULL COMMENT '用户所在省份',
`city` varchar(255) DEFAULT NULL COMMENT '用户所在城市',
`phone_number` varchar(20) DEFAULT NULL COMMENT '用户手机号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
2: 依存関係を導入する
pom.xml
次の依存関係をファイルに追加します。
<dependencies>
<!-- Spring Boot 相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis Plus 相关依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!-- MySQL 驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!-- 微信小程序 SDK 依赖 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>3.8.0</version>
</dependency>
</dependencies>
3: 設定ファイル
application.yml
次の構成をファイルに追加します。
spring:
datasource:
url: jdbc:mysql://localhost:3306/wechat_mini_program?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.demo.entity
global-config:
db-config:
id-type: auto
table-prefix: mp_
field-strategy: not_empty
#
4: エンティティークラス
User
ユーザー情報を表すエンティティクラスを作成します。
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("open_id")
private String openId;
@TableField("session_key")
private String sessionKey;
@TableField("nickname")
private String nickname;
@TableField("avatar_url")
private String avatarUrl;
@TableField("gender")
private Integer gender;
@TableField("country")
private String country;
@TableField("province")
private String province;
@TableField("city")
private String city;
@TableField("phone_number")
private String phoneNumber;
}
5:マッパーインターフェース
テーブルに対する操作を定義するUserMapper
インターフェイスを作成します。user
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
6: サービス層
UserService
ユーザー情報に対する操作を定義するインターフェースを作成します。
package com.example.demo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
User getUserByOpenId(String openId);
boolean saveOrUpdateUser(User user);
}
インターフェイスを実装するUserServiceImpl
クラスを作成します。UserService
package com.example.demo.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public User getUserByOpenId(String openId) {
return this.baseMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId));
}
@Override
public boolean saveOrUpdateUser(User user) {
return this.saveOrUpdate(user);
}
}
7: コントローラーレイヤー
UserController
ユーザー情報のリクエストを処理するクラスを作成します。
package com.example.demo.controller;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Autowired
private WxMaService wxMaService;
@Autowired
private UserService userService;
/**
* 登录接口
*/
@PostMapping("/login")
public Result<Object> login(@RequestParam("code") String code, @RequestParam("encryptedData") String encryptedData,
@RequestParam("iv") String iv) {
try {
// 调用微信 API 获取用户的 openid 和 session_key
WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
String openid = session.getOpenid();
// 调用微信 API 获取用户的手机号
WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(session.getSessionKey(), encryptedData, iv);
String phoneNumber = phoneInfo.getPhoneNumber();
// 调用微信 API 获取用户的详细信息
WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(session.getSessionKey(), code);
// 获取用户昵称
String nickName = userInfo.getNickName();
// 获取用户头像
String avatarUrl = userInfo.getAvatarUrl();
// 获取用户国家
String country = userInfo.getCountry();
// 获取用户省份
String province = userInfo.getProvince();
// 获取用户城市
String city = userInfo.getCity();
// 将用户信息保存到数据库中
User user = userService.getByOpenId(openid);
if (user == null) {
user = new User();
user.setOpenId(openid);
user.setNickName(nickName);
user.setAvatarUrl(avatarUrl);
user.setCountry(country);
user.setProvince(province);
user.setCity(city);
user.setPhoneNumber(phoneNumber);
userService.add(user);
} else {
user.setNickName(nickName);
user.setAvatarUrl(avatarUrl);
user.setCountry(country);
user.setProvince(province);
user.setCity(city);
user.setPhoneNumber(phoneNumber);
userService.update(user);
}
// 返回用户信息
Map<String, Object> data = new HashMap<>();
data.put("openid", openid);
data.put("nickName", nickName);
data.put("avatarUrl", avatarUrl);
data.put("country", country);
data.put("province", province);
data.put("city", city);
data.put("phoneNumber", phoneNumber);
return Result.success(data);
} catch (WxErrorException e) {
log.error("登录失败:" + e.getMessage(), e);
return Result.error("登录失败:" + e.getMessage());
}
/**
* 更新用户信息接口
*/
@PostMapping("/update")
public String updateUserInfo(@RequestBody User user) {
if (user == null || user.getOpenId() == null) {
return "用户信息不能为空";
}
if (userService.saveOrUpdateUser(user)) {
return "更新用户信息成功";
} else {
return "更新用户信息失败";
}
}
}
8. データベーステーブル作成文
创建 `user` 表的 SQL 语句如下:
```sql
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`open_id` varchar(255) NOT NULL COMMENT '用户 openid',
`session_key` varchar(255) DEFAULT NULL COMMENT '用户 session_key',
`nickname` varchar(255) DEFAULT NULL COMMENT '用户昵称',
`avatar_url` varchar(255) DEFAULT NULL COMMENT '用户头像 URL',
`gender` int(11) DEFAULT NULL COMMENT '用户性别,0:未知,1:男性,2:女性',
`country` varchar(255) DEFAULT NULL COMMENT '用户所在国家',
`province` varchar(255) DEFAULT NULL COMMENT '用户所在省份',
`city` varchar(255) DEFAULT NULL COMMENT '用户所在城市',
`phone_number` varchar(20) DEFAULT NULL COMMENT '用户手机号',
PRIMARY KEY (`id`),
UNIQUE KEY `open_id_UNIQUE` (`open_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
9: pom.xml 構成ファイル
次の依存パッケージを導入する必要があります。
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou.mybatisplus</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- weixin-java-miniapp -->
<dependency>
<groupId>me.chanjar.weixin</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>3.9.0</version>
</dependency>
10: 業務説明と通話の流れ
このコードは、アプレットのユーザー ログインとユーザー情報の更新の機能を実装します。
呼び出しプロセスは次のとおりです。
- アプレットのフロントエンドは取得する
wx.login
メソッドcode
- アプレットのフロントエンド
code
はバックエンドの/user/login
インターフェースに渡されます - バックエンド呼び出し
wxMaService.getUserService().getSessionInfo(code)
メソッドは、 getsession_key
とopenid
- バックエンドは に従ってユーザー情報
openid
を照会し、ユーザーが存在しない場合は新しいユーザーを作成します - バックエンドはアプレットのフロントエンド
openid
に - アプレットのフロントエンドは、
wx.getUserProfile
このメソッドユーザー情報 (ニックネーム、アバターなど) を取得します。 - アプレットのフロントエンドは
openid
、バックエンドの/user/update
インターフェースとともにユーザー情報を送信します -
バックエンドがユーザー情報を更新し、更新結果をアプレットのフロントエンドに返す
以上!
一般: 上記は、このコードによって実装されたビジネス プロセスです. 具体的な実装については、上記のコードとコメントを参照してください.
このコードを使用する場合は、アプレットのバックグラウンドでアプレットを作成し、 と を取得して、コードで適切に構成するappid
必要があることに注意してください。appsecret
さらに、WeChat オープン プラットフォームで対応する許可を申請して取得する必要がありますaccess_token
。具体的な操作については、WeChat の公式ドキュメントを参照してください。
ps: 上記のコードは基本的な実装として使用でき、これに基づいてさらなる開発と最適化を実行できます。