Crate open_wechat

Source
Expand description

§open-wechat

WeChat

A rust sdk for wechat miniprogram open api

§Usage

§Get access token

use open_wechat::{
    client::Client,
    credential::{GenericAccessToken, GetAccessToken}
};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let app_id = "your app id";
    let app_secret = "your app secret";

    let client = Client::new(app_id, app_secret);

    let access_token = GenericAccessToken::new(client.clone()).await?;

    Ok(())
}

§Get stable access token

use open_wechat::{
    client::Client,
    credential::{GenericAccessToken, GetStableAccessToken}
};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let app_id = "your app id";
    let app_secret = "your app secret";

    let client = Client::new(app_id, app_secret);

    let stable_access_token = GenericAccessToken::new(client.clone(), None).await?;

    Ok(())
}

§Code to session

use axum::{extract::State, response::IntoResponse, Json};
use open_wechat::{client::Client, Result};
use serde::Deserialize;

#[derive(Deserialize, Default)]
#[serde(default)]
pub(crate) struct Logger {
    code: String,
}

pub(crate) async fn login(
    State(client): State<Client>,
    Json(logger): Json<Logger>,
) -> Result<impl IntoResponse> {
    let credential = client.login(&logger.code).await?;

    Ok(())
}

§Decrypt data

use axum::{extract::State, response::IntoResponse, Json};
use open_wechat::{client::Client, Result};
use serde::Deserialize;

#[derive(Deserialize, Default)]
pub(crate) struct EncryptedPayload {
    code: String,
    encrypted_data: String,
    iv: String,
}

pub(crate) async fn decrypt(
    State(client): State<Client>,
    Json(payload): Json<EncryptedPayload>,
) -> Result<impl IntoResponse> {
    let credential = client.login(&payload.code).await?;

    let user = credential.decrypt(&payload.encrypted_data, &payload.iv)?;

    Ok(())
}

§Check session key

use axum::{extract::State, response::IntoResponse, Json};
use open_wechat::{client::Client, credential::{GenericAccessToken, CheckSessionKey}, Result};
use serde::Deserialize;
use serde_json::json;

#[derive(Debug, Deserialize, Default)]
#[serde(default)]
pub(crate) struct SessionKeyChecker {
    session_key: String,
    open_id: String,
}

pub(crate) async fn check_session_key(
    State(access_token): State<GenericAccessToken>,
    Json(checker): Json<SessionKeyChecker>,
) -> Result<impl IntoResponse> {
    access_token
        .check_session_key(&checker.session_key, &checker.open_id)
        .await?;

    Ok(Json(json!({
        "session_key": checker.session_key,
        "open_id": checker.open_id,
        "message": "session key is valid",
    })))
}

§Reset session key

use axum::{extract::State, response::IntoResponse, Json};
use open_wechat::{client::Client, credential::{GenericAccessToken, ResetSessionKey}, Result};
use serde::Deserialize;
use serde_json::json;

#[derive(Debug, Deserialize, Default)]
#[serde(default)]
pub(crate) struct SessionKeyResetter {
    session_key: String,
    open_id: String,
}

pub(crate) async fn reset_session_key(
    State(access_token): State<GenericAccessToken>,
    Json(resetter): Json<SessionKeyResetter>,
) -> Result<impl IntoResponse> {
    let credential = access_token
        .reset_session_key(&resetter.session_key, &resetter.open_id)
        .await?;

    Ok(Json(json!({
        "message": "session key is reset",
        "credential": credential,
    })))
}

Modules§

Type Aliases§