Stripe-dotnet: рдкреНрд░рд╢реНрди: рд╡реЗрдмрд╣реБрдХ url

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЕрдкреНрд░реИрд▓ 2017  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: stripe/stripe-dotnet

рдирдорд╕реНрддреЗ,
рдореИрдВ рд╕реНрдЯреНрд░рд╛рдЗрдк рд╕реЗ рд╡реЗрдмрд╣реБрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдпрд╛ рдФрд░ рдЙрд╕реА рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬреЛ рдЖрдкрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рд╕реНрдЯреНрд░рд╛рдЗрдк рдкрд░ рдЬрд╛рдирд╛ рд╣реИ рдФрд░

рдпреВрдЖрд░рдПрд▓ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕реНрдЯреНрд░рд╛рдЗрдкрд╣реИрдВрдбрд▓рд░.рдПрд╢рдПрдХреНрд╕ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ

рдмрд╕, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдХреГрдкрдпрд╛, рдпрджрд┐ рдЖрдк рд▓реЗрдореИрди рдХреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╡реЗрдмрд╣реБрдХ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрджрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛!

рдорд╛рдЯреЗрдУ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд░реАрдбрдореА рдПрдХ IHttpHandler рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдерд╛, рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдУрд╡рд┐рди рдорд┐рдбрд▓рд╡реЗрдпрд░/рдиреИрдиреНрд╕реАрдПрдлрдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЕрд╡рдзрд╛рд░рдгрд╛ рдПрдПрд╕рдкреАрдПрдирдЯреА рдПрдорд╡реАрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдПрдПрд╕рдкреАрдПрдирдЯреА рдПрдорд╡реАрд╕реА рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
```рд╕реА#
[рд░реВрдЯрдкреНрд░рд┐рдлрд╝рд┐рдХреНрд╕ ("/ рдХреЙрд▓рдмреИрдХ / рд╕реНрдЯреНрд░рд╛рдЗрдк)
рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рд╕реНрдЯреНрд░рд╛рдЗрдкрдХреЙрд▓рдмреИрдХрдХрдВрдЯреНрд░реЛрд▓рд░: рдХрдВрдЯреНрд░реЛрд▓рд░
{
[рдПрдЪрдЯреАрдкреАрдкреЛрд╕реНрдЯ]
[рдорд╛рд░реНрдЧ]
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ async рдХрд╛рд░реНрдп() рдЗрдВрдбреЗрдХреНрд╕ (рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рд╕реАрдЯреА)
{
var json = рдирдпрд╛ StreamReader (Request.InputStream)ред ReadToEnd ();

    var stripeEvent = StripeEventUtility.ParseEvent(json);

    switch (stripeEvent.Type)
    {
        case StripeEvents.ChargeRefunded:  // all of the types available are listed in StripeEvents
            var stripeCharge = Stripe.Mapper<StripeCharge>.MapFromJson(stripeEvent.Data.Object.ToString());
            break;
    }

    return new HttpStatusCodeResult(HttpStatusCode.OK);
}

}
```

рдЙрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рд░реВрдЯ рд╕реЗрдЯрдЕрдк рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕реНрдЯреНрд░рд╛рдЗрдк рдХреЗ рдЕрдВрдд рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдЖрд░рдПрд▓ https://yourdomain.com/callbacks/stripe

рд╕рднреА 14 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдкрдХрд╛ рд╡реЗрдмрд╣реБрдХ рдпреВрдЖрд░рдПрд▓ https://dashboard.stripe.com/account/webhooks рдкрд░ рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпреВрдЖрд░рдПрд▓ рдХрд╣рд╛рдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпреВрдЖрд░рдПрд▓ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рд╕реНрдЯреНрд░рд╛рдЗрдк рд╕реЗ рд╡реЗрдмрд╣реБрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд/рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдХреЗрд╡рд▓ NuGet рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ stripe.net рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╣реА рдореВрд▓рднреВрдд рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ (рдЧреНрд░рд╛рд╣рдХ рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рдмрдирд╛рдирд╛, рдХрд╛рд░реНрдб рдЪрд╛рд░реНрдЬ рдХрд░рдирд╛ ...), рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЖрдк рдореБрдЭреЗ рдЬреЛ рднреА рдорджрдж рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдорд╛рдЯреЗрдУ

рдпреВрдЖрд░рдПрд▓ рд╡рд╣ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ

рдЬрдм рдЖрдк рд╕реНрдЯреНрд░рд╛рдЗрдк рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡реЗрдмрд╣реБрдХ рдпреВрдЖрд░рдПрд▓ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдЯреНрд░рд╛рдЗрдк рдЙрд╕ рдкрддреЗ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЖрдк рдЙрд╕ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрди рд░рд╣рд╛ рд╣реИред

рдареАрдХ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдХрджрдо рдпрд╛рдж рдЖ рд░рд╣реЗ рд╣реИрдВ! :)
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗрдмрд╣реБрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдореБрдЭреЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдПрдХ рдпреВрдЖрд░рдПрд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛?

рд╣рд╛рдБ, рдмрд┐рд▓реНрдХреБрд▓ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреБрд░рд╛рдиреЗ (рдПрд░) рд╕реНрдХреВрд▓ ASP.Net рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдиреИрдиреНрд╕реАрдПрдлрдПрдХреНрд╕ рдореЗрдВ рдЖрдк рдХреБрдЫ рдЫрджреНрдо рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ

Post["/stripe/some/path/i/made"] = p => {/* рдпрд╣рд╛рдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг, рдкреЛрд╕реНрдЯ рдмреЙрдбреА рдЬреЗрд╕рди рдХреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрднреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ */};

рд░реАрдбрдореА рдПрдХ IHttpHandler рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдерд╛, рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдУрд╡рд┐рди рдорд┐рдбрд▓рд╡реЗрдпрд░/рдиреИрдиреНрд╕реАрдПрдлрдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЕрд╡рдзрд╛рд░рдгрд╛ рдПрдПрд╕рдкреАрдПрдирдЯреА рдПрдорд╡реАрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рдПрдПрд╕рдкреАрдПрдирдЯреА рдПрдорд╡реАрд╕реА рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
```рд╕реА#
[рд░реВрдЯрдкреНрд░рд┐рдлрд╝рд┐рдХреНрд╕ ("/ рдХреЙрд▓рдмреИрдХ / рд╕реНрдЯреНрд░рд╛рдЗрдк)
рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рд╕реНрдЯреНрд░рд╛рдЗрдкрдХреЙрд▓рдмреИрдХрдХрдВрдЯреНрд░реЛрд▓рд░: рдХрдВрдЯреНрд░реЛрд▓рд░
{
[рдПрдЪрдЯреАрдкреАрдкреЛрд╕реНрдЯ]
[рдорд╛рд░реНрдЧ]
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ async рдХрд╛рд░реНрдп() рдЗрдВрдбреЗрдХреНрд╕ (рд░рджреНрджреАрдХрд░рдг рдЯреЛрдХрди рд╕реАрдЯреА)
{
var json = рдирдпрд╛ StreamReader (Request.InputStream)ред ReadToEnd ();

    var stripeEvent = StripeEventUtility.ParseEvent(json);

    switch (stripeEvent.Type)
    {
        case StripeEvents.ChargeRefunded:  // all of the types available are listed in StripeEvents
            var stripeCharge = Stripe.Mapper<StripeCharge>.MapFromJson(stripeEvent.Data.Object.ToString());
            break;
    }

    return new HttpStatusCodeResult(HttpStatusCode.OK);
}

}
```

рдЙрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рд░реВрдЯ рд╕реЗрдЯрдЕрдк рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕реНрдЯреНрд░рд╛рдЗрдк рдХреЗ рдЕрдВрдд рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдЖрд░рдПрд▓ https://yourdomain.com/callbacks/stripe

рдорджрдж рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдореИрдВ рдЕрднреА рднреА рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕реБрд░рдВрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрд╛ рд╣реИ!
рдЖрдк рддреИрдирд╛рдд рд░рд╣реЗрдВрдЧреЗ :)

@ xt0rted рдмрд╣реБрдд рдорджрджрдЧрд╛рд░, рдзрдиреНрдпрд╡рд╛рдж! рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЯрдВрдХрдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдиреЗ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдиреАрдЪреЗ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ:

using System.Net;
using System.IO;
using Stripe;
using System.Web.Mvc;
using System.Threading;
using System.Threading.Tasks;

    namespace AwesomeApp.Controllers
{
    [RoutePrefix("/callbacks/stripe")]
    public class StripeCallbackApiController : Controller
    {
        [HttpPost]
        [Route]
        public async Task<ActionResult> Index(CancellationToken ct)
        {
            var json = new StreamReader(Request.InputStream).ReadToEnd();

            var stripeEvent = StripeEventUtility.ParseEvent(json);

            switch (stripeEvent.Type)
            {
                case StripeEvents.ChargeRefunded:  // all of the types available are listed in StripeEvents
                    var stripeCharge = Stripe.Mapper<StripeCharge>.MapFromJson(stripeEvent.Data.Object.ToString());
                    break;
            }

            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }
    }
}

рдирдорд╕реНрддреЗ ... рдореЗрд░реЗ рдкрд╛рд╕ .netframework 4.5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ asp.net рд╡реЗрдмрдлреЙрд░реНрдо рдЖрдзрд╛рд░рд┐рдд рд╕рд╛рдЗрдЯ рд╣реИ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд╕рд╛рдЗрдирдЕрдк рдХреЗ рд▓рд┐рдП рд╡рд░реНрдбрдкреНрд░реЗрд╕ рд╕рд╛рдЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ woocommerce рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рд╕рдм рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдПрд╕рдкреАрдиреЗрдЯ рдореЗрдВ рд╡реЗрдмрд╣реБрдХ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЛрддрд╛ рдмрдирд╛рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЙрдирдХреА рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХреВрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд▓реЗ рдкрд░ рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рдПрдорд╡реАрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкрд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдврд╛рдВрдЪреЗ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдорд╡реАрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡реЗрдмрдлреЙрд░реНрдо рдПрдПрд╕рдкреАрдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реНрд░реЛрддрд╛ рднреА рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ? рдореЗрд░реА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рд╣реЛрдЧреАред рдпрд╛ рдореЗрд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╣реЛрдЧреАред рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж!

@vbwyrde Webhooks рд╣рдорд╛рд░реЗ (рд╕реНрдЯреНрд░рд╛рдЗрдк) рд╕реЗ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ POST рдЕрдиреБрд░реЛрдз рд╣реИрдВред рдЖрдк рдПрдорд╡реАрд╕реА рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдЯреНрд░рд╛рдЗрдк-рдбреЙрдЯрдиреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА JSON рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдИрд╡реЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╕рдВрднрд╛рд▓ рд╕рдХреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд╕рдордп рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдирд╣реАрдВ рд╣реИред

@ рд░реЗрдореА-рдкрдЯреНрдЯреА ... рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдЕрдХреНрд╕рд░ рд╣рдордореЗрдВ рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕рд╣рд╛рдпрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрднреА рддрдХ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреНрд░рд╣рд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╕реНрдЯреНрд░рд╛рдЗрдк рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЬреЛрдВрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рд╕рдВрджрд░реНрдн рдЕрдХреНрд╕рд░ рдПрдорд╡реАрд╕реА рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдЬреЗрдПрд╕рдУрдПрди рд╕реЗ рдПрдорд╡реАрд╕реА рдкрд╣рд▓реВ рдХреЛ рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реИ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдкрдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХрдо рд╕реЗ рдХрдо рдЕрдм рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рджреЗрдЦрддрд╛ рд░рд╣реВрдБрдЧрд╛ред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рджред

рдЪреВрдВрдХрд┐ рдЖрдк рд╡реЗрдмрдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╢рд╛рдпрдж IHttpHandler рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ https://gist.github.com/jaime-fuhr/1752273 рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ JS рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдкрд╣рд▓реЗ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ stripe.net рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдХреНрд░рдорд╛рдВрдХрди рдХрд░реЗрдЧрд╛ред

рдЗрд╕реЗ рдЕрдкрдиреЗ web.config рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЖрдк рдЙрд╕ рдкрде рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬрд┐рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ /callbacks/stripe рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реИ! рдореИрдВ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛, рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

joakimsansan picture joakimsansan  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jfrueh picture jfrueh  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xqiu picture xqiu  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tgourley picture tgourley  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

varunbabu008 picture varunbabu008  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ