package com.xinyilu.common.utils;

import com.alibaba.fastjson2.JSON;
import com.xinyilu.common.entity.AppletAccessToken;
import com.xinyilu.common.entity.AppletLoginVO;
import com.xinyilu.common.entity.AppletPhoneVO;
import com.xinyilu.common.exception.ServiceException;
import com.xinyilu.common.utils.http.HttpUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @Description 微信小程序工具类
 * @Author 纪寒
 * @Date 2022-08-17 16:11:10
 * @Version 1.0
 */
@Slf4j
public class AppletChatUtil {

    /**
     * 小程序登录url
     */
    private static final String APPLET_LOGIN_URL = "https://api.weixin.qq.com/sns/jscode2session";

    /**
     * 小程序accessToken的url
     */
    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";

    /**
     * 小程序获取用户手机号的url
     */
    private static final String PHONE_NUMBER_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";

    /**
     * 根据登录编码获取微信用户信息
     *
     * @param appletId  小程序id
     * @param secret    小程序秘钥
     * @param code      登录凭证码
     * @param grantType 授权类型
     * @return 登录信息
     */
    public static AppletLoginVO getAppletLoginInfo(String appletId, String secret, String code, String grantType) {
        //请求地址
        String appletLoginUrl = APPLET_LOGIN_URL
                + "?appid=" + appletId
                + "&secret=" + secret
                + "&js_code=" + code
                + "&grant_type=" + grantType;
        //发送请求
        String result = HttpUtils.sendGet(appletLoginUrl);
        if (StringUtils.isBlank(result)) {
            throw new ServiceException("获取微信小程序用户信息失败", 201);
        }
        return JSON.parseObject(result, AppletLoginVO.class);
    }

    /**
     * 获取微信小程序的accessToken
     *
     * @param appletId 小程序id
     * @param secret   小程序秘钥
     * @return accessToken信息
     */
    public static AppletAccessToken getAppletAccessToken(String appletId, String secret) {
        //请求路径
        String accessTokenUrl = ACCESS_TOKEN_URL + "&appid=" + appletId + "&secret=" + secret;
        //发送请求
        String result = HttpUtils.sendGet(accessTokenUrl);
        if (StringUtils.isBlank(result)) {
            throw new ServiceException("获取微信小程序accessToken信息失败", 201);
        }
        return JSON.parseObject(result, AppletAccessToken.class);
    }

    /**
     * 获取微信小程序的手机号码
     *
     * @param code        登录凭证
     * @param accessToken 小程序accessToken
     * @return 手机信息
     */
    public static AppletPhoneVO getAppletPhoneInfo(String code, String accessToken) {
        //请求地址
        String phoneUrl = PHONE_NUMBER_URL + accessToken;
        //请求参数
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("code", code);
        String param = JSON.toJSONString(paramMap);
        //发送POST请求
        String result = HttpUtils.sendPostJson(phoneUrl, param);
        if (StringUtils.isBlank(result)) {
            throw new ServiceException("获取微信小程序手机号失败", 201);
        }
        return JSON.parseObject(result, AppletPhoneVO.class);
    }
}
