(詳細版) Java は、WeChat ログイン、ユーザー情報、携帯電話番号、およびアバターを取得するための小さなプログラムを実装します。

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: 業務説明と通話の流れ

このコードは、アプレットのユーザー ログインとユーザー情報の更新の機能を実装します。

呼び出しプロセスは次のとおりです。

  1. アプレットのフロントエンドは取得するwx.loginメソッドcode
  2. アプレットのフロントエンドcodeはバックエンドの/user/loginインターフェースに渡されます
  3. バックエンド呼び出しwxMaService.getUserService().getSessionInfo(code)メソッドは、 getsession_keyopenid
  4. バックエンドは に従ってユーザー情報openidを照会し、ユーザーが存在しない場合は新しいユーザーを作成します
  5. バックエンドはアプレットのフロントエンドopenid
  6. アプレットのフロントエンドは、wx.getUserProfileこのメソッドユーザー情報 (ニックネーム、アバターなど) を取得します。
  7. アプレットのフロントエンドはopenid、バックエンドの/user/updateインターフェースとともにユーザー情報を送信します
  8. バックエンドがユーザー情報を更新し、更新結果をアプレットのフロントエンドに返す

以上!

一般: 上記は、このコードによって実装されたビジネス プロセスです. 具体的な実装については、上記のコードとコメントを参照してください.

このコードを使用する場合は、アプレットのバックグラウンドでアプレットを作成し、 と を取得して、コードで適切に構成するappid必要があることに注意してください。appsecretさらに、WeChat オープン プラットフォームで対応する許可を申請して取得する必要がありますaccess_token具体的な操作については、WeChat の公式ドキュメントを参照してください。

ps: 上記のコードは基本的な実装として使用でき、これに基づいてさらなる開発と最適化を実行できます。

おすすめ

転載: blog.csdn.net/zbh1957282580/article/details/129959031
おすすめ