рд╡рдлрд╛рджрд╛рд░реА рдХрд╛рд░реНрдбред ASP.NET рдореЗрдВ рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП Google рдкреЗ рдПрдкреАрдЖрдИ

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




рдПрдХ рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдПрдХ рдмрдбрд╝реЗ рдЦреБрджрд░рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рд╕реЗрд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓реЙрдпрд▓реНрдЯреА рдХрд╛рд░реНрдб рдХреЛ Apple рд╡реЙрд▓реЗрдЯ рдФрд░ Google рдкреЗ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдерд╛ред рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ Apple рд╡реЙрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░рдиреА рдереА рдХреНрдпреЛрдВрдХрд┐ рдПрдХреАрдХрд░рдг рдкрд░рдд рдХрд╛рдлреА рдмрд╣реБрдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реИ, рддреЛ Google рдкреЗ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдпрд╛рд╕ рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рд╕рд╣реА рдЙрдкрдХрд░рдг рдЦреЛрдЬрдиреЗ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдорд╛рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рдмрд╛рдХреА рдХрд╛рдо Apple Wallet рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рд╣реБрдЖ, рдореИрдВрдиреЗ рдПрдХ рджрд┐рди рдмрд┐рддрд╛рдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд▓реЗрдЦ рд▓рд┐рдЦреЗред

1. рдордЯреЗрд░рд┐рдпрд▓


рд╡рдлрд╛рджрд╛рд░реА рдХрд╛рд░реНрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджреЛ рд╕рдВрд╕реНрдерд╛рдУрдВ - рд▓реЙрдпрд▓реНрдЯреА рдХреНрд▓рд╛рд╕ рдФрд░ рд▓реЙрдпрд▓реНрдЯреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  • рд╡рдлрд╛рджрд╛рд░реА рд╡рд░реНрдЧ рд╕рднреА рд╡рдлрд╛рджрд╛рд░реА рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рднреА рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдлрд╝реЙрдиреНрдЯ рд░рдВрдЧ, рдЖрдЗрдХрди рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ, рдкреГрд╖реНрдарднреВрдорд┐, рдкрд╛рда рдХреНрд╖реЗрддреНрд░, рдЖрджрд┐, рдПрдХ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд▓реЙрдпрд▓реНрдЯреАрдХреНрд▓рд╛рд╕
  • рд▓реЙрдпрд▓реНрдЯреА рдСрдмреНрдЬреЗрдХреНрдЯ - рд▓реЙрдпрд▓реНрдЯреАрдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред рдЗрд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХрд╛рд░реНрдб рдХреЗ рдбреЗрдЯрд╛ - рдХрд╛рд░реНрдб рдирдВрдмрд░, рдирд╛рдо, рдЕрддрд┐рд░рд┐рдХреНрдд рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣рд╛рдБ рд╡рд░реНрдгрди: рд▓реЙрдпрд▓реНрдЯреАрдУрдмрдЬреЗрдХреНрдЯ

рдХрд╛рд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рд░реВрдк рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
www.android.com/payapp/savetoandroidpay / {JWT} , рдЬрд╣рд╛рдВ JWT рдПрдХ рдЯреЛрдХрди рд╣реИ рдЬреЛ LSONtyClass рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде JSON рд░рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ URL рдХреА рд▓рдВрдмрд╛рдИ рдХреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХрдИ рд╡рд░реНрдг рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ Loyalty Class рдмрдирд╛рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рд╢реИрд▓рд┐рдпреЛрдВ, рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ POST рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, Google рд╕реЗрд╡рд╛рдПрдВ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддреА рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИред


2. рдЙрдкрдХрд░рдг рдФрд░ рдкреНрд░рд▓реЗрдЦрди


рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП Google рдкреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛, рдкреАрдПрдЪрдкреА рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдереЗ, рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдЧреНрд░рд╛рд╣рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ" рдХреА рдЬреЛрд░рджрд╛рд░ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдереАред


рдЗрд╕ рд╕рд▓рд╛рд╣ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЦрд╝реБрд╢реА рдЦрд╝реБрд╢реА рдирдЧреЗрдЯ рдЪрд▓рд╛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди Google рдкреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рдереАред рдЧреНрд▓реЛрд░реА рдЯреВ рдмреНрд░рд┐рди, Google рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП "google pay for pass dotnet" рдиреЗ Google рдкреЗ рдПрдкреАрдЖрдИ рдХреЛ рдкрд╛рд╕ рдпреВрдЯрд┐рд▓рд┐рдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рд▓реМрдЯрд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдореБрдЭреЗ рд╡рд╣ рдорд┐рд▓рд╛, рдЬреЛ рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ .net рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдерд╛ред рдПрдХ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдЬреЛ Google рдкреЗ API рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИ - рдкрд╛рд╕рд░реНрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП Google рдкреЗ API ред


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Google.Apis.Walletobjects.v1.1.9.2.00.nuspec рдлрд╝рд╛рдЗрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдирдЧреЗрдЯ рдкреИрдХреЗрдЬ рдХреА рддреИрдирд╛рддреА рдЕрднреА рднреА Google рдЯреАрдо рдХреА рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдереАред рдкреНрд░рд▓реЗрдЦрди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдХреБрдЫ рднреА рдареЛрд╕ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдФрд░ рдХреБрдЫ рд▓рд┐рдВрдХ рдЬреЛ рдЧреИрд░-рдореМрдЬреВрдж рдкреГрд╖реНрдареЛрдВ рдкрд░ рднреЗрдЬреЗ рдЧрдП рд╡рд┐рд╡рд░рдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдереЗред

3. рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП Google рдкреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдПрдХ Google рд╡реНрдпрд╛рдкрд╛рд░реА рдЦрд╛рддрд╛ рд░рдЦреЗрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдпрд╣рд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  2. рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдмрдирд╛рдПрдБ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╡рд╛рд▓реА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ - рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ json рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдИрдореЗрд▓, рдирд┐рдЬреА рдХреБрдВрдЬреА, рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  3. Google Merchant Center рдкрд░ рд▓рд┐рдВрдХ рдорд░реНрдЪреЗрдВрдЯ рдЦрд╛рддрд╛ рдФрд░ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк Google.Apis.Auth.OAuth2 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

private await Task<string> GetOAuthToken() {         string serviceAccountFile = string.Empty;         serviceAccountFile = ConfigurationManager.AppSettings["GooglePayServiceAccountConfigPath"];        /*              Credential, GoogleCredential              Service Account,   ,      scopes API,             */         var credential = GoogleCredential.FromFile(serviceAccountFile)                            .CreateScoped(WalletobjectsService.Scope.WalletObjectIssuer);        /*        Access token        ,   GetAccessTokenForRequestAsync         ,               */         var token = async credential.UnderlyingCredential.GetAccessTokenForRequestAsync();         return token; } 

4. рдПрдХ рдирдХреНрд╢рд╛ рдмрдирд╛рдПрдБ


рдПрдХ рд╡рдлрд╛рджрд╛рд░реА рдХрд╛рд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдПрдХ рд╡рдлрд╛рджрд╛рд░реА рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред Loyalty Class рдХреЛ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдФрд░ Google Merchant Center рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕ рдирд╛рдо рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╛рдо Google рдкреЗ рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

 public GooglePayApiService() { // ,    Merchant Account IssuerId = ConfigurationManager.AppSettings["GooglePayIssuerId"]; _wobService = new WalletobjectsService(); } private async Task<LoyaltyObject> ConvertLoyaltyObjectFromTemplate(GooglePayPassTemplate template) { string id = $"{IssuerId}.{template.SerialNumber}"; string loyaltyClassName = ConfigurationManager.AppSettings["GooglePayStoreCardClassName"];     var loyaltyClass = await GetLoyaltyClass(loyaltyClassName); var result =  new LoyaltyObject { Id = id, AccountName = template.AccountName,          Barcode = new Barcode          {          AlternateText = template.BarcodeText,               Value = template.SerialNumber,               Type = "pdf417"          },          Kind = "walletObject#loyaltyObject",          ClassId = loyaltyClass.Id,          ClassReference = loyaltyClass,          State = "active"     };     return result; } private async Task<LoyaltyObject> CreateLoyaltyObject(LoyaltyObject loyaltyObject) { var saveRequest = _wobService.Loyaltyobject.Insert(loyaltyObject); saveRequest.OauthToken = await GetOAuthToken(); var savedObject = await saveRequest.ExecuteAsync(); return savedObject; } 

GooglePayPassTemplate рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдбреАрдЯреАрдУ рд╣реИ рдЬреЛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирдЪрд┐рддреНрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдХрд╕рд┐рдд рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред

5. рдореИрдк рдЕрдкрдбреЗрдЯ


рдпрд╣рд╛рдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдмрдирд╛рддреЗ рд╕рдордп рд╕рдорд╛рди рд╣реИ: рд╣рдо рдПрдХ рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП LoyaltyObject рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 private async Task<LoyaltyObject> UpdateLoyaltyObject(LoyaltyObject loyaltyObject) { var updateRequest = _wobService.Loyaltyobject.Update(loyaltyObject, loyaltyObject.Id);           updateRequest.OauthToken = await GetOAuthToken(); var savedObject = await updateRequest.ExecuteAsync(); return savedObject; } 

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



6. JWT рдкреАрдврд╝реА


рдХрд╛рд░реНрдб рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ www.android.com/payapp/savetoandroidpay / {JWF} рд▓рд┐рдВрдХ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдЯреЛрдХрди рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


RSA-SHA256 рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 public static class JwtHelper { public static string CreateJwtForLoyaltyObject(LoyaltyObject loyaltyObject) { /*       credential   ,         */ ServiceAccountCredential credential; var now = DateTime.UtcNow; DateTime unixEpoch = new DateTime(1970, 01, 01); // 1970-01-01 00:00:00 UTC var secondsSinceEpoch = (int)Math.Round((now - unixEpoch).TotalSeconds); string serviceAccountFile = serviceAccountFile = ConfigurationManager.AppSettings["GooglePayServiceAccountConfigPath"]; using (var fs = new FileStream(serviceAccountFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { credential = ServiceAccountCredential.FromServiceAccountData(fs); } /*    JwtPayload,     payload-a  JWT */ var jwtPayload = new JwtPayload { iat = secondsSinceEpoch, iss = credential.Id, payload = new JwtInternalPayload { loyaltyObjects = new[] { new LoyaltyObjectPayload { id = loyaltyObject.Id } } } }; string header = @"{""alg"":""RS256"",""typ"":""JWT""}"; string payload = JsonConverter.SerializeObject(jwtPayload); string base64Header = EscapedBase64(Convert.ToBase64String(Encoding.UTF8.GetBytes(header))); string base64Payload = EscapedBase64(Convert.ToBase64String(Encoding.UTF8.GetBytes(payload))); //        Signature string signature = EscapedBase64(credential.CreateSignature( Encoding.UTF8.GetBytes($"{base64Header}.{base64Payload}") )); var token = $"{base64Header}.{base64Payload}.{signature}"; return token; } private static string EscapedBase64(string base64) { return base64.Replace('+', '-') .Replace('/', '_') .Replace("=", ""); } } 

рдирд┐рд╖реНрдХрд░реНрд╖


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

рдпрджрд┐ UFO рдПрд╣рд╕рд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЕрд▓рдЧ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ Apple рд╡реЙрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ), рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдореЗрдВ Google рдкреЗ рдХреЗ рд╕рд╛рде Apple рд╡реЙрд▓реЗрдЯ рдорд┐рддреНрд░ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдФрд░ рджрд░реНрдж рдорд╣рд╕реВрд╕ рди рдХрд░реЗрдВред


рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ


Source: https://habr.com/ru/post/hi434486/


All Articles