首页 > 解决方案 > 如何在wix api网站上的ruby on rails应用程序上的api调用帖子中获取身份验证代码?

问题描述

我正在尝试为wix应用程序开发仪表板网站,我需要将网站连接到wix应用程序。

我有一个 api(post)调用的问题。我必须填写一些信息,包括我不知道在哪里找到的身份验证代码。

这是一张图片来说明这个过程:

在此处输入图像描述

我真的不知道什么是wix应用标记安装,但是对于授权请求,我这样做了

    $url_oauth = "https://www.wix.com/oauth/access"
    response = RestClient::Request.execute(url: $url_oauth, method: :post, body:{grant_type: "authorization_code",client_id:"APP_ID", client_secret:"Secret_key", code:"{Can not find what is this value}"})
    @data = JSON.parse(response)
    render json: response

这是文档:

在此处输入图像描述

你能帮助如何以及在哪里找到这个 Auth 代码吗?

标签: rubyruby-on-rails-5velo

解决方案


您将需要创建一个接受来自 WIX 的 Webhook 的中间 Web 服务。我将向您展示 C# ASP.Net Core 的示例。
第 1 步:
我们正在等待来自 WIX 的令牌,如果收到,我们会进行重定向。

private const string AppID = "";
private const string ApiKey = "";
private const string UrlAccess = "https://www.wix.com/oauth/access";
            
HttpGet("WaitToken")]
public ActionResult GetToken([FromQuery] string token = "")
{
    try
    {
        if (string.IsNullOrWhiteSpace(token))
        {
            string message = "Your message";
            ModelState.AddModelError("TokenNotCorrect", message);
            return BadRequest(ModelState);
        }

        string paramUrl = @"https://your web service/OAuth/api/check/WaitAuthCode";
        string urlRedirect = $@"https://www.wix.com/installer/install?token={token}&appId={AppID}&redirectUrl={paramUrl}";
        return RedirectPermanent(urlRedirect);
    }
    catch (WebException ex)
    {
        ModelState.AddModelError("GetTokenException", ex.Message);
        return BadRequest(ModelState);
    }
}

第 2 步:
我们正在等待收到验证码,前提是用户已确认安装应用程序。

[HttpGet("WaitAuthCode")]
public async Task<ActionResult> GetAuthCodeAsync([FromQuery] string code = "", string state = "", string instanceId = "")
{
    try
    {
        if (string.IsNullOrWhiteSpace(code))
        {
            string message = "your message";
            ModelState.AddModelError("AuthCodeNotCorrect", message);
            return BadRequest(ModelState);
        }

        var token = new Token(code);
        if (!GetAccessToken(ref token))
            return BadRequest("your message RefreshToken");

        var tokenBase = new TokenBase
        {
            AppID = instanceId,
            Token = token.RefreshToken
        };

        db.Tokens.Add(tokenBase);
        if(await db.SaveChangesAsync() == 0)
            return BadRequest("your message");

        string urlRedirect = $"https://www.wix.com/installer/token-received?access_token={token.AccessToken}";
        return RedirectPermanent(urlRedirect);
    }
    catch (WebException ex)
    {
        ModelState.AddModelError("GetAuthCodeException", ex.Message);
        return BadRequest(ModelState);
    }
}

AuthCode 有效期为 10 分钟,我们发送请求以接收 Refresh Token。这个令牌必须放在家里,因为将来需要它来获取访问令牌。

private bool GetAccessToken(ref Token token)
{
    try
    {
        string json = JsonConvert.SerializeObject(token, Formatting.Indented);

        var client = new RestClient(UrlAccess);
        var request = new RestRequest();
        request.Method = Method.POST;
        request.AddHeader("Content-Type", "application/json");
        request.AddParameter(string.Empty, json, "application/json", ParameterType.RequestBody);

        var response = client.Post(request);
        if (response == null)
            return false;
            
        token = JsonConvert.DeserializeObject<Token>(response.Content);

        if (string.IsNullOrWhiteSpace(token.RefreshToken))
            return false;
            
        return !string.IsNullOrWhiteSpace(token.AccessToken);
    }
    catch (Exception ex)
    {
        return false;
    }
}

从客户端应用程序获取访问令牌:

[HttpGet("WaitAccessToken")]
public async Task<ActionResult<string>> GetAccessToken([FromQuery] string instance = "", string apiKey = "")
{
    string message;

    var tokenBase = await db.Tokens.FirstOrDefaultAsync(x => x.AppID == instance);
    if (tokenBase == null)
    {
        message = "Your message";
        ModelState.AddModelError("AppIdNotFound", message);
        return NotFound(ModelState);
    }

    var token = new Token
    {
        GrantType = "refresh_token",
        RefreshToken = tokenBase.Token
    };

    if (!GetAccessToken(ref token))
    {
        message = $"Your message";
        ModelState.AddModelError("NotCorrectAccessToken", message);
        return BadRequest(ModelState);
    }

    return new ObjectResult(token.AccessToken);
}

模型令牌:

public class Token
{
    public Token() { }

    public Token(string code) { Code = code; }

    [JsonProperty("grant_type")]
    public string GrantType { get; set; } = "authorization_code";

    [JsonProperty("client_id")]
    public string ClientID { get; set; } = "";
    
    [JsonProperty("client_secret")]
    public string ClientSecret { get; set; } = "";
    
    [JsonProperty("code")]
    public string Code { get; set; }

    [JsonProperty("refresh_token", NullValueHandling = NullValueHandling.Ignore)]
    public string RefreshToken { get; set; }

    [JsonProperty("access_token", NullValueHandling = NullValueHandling.Ignore)]
    public string AccessToken { get; set; }
}

模型实例:

public class Instance
{

    [JsonProperty("instanceId")]
    public string InstanceId { get; set; }

    [JsonProperty("appDefId")]
    public string AppDefId { get; set; }

    [JsonProperty("signDate")]
    public DateTime SignDate { get; set; }

    [JsonProperty("uid")]
    public string Uid { get; set; }

    [JsonProperty("permissions")]
    public string Permissions { get; set; }

    [JsonProperty("demoMode")]
    public bool DemoMode { get; set; }

    [JsonProperty("siteOwnerId")]
    public string SiteOwnerId { get; set; }

    [JsonProperty("siteMemberId")]
    public string SiteMemberId { get; set; }

    [JsonProperty("expirationDate")]
    public DateTime ExpirationDate { get; set; }

    [JsonProperty("loginAccountId")]
    public string LoginAccountId { get; set; }
}

不要忘记要获得访问令牌,您需要安装它的站点上的应用程序 ID。

[HttpGet("WixInfo")]
public ActionResult GetWixInfo([FromQuery] string instance = "")
{
    try
    {
        string message;
        var base64 = instance.Split(".");
        if (base64.Length != 2)
        {
            message = "Your message";
            ModelState.AddModelError("InstanceNotCorrect", message);
            return BadRequest(ModelState);
        }

        var base64EncodedBytes = Convert.FromBase64String(base64[1]);
        string json = Encoding.Default.GetString(base64EncodedBytes);
        var info = JsonConvert.DeserializeObject<Instance>(json);

        message = $"Your message.AppID: {info.InstanceId}";
        return Ok(message);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("GetWixInfoException", ex.Message);
        return BadRequest(ModelState);
    }
}

当用户启动 WIX 应用程序时,您可以获得正在运行的应用程序的 ID。


推荐阅读