mailchimp oauth2 w ASP.NET nadal zwraca invalid_grant

Osiągnąłem swój limit frustracji na tym, więc obnażyłem się ze mną w tym pytaniu :)

Pracuję nad nową aplikacją, która oferuje integrację z MailChimp. Zasadniczo umożliwia użytkownikom łatwe eksportowanie informacji o kontaktach z klientami bezpośrednio na konto MailChimp (to znaczy do określonej listy mailingowej wewnątrz MailChimp). Wszystko to działa i jest nieco nieistotne dla mojego pytania.

Aby nie prosić użytkownika o wprowadzenie poświadczeń MailChimp za każdym razem, zamierzam zaimplementować przepływ pracy oauth2 zgodnie z opisem poniżej:http://apidocs.mailchimp.com/oauth2/

Działa to dobrze w kroku 1-3, ale krok 4 mnie zabija .. Po raz pierwszy pracuję z oauth, ale wydaje mi się, że rozumiem podstawy.

Oto mój problem:

Kiedy wykonuję połączenie POST dohttps://login.mailchimp.com/oauth2/token -URI, aby uzyskać ostatni token dostępu, otrzymuję błąd w wyniku JSON:„invalid_grant”

Sprawdziłem strumienie żądań i odpowiedzi, czy mój adres URL został poprawnie skompilowany.

Oto mój kod w kontrolerze:

(GrantEcoAccess służy tylko do przyznania dostępu do innej aplikacji - reszta powinna być samodzielna)

public class HomeController : ApplicationController
{

    private readonly string authorize_uri = "https://login.mailchimp.com/oauth2/authorize";
    private readonly string access_token_uri = "https://login.mailchimp.com/oauth2/token";
    private readonly string mailchimp_clientid2 = "xxx";

    private readonly string mailchimp_secret2 = "xxx

    ...

    public ActionResult GrantEcoAccess()
    {

        //if exist: use saved token
        var user = (Mailchimp_users)Session["user"];
        if (!string.IsNullOrWhiteSpace(user.EcoToken))
            return RedirectToAction("GrantMailChimpAccess");

        // if !
        var url = "https://secure.e-conomic.com/secure/api1/requestaccess.aspx?role=superuser&appId=MailChimp&redirectUrl=http://localhost:18017/Home/IncomingToken";
        Redirect(url).ExecuteResult(ControllerContext);
        return null;
    }


    public ActionResult IncomingToken(string token)
    {
        var user = (Mailchimp_users)Session["user"];
        user.EcoToken = token;
        EcoSession.DataSession.Refresh(System.Data.Objects.RefreshMode.ClientWins, user);
        EcoSession.DataSession.SaveChanges();

        return RedirectToAction("GrantMailChimpAccess");
    }

    public ActionResult GrantMailChimpAccess()
    {

        //if exist: use saved token
        var user = (Mailchimp_users)Session["user"];
        if (!string.IsNullOrWhiteSpace(user.MailChimpToken))
            return RedirectToAction("Index", "Subscribe");



        //if !
        var url = string.Format("{0}?response_type=code&client_id={1}&redirect_uri=", authorize_uri, mailchimp_clientid2, "http://127.0.0.1:18017/Home/IncomingMailChimpToken");
        Redirect(url).ExecuteResult(ControllerContext);
        return null;
    }

    public ActionResult IncomingMailChimpToken(string code)
    {


        var url = "https://login.mailchimp.com/oauth2/token?grant_type=authorization_code&client_id=XX&client_secret=XX&code=" + code + "&redirect_uri=http://127.0.0.1:18017/Home/AuthComplete";
        //var url = string.Format("?grant_type=authorization_code&client_id={0}&client_secret={1}&code={2}&redirect_uri={3}", mailchimp_clientid, mailchimp_secret, code, Url.Action("AuthComplete"));


        Response.Clear();

        StringBuilder sb = new StringBuilder();
        sb.Append("<html>");
        sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
        sb.AppendFormat("<form name='form' action='{0}' method='post'>", access_token_uri);

        sb.Append("<input type='hidden' name='grant_type' value='authorization_code'>");
        sb.AppendFormat("<input type='hidden' name='client_id' value='{0}'>", mailchimp_clientid2);
        sb.AppendFormat("<input type='hidden' name='client_secret' value='{0}'>", mailchimp_secret2);
        sb.AppendFormat("<input type='hidden' name='code' value='{0}'>", code);
        sb.AppendFormat("<input type='hidden' name='redirect_uri' value='{0}'>", "http://127.0.0.1:18017/Home/AuthComplete");
        // Other params go here

        sb.Append("</form>");
        sb.Append("</body>");
        sb.Append("</html>");

        Response.Write(sb.ToString());
        Response.End();

        return null;

    }

    public ActionResult AuthComplete(string access_token, string expires_in, string scope)
    {
        if (string.IsNullOrWhiteSpace(access_token))
            throw new Exception("Could not authorize user with MailChimp");

        var user = (Mailchimp_users)Session["user"];
        user.MailChimpToken = access_token;
        EcoSession.DataSession.Refresh(System.Data.Objects.RefreshMode.ClientWins, user);
        EcoSession.DataSession.SaveChanges();


        return RedirectToAction("Index", "Subscribe");
    }

}

Czy ktoś może mi z tym pomóc? :)

Z góry dziękuję!!

EDYCJA: to krok 4 mnie zabija - nie krok 5;)

questionAnswers(3)

yourAnswerToTheQuestion