WeChat ミニ プログラム WeChat アカウント ログイン

目次

バックグラウンドとフロントエンドのコード共有 ----


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 をアプレット クライアントなどのサーバー外の環境に渡さないでください。

ログインアプレット

  1. wx.login を実行してログインし、アプレットのコードを取得します
  2. サーバーは、コードに従って WeChat から session_key を取得してキャッシュし、同時に access_token を生成してアプレットに保存し、ログイン状態を維持します。
  3. アプレットがサーバーのユーザー データを要求すると、まず wx.checkSession が有効な場合は access_token でユーザーを特定し、session_key を見つけます; 無効な場合は wx.login を実行して再ログインし、access_token を再生成し、サーバーが session_key を再取得します。
  4. ミニ プログラムを長期間使用しないと、サーバー上の 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

バックグラウンドとフロントエンドのコード共有 ----

背景: ssm-oa.rar - Lanzuoyun

フロントデスク: oa-mini.rar - Lanzuoyun

おすすめ

転載: blog.csdn.net/qq_62898618/article/details/128628006