WxaUserApiController.java 3.18 KB
package com.rnt.controller;

import com.jfinal.aop.Duang;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.jfinal.weixin.sdk.api.ApiResult;
import com.jfinal.weixin.sdk.cache.IAccessTokenCache;
import com.jfinal.wxaapp.api.WxaUserApi;
import com.jfinal.wxaapp.jfinal.WxaController;

/**
 * 微信小程序用户api接口
 * @author L.cm
 */
public class WxaUserApiController extends WxaController {
	// 微信用户接口api
	protected WxaUserApi wxaUserApi = Duang.duang(WxaUserApi.class);

	/**
	 * 登陆接口
	 */
	public void login() {
		String jsCode = getPara("code");
		if (StrKit.isBlank(jsCode)) {
			Kv data = Kv.by("errcode", 500)
					.set("errmsg", "code is blank");
			renderJson(data);
			return;
		}
		// 获取SessionKey
		ApiResult apiResult = wxaUserApi.getSessionKey(jsCode);
		// 返回{"session_key":"nzoqhc3OnwHzeTxJs+inbQ==","expires_in":2592000,"openid":"oVBkZ0aYgDMDIywRdgPW8-joxXc4"}
		if (!apiResult.isSucceed()) {
			renderJson(apiResult.getJson());
			return;
		}
		// 利用 appId 与 accessToken 建立关联,支持多账户
		IAccessTokenCache accessTokenCache = ApiConfigKit.getAccessTokenCache();
		String sessionId = StrKit.getRandomUUID();

		accessTokenCache.set("wxa:session:" + sessionId, apiResult.getJson());
		renderJson("sessionId", sessionId);
	}

	/**
	 * 服务端解密用户信息接口
	 * 获取unionId
	 */
	public void info() {
		String signature = getPara("signature");
		String rawData = getPara("rawData");

		String encryptedData = getPara("encryptedData");
		String iv = getPara("iv");

		// 参数空校验 不做演示
		// 利用 appId 与 accessToken 建立关联,支持多账户
		IAccessTokenCache accessTokenCache = ApiConfigKit.getAccessTokenCache();
		String sessionId = getHeader("wxa-sessionid");
		if (StrKit.isBlank(sessionId)) {
			Kv data = Kv.by("errcode", 500)
					.set("errmsg", "wxa_session Header is blank");
			renderJson(data);
			return;
		}
		String sessionJson = accessTokenCache.get("wxa:session:" + sessionId);
		if (StrKit.isBlank(sessionJson)) {
			Kv data = Kv.by("errcode", 500)
					.set("errmsg", "wxa_session sessionJson is blank");
			renderJson(data);
			return;
		}
		ApiResult sessionResult = ApiResult.create(sessionJson);
		// 获取sessionKey
		String sessionKey = sessionResult.get("session_key");
		if (StrKit.isBlank(sessionKey)) {
			Kv data = Kv.by("errcode", 500)
					.set("errmsg", "sessionKey is blank");
			renderJson(data);
			return;
		}
		// 用户信息校验
		boolean check = wxaUserApi.checkUserInfo(sessionKey, rawData, signature);
		if (!check) {
			Kv data = Kv.by("errcode", 500)
					.set("errmsg", "UserInfo check fail");
			renderJson(data);
			return;
		}
		// 服务端解密用户信息
		ApiResult apiResult = wxaUserApi.getUserInfo(sessionKey, encryptedData, iv);
		if (!apiResult.isSucceed()) {
			renderJson(apiResult.getJson());
			return;
		}
		// 如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性
		// 同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
		String unionId = apiResult.get("unionId");
		renderJson("{}");
	}

}