package com.mjlogin.util.sms;

import com.alibaba.fastjson.JSONObject;
import com.mjlogin.service.AccountService;
import com.taurus.core.util.Logger;

public class WeChatOpenIdValidator {
	private static Logger logger = Logger.getLogger(WeChatOpenIdValidator.class);
	public static void main(String[] args) {
		WeChatOpenIdValidator w = new WeChatOpenIdValidator();
		String appid="wx512208d074b2ac34";
		String appsecret="605ab6f94702a28d225ac344f8054571";
		String token = w.getAccessToken(appid, appsecret);
		System.out.println("token:"+token);
		String openId="oLpNT2Y6oVRZq3Pv1kwemiVwRxJE";
		boolean verifyOpenId = w.verifyAppIdAndOpenId(appid, appsecret, openId);
		System.out.println("verifyOpenId:"+verifyOpenId);
	}
	
		
		/**
	     * 通过前端传来的 code 获取 openid 和 session_key
	     * @param code 前端 wx.login 获取的临时凭证
	     * @return 用户信息（openid, session_key等）
	     */
	    public static JSONObject getUserInfoByOpenId(String access_token,String openid) {
	        // 1. 构建请求 URL
	        String url = String.format(
	            "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s",
	            access_token, openid
	        );
	        logger.info("获取用户详情的url:"+url);

	        // 2. 发送 HTTP GET 请求
	        String result = AccountService.request(url);
	        JSONObject json = JSONObject.parseObject(result);
	        
	        // 3. 检查错误码
	        Integer errcode = json.getInteger("errcode");
	        if (errcode != null && errcode != 0) {
	            // 处理错误
	            String errmsg = json.getString("errmsg");
	            throw new RuntimeException("获取 用户详情 失败: errcode=" + errcode + ", errmsg=" + errmsg);
	        }
	        
	        // 4. 返回成功结果
//	        String openid = json.getString("openid");
//	        String sessionKey = json.getString("session_key");
//	        String unionid = json.getString("unionid");
	        logger.info("json:"+json);
	        return json;
	    }
	/**
     * 通过前端传来的 code 获取 openid 和 session_key
     * @param code 前端 wx.login 获取的临时凭证
     * @return 用户信息（openid, session_key等）
     */
    public static JSONObject getOpenIdByCode(String code,String appid,String secret) {
        // 1. 构建请求 URL
        String url = String.format(
            "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
            appid, secret, code
        );
        logger.info("获取openid的url:"+url);

        // 2. 发送 HTTP GET 请求
        String result = AccountService.request(url);
        JSONObject json = JSONObject.parseObject(result);
        
        // 3. 检查错误码
        Integer errcode = json.getInteger("errcode");
        if (errcode != null && errcode != 0) {
            // 处理错误
            String errmsg = json.getString("errmsg");
            throw new RuntimeException("获取 openid 失败: errcode=" + errcode + ", errmsg=" + errmsg);
        }
        
        // 4. 返回成功结果
//        String openid = json.getString("openid");
//        String accessToken = json.getString("access_token");
        logger.info("json:"+json);
        return json;
    }
	/**
     * 2. 获取 Access Token
     * @param appid 公众号 AppID
     * @param appsecret 公众号 AppSecret
     * @return access_token 字符串，失败返回 null
     */
    public String getAccessToken(String appid, String appsecret) {
        String url = String.format(
            "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
            + "",
            appid, appsecret
        );
        System.out.println("url:"+url);
        try {
            String result = AccountService.request(url);
            if (result == null) {
                return null;
            }
            
            JSONObject json = JSONObject.parseObject(result);
            String accessToken = json.getString("access_token");
            Integer errcode = json.getInteger("errcode");
            
            if (errcode != null && errcode != 0) {
                logger.error("获取 access_token 失败, errcode: {}, errmsg: {}", errcode, json.getString("errmsg"));
                return null;
            }
            
            logger.info("获取 access_token 成功: {}", accessToken);
            return accessToken;
        } catch (Exception e) {
            logger.error("获取 access_token 异常", e);
            return null;
        }
    }
	 /**
     * 5. 验证 AppID 和 OpenID 是否匹配
     * @param appid 公众号 AppID
     * @param appsecret 公众号 AppSecret
     * @param openid 待验证的 openid
     * @return true-匹配, false-不匹配
     */
    public boolean verifyAppIdAndOpenId(String appid, String appsecret, String openid) {
        // 先获取 access_token
        String accessToken = getAccessToken(appid, appsecret);
        if (accessToken == null) {
            logger.error("获取 access_token 失败，AppID 可能无效");
            return false;
        }
        
        // 用 access_token 和 openid 获取用户信息
        String url = String.format(
            "https://api.weixin.qq.com/sns/userinfo/info?access_token=%s&openid=%s&lang=zh_CN",
            accessToken, openid
        );
        
        try {
            String result = AccountService.request(url);
            if (result == null) {
                return false;
            }
            
            JSONObject json = JSONObject.parseObject(result);
            Integer errcode = json.getInteger("errcode");
            System.out.println("result:"+result);
            if (errcode == null) {
                // 成功获取用户信息，说明匹配
                logger.info("AppID 和 OpenID 匹配，用户昵称: {}", json.getString("nickname"));
                return true;
            } else if (errcode == 40003) {
                logger.warn("AppID 和 OpenID 不匹配, errcode: 40003");
                return false;
            } else {
                logger.warn("验证失败, errcode: {}, errmsg: {}", errcode, json.getString("errmsg"));
                return false;
            }
        } catch (Exception e) {
            logger.error("验证 AppID 和 OpenID 异常", e);
            return false;
        }
    }
}