mini-game-service 0.0.1

提供小游戏后端服务
Documentation
use super::*;

/// <https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/server/log-in/code-2-session>
pub struct TikTokLogin {
    pub app_id: String,
    pub app_secret: String,
    pub code: String,
    pub anonymous_code: String,
}

#[derive(Debug, Deserialize)]
pub struct TikTokLoginResponse {
    #[serde(default)]
    pub err_no: i64,
    #[serde(default)]
    pub err_tips: String,
    #[serde(default)]
    pub log_id: String,
    pub data: TikTokLoginResponseData,
    // #[serde(flatten)]
    // pub other: HashMap<String, String>,
}

#[derive(Debug, Deserialize)]
pub struct TikTokLoginResponseData {
    #[serde(default)]
    pub session_key: String,
    #[serde(default)]
    pub anonymous_openid: String,
    #[serde(default)]
    pub openid: String,
    #[serde(default)]
    pub unionid: String,
    // #[serde(flatten)]
    // pub other: HashMap<String, String>,
}

impl TikTokLogin {
    pub async fn send(self) -> Result<TikTokLoginResponse, GameError> {
        let mut get_url = format!(
            "https://minigame.zijieapi.com/mgplatform/api/apps/jscode2session?appid={}&secret={}",
            self.app_id, self.app_secret
        );
        if !self.code.is_empty() {
            get_url.push_str("&code=");
            get_url.push_str(&self.code);
        }
        if !self.anonymous_code.is_empty() {
            get_url.push_str("&anonymous_code=");
            get_url.push_str(&self.anonymous_code);
        }
        let result = reqwest::get(get_url).await?.json::<TikTokLoginResponse>().await?;
        Ok(result)
    }
}

impl TikTokLoginResponse {
    pub fn as_result(self) -> Result<LoginResponse, GameError> {
        if self.err_no != 0 {
            Err(GameError::service_error("TikTok", self.err_tips).with_code(self.err_no))
        }
        else {
            Ok(LoginResponse { open_id: self.data.openid, union_id: self.data.unionid, session_key: self.data.session_key })
        }
    }
}