C#-Скрипт Автоматического Приёма Платежей На Сайте Asp.net

Опубликованно: 04/06/2010 |Комментарии: 0 | Показы: 522 |

С вами опять Александр Гудок и сайт http://skillcoding.com!

В данной статье я предоставлю такой долгожданный код реализации автоматического приема денежных средств на ASP.NET сайте.

Здесь я не буду приводить полного описания механизма подключения интернет-магазина к системе Web Money Merchant (для этого вы можете загрузить специальный видеоролик в моей рассылке на сайте http://skillcoding.com), а лишь остановлюсь на ключевых моментах, касающихся непосредственного перевода средств и последующей обработкой результатов транзакции.

Для осуществления приема оплаты на вашем сайте любого товара необходимо четко представлять от кого вы будете принимать оплату, за какой товар и каким образом будете доставлять покупку покупателю. Также не лишним будет задуматься над способом уведомления вас о результатах выполнения транзакции перевода средств и необходимости доставки товара клиенту.

Отсюда вытекают следующие задачи:

1.       Позволить  покупателю выбрать товар на сайте;
2.       Запросить контактные данные покупателя непосредственно перед переводом средств;
3.       Осуществить онлайн-транзакцию перевода средств – выполнить продажу товара.

1- и 2-й пункты довольно просты в реализации. Для этого необходимо просто создать специальную разметку на странице .aspx:

<form id="mainForm" runat="server">

<asp:Panel runat="server" ID="firstPanel" Visible="true">

      <asp:TextBox ID="TextBoxName" runat="server"></asp:TextBox>

      <asp:TextBox ID="TextBoxPhone" runat="server"></asp:TextBox>

      <asp:Button ID="ButtonNextStep" runat="server" Text="Продолжить"

                    onclick="ButtonNextStep_Click" />

</asp:Panel>

 

 <asp:Panel ID="secondPanel" runat="server" Visible="false">

<asp:HiddenField ID="LMI_PAYEE_PURSE" runat="server"
Value="<%$ AppSettings:LMI_PAYEE_PURSE %>" />

<asp:HiddenField ID="LMI_PAYMENT_AMOUNT" runat="server"
Value="<%$ AppSettings:LMI_PAYMENT_AMOUNT %>" />

<asp:HiddenField ID="LMI_PAYMENT_DESC" runat="server"
Value="<%$ AppSettings:LMI_PAYMENT_DESC %>" />

<asp:HiddenField ID="LMI_SIM_MODE" Visible="false" runat="server"
Value="<%$ AppSettings:LMI_SIM_MODE %>" />

           

<asp:HiddenField ID="HiddenFieldNAME" runat="server" />

     <asp:HiddenField ID="HiddenFieldPHONE" runat="server" />

 

      <asp:Button ID="GoToMerchant" runat="server"
            Text="Начать транзакцию WebMoney"

            PostBackUrl="https://merchant.webmoney.ru/lmi/payment.asp" />

</asp:Panel>

</form>

 

Пояснения.

На форме страницы имеется две панели ID="firstPanel" и ID="secondPanel". Изначально, при загрузке страницы отображается первая из них, вторая имеет свойство Visible="false".

Первая панель ID="firstPanel" содержит два текстовых поля для получения от покупателя его имени и номера телефона для последующего связывания с ним.

Также имеется кнопка ID="ButtonNextStep", по нажатии на которой вызывается обработчик события ButtonNextStep_Click.

Код обработчика ButtonNextStep_Click:

protected void ButtonNextStep_Click(object sender, EventArgs e)

{

      Panel1.Visible = false;

      Panel2.Visible = true;

      LabelName.Text = HiddenFieldNAME.Value = TextBoxName.Text;

      LabelPhone.Text = HiddenFieldPHONE.Value = TextBoxPhone.Text;

}

Здесь, скрывается первая панель и отображается вторая панель, на которой пользователь в обычных лейблах наблюдает данные, введенные им на предыдущем шаге. Это сделано для того, что бы он лишний раз перепроверил свои данные перед совершением транзакции. Также, в этом методе устанавливаются значения дополнительных скрытых полей имени покупателя и его номера телефона, которые будут отправлены в мерчант.

Вторая форма содержит всего 6 скрытых полей (вместе с двумя дополнительными, определенными нами). Первые 4 из которых - стандартные и представляют для мерчанта служебную информацию, показывающую ему номер вашего кошелька для перевода на него средств, сумму перевода, описание товара (отображаемое название товара на странице мерчанта) и режим работы мерчанта (2 означает рабочий режим, также возможен и тестовый режим). 

Первые 4 скрытых поля автоматически заполняются данными из web.config:

<appSettings>

      <!-- Параметры для WebMoney -->

      <!--номер кошелька для приёма средств-->

      <add key="LMI_PAYEE_PURSE" value="R274925115943"/>
     
      <!-сумма перевода-->

      <add key="LMI_PAYMENT_AMOUNT" value="30000.00"/>"/>

      <!—описание товара-->

      <add key="LMI_PAYMENT_DESC" value="Мой товар"/>

      <!—2 – рабочий режим -->

      <add key="LMI_SIM_MODE" value="2"/>

     

      <!--ключ для формирования контрольной подписи-->          

      <add key="SECRETIAL_STRONG_KEY"                      value="ladsjdfkljsao34589jket238wsw9lkd23f"/>

      <!-- /Параметры WebMoney -->                  

</appSettings>

Теперь все готово для начала отправки запроса на выполнение транзакции перевода средств.

Но, для фиксации оплаты, с целью дополнительной проверки валидности транзакции, необходимо в самом конце выполнения транзакции в мерчант отправить ответ для подтверждения/отклонения оплаты.

Зачем это? Это сделано для того, что если кто то попытается подменить сумму платежа, номер целевого кошелька, или предоставить другую лживую информацию для мерчанта, мы проверим эти данные и решим стоит ли принять покупку, или отклонить её.

Итак, какова схема этого.

Мы уже определились, что происходит по шагам:

1.  Пользователь загружает в браузер вашу страницу;

2.  Получив её, он заполняет текстовые поля имени и номера телефона;

3.  Нажимает на кнопку ButtonNextStep;

4.  Страница перезагружается и пользователь наблюдает на форме только что введенную собственную информацию. Также в скрытых полях уже находится служебная и пользовательская информация;

5.  Пользователь нажимает на кнопке GoToMerchant.

С этого момента пользователь попадает на страницу https://merchant.webmoney.ru/lmi/payment.asp.

Причем, на ту страницу также улетели данные из скрытых полей. Именно эти данные и будут играть ключевую роль на странице https://merchant.webmoney.ru/lmi/payment.asp для перевода средств на ваш кошелек.

Но представьте, что между 4- и 5-м пунктами, пользователь изменил служебную информацию в скрытых полях?! К примеру, выставил значение суммы перевода в 0 условных единиц. Нажал на кнопку и успешно произвел покупку вашего товара за 0 долларов!!!

Что бы не позволить выполнять подобного рода махинации, сервис мерчанта перед зачисленим средств на ваш кошелёк подаст на ваш сайт последний запрос с данными транзакции для получения от вас ответа вроде «Да/НЕТ», мол транзакцию проводить, или нет.

В данном запросе мерчант посылает к нам некоторую служебную информацию (в том числе номер кошелька, сумму перевода, описание товара и т.д.). Мы проверяем єти данные и если они совпадают с начальными, то делаем вывод, что пользователь не пытался подменить информацию и ему можно позволить завершить транзакцию.

Вообще то мерчант дважды посылает запрос на ваш сайт. Первый раз он это делает перед началом проведения транзакции, а второй раз после транзакции.

Первый раз необходим для мерчанта при принятии решения о допустимости начинать транзакцию. Второй раз – для нас. Транзакция выполнена, средства переведены, но мерчант отправляет нам множественную служебную информацию, что бы мы уже сами решили что с ней делать и отправлять ли товар покупателю и т.д.

Итак, для обработки этих двух запросов воспользуемся обычным веб-хендлером .ashx:

<%@ WebHandler Language="C#" class="Handler" %>

using System;

using System.IO;

using System.Web;
using System.Web.SessionState;
using System.Collections.Generic;
using System.Configuration;
using System.Security.Cryptography;
using System.Text;

public class Handler : IHttpHandler

{

     public void ProcessRequest (HttpContext context)

     {

            //БЛОК ОБРАБОТКИ ФОРМЫ ПРЕДВАРИТЕЛЬНОГО ЗАПРОСА И ОТДАЧИ //ОТВЕТА О ДАЛЬНЕЙШЕМ ВЫПОЛНЕНИИ ПЛАТЕЖА

        string LMI_PREREQUEST = context.Request.Form["LMI_PREREQUEST"];

       
        //Если это форма предварительного запроса

        if ("1" == LMI_PREREQUEST)

        {

            context.Response.ContentType = "text/plain";

            //Если произошла подмена суммы, или/и

            //если произошла подмена целевого кошелька

            if ((context.Request.Form["LMI_PAYMENT_AMOUNT"] !=                                ConfigurationManager.AppSettings["LMI_PAYMENT_AMOUNT"]) ||

               (context.Request.Form["LMI_PAYEE_PURSE"] !=                                    ConfigurationManager.AppSettings["LMI_PAYEE_PURSE"]))

            {

                //Отвечаем "NO"

                context.Response.Write("NO");

                return;

            }

            //Если все хорошо выводим "YES" 

            context.Response.Write("YES");

            return;

        }

        //КОНЕЦ БЛОКА ОБРАБОТКИ ФОРМЫ ПРЕДВАРИТЕЛЬНОГО ЗАПРОСА И ОТДАЧИ             //ОТВЕТА О ДАЛЬНЕЙШЕМ ВЫПОЛНЕНИИ ПЛАТЕЖА

 

        //БЛОК ОБРАБОТКИ ФОРМЫ ОПОВЕЩЕНИЯ О ВЫПОЛНЕННОМ ПЛАТЕЖЕ

        //Если это форма оповещения о выполненном платеже

        else

        {

            //БЛОК ФОРМИРОВАНИЯ ЦИФРОВОЙ ПОДПИСИ

 

            //хеш подписи, сгенерированный на мерчанте

            string LMI_HASH = context.Request.Form["LMI_HASH"];

 

            //хеш подписи, генерируемый нами из полученных параметров

            string s = context.Request.Form["LMI_PAYEE_PURSE"] +

                       context.Request.Form["LMI_PAYMENT_AMOUNT"] +

                       context.Request.Form["LMI_PAYMENT_NO"] +

                       context.Request.Form["LMI_MODE"] +

                       context.Request.Form["LMI_SYS_INVS_NO"] +

                       context.Request.Form["LMI_SYS_TRANS_NO"] +

                       context.Request.Form["LMI_SYS_TRANS_DATE"] +

                  ConfigurationManager.AppSettings["SECRETIAL_STRONG_KEY"] +

                       context.Request.Form["LMI_PAYER_PURSE"] +

                       context.Request.Form["LMI_PAYER_WM"];

           

            string hash = GetHashString(s);

            //КОНЕЦ БЛОКА ФОРМИРОВАНИЯ ЦИФРОВОЙ ПОДПИСИ        

           

            //Вытягиваем детали клиента из переданной формы

            String userNameAndPhone = context.Request.Form["HiddenFieldNAME "].ToString() + context.Request.Form["HiddenFieldNAME"].ToString();

 

             //проверяем совпадение цифровой подписи
            if (string.Compare(LMI_HASH, hash, true) != 0)

            {

                userNameAndPhone = "Товар "+ userNameAndPhone + "НЕ отправлять – попытка мошенничества!";

            }

//здесь можно отправить письмо нам с текстом, содержащим значение // из userNameAndPhone, можно записать текстовый файл с данными
//пользователя, можно занести информацию в БД и т.д.         

       }    

private static string GetHashString(string s)

{

 

     //...
     //выполняем преобразование входной строки в хеш-значение

      return resultInHASH;

}

   

public bool IsReusable

{

      get

      {

           return false;

      }

        }

}

Файл большой, но очень простой. Суть в следующем.

Если от мерчанта пришел параметр LMI_PREREQUEST равным 1, значит, это предварительный запрос. В этом случае достаточно проверить сумму перевода и целевой кошелек (то есть наш ли это кошель).

Если же пришла не 1, а другое значение, значит, перевод выполнен уже и нам осталось для себя определить последние решения относительно дальнейших наших действий. Еще раз напомню, что в этот момент оплата уже выполнена и мерчант поставил себе «плюсик» об удачно завершенной транзакции. Все, что происходит после этого, касается только нас.

Итак, к примеру, пришло значение не 1.

Вместе с ним приходит много других параметров, которые просто предоставляют информацию о проведенной транзакции (время транзакции, кошелек покупателя, номер транзакции в системе Web Money ...), а также главный параметр LMI_HASH.

Последний содержит в себе хеш-значение склеинных воедино значений по порядку:

1.  LMI_PAYEE_PURSE;

2.  LMI_PAYMENT_AMOUNT;

3.  LMI_PAYMENT_NO;

4.  LMI_MODE;

5.  LMI_SYS_INVS_NO;

6.  LMI_SYS_TRANS_NO;

7.  LMI_SYS_TRANS_DATE;

8.  WEBMONRY_SECRET_KEY;

9. LMI_PAYER_PURSE;

10. LMI_PAYER_WM.

1-7 и 9-10 параметры на мерчанте формируются по завершению транзакции и отправки в наш .ashx-хендлер. 8-й параметр хранится в настройках вашего аккаунта на мерчанте постоянно, а также в вашем web.config.

Соответственно, мы у себя также «лепим» такую же строку s из тех же параметров, но на восьмом месте подставляем ключ из web.config (понятно, что значение SECRETIAL_STRONG_KEY и его эквивалент в аккаунте мерчанта должны совпадать). 

После этого сравниваем оба значения на равенство if (string.Compare(LMI_HASH, hash, true) != 0)

И если все впорядке, то просто что-то выполняем с информацией о пользователе, если же есть несоответствия, то выполняем дополнительные действия, или вовсе что-то не выполняем. Это уже на ваше усмотрение. 

Ах да, забыл, метод GetHashString(string s) вы можете реализовать сами. Он просто принимает некоторый строковый литерал и возвращает его хеш-код, используя любой алгоритм. Главное, заранее знать каким алгоритмом будете пользоваться, ведь в аккаунте мерчанта также необходимо указать такой же алгоритм для получения хеш-подписи.

Вот и все относительно сердца онлайн оплат. Конечно, кроме кода, приведенного в данной статье, должно присутствовать еще много всего дополнительного, но это остальное призвано улучшить и оптимизировать работу того кода, что рассмотрели здесь.

За более подробной и детальной информацией относительно написания сриптов интернет-магазинов по работе с ситемами WebMoney, RBK Money, Z-Payment, PayPal и другие обращайтесь на мой сайт http://skillcoding.com в раздел ASP.NET и/или подписавшись на рассылку, где многие инструкции представлены в подробных видеоруководствах.

Автор: Александр Гудок http://www.winforms.ru

Источник статьи: http://www.rusarticles.com/kursi-statya/c-skript-avtomaticheskogo-priyoma-platezhej-na-sajte-aspnet-2542718.html

Обсудить статью

Фирма 1С - это крупнейшая российская компания, которая разрабатывает и поддерживает большое количество программ. Самые выдающиеся программы, о которых слышал каждый, это программы для бухгалтерского учета и аудита. Такие как 1С:Бухгалтерия, 1С:Предприятие...

От: MrJackl Образование> Курсыl 10/07/2013 lПоказы: 154

Чтобы организовать и запустить процесс подбора в компании, необходимо придерживаться основных принципов рекрутинга.

От: Аннаl Образование> Курсыl 20/06/2013 lПоказы: 53

Роспись мебели своими руками – об этом, наверное, мечтает не один человек, привыкший украшать свою жизнь, свое жилье, используя для этого собственный творческий потенциал.

От: компания Ортопедияl Образование> Курсыl 30/05/2013 lПоказы: 312

Данная статья написана для того что бы показать насколько нынешнее образование в Украине по уровню отличаеться от образования за рубежом. Компания которая предлагает свои услуги в сфере образования имеет 15 лет опыт на этом рынке, что всегда позитивно сказываеться на наших клиентах и полностью удовлетворяет их запрос. Мы работаем только с лучшими школами и университетами мира. Так же компания уделяет много внимания отзывам своих клиентов для того что бы сделать наши и мы частенько их публикуем.

От: Antonl Образование> Курсыl 15/05/2013 lПоказы: 63

Сегодня образование стало необходимостью для достижения больших высот в своей карьере. Существует множество стран и университетов, где иностранный студент может получить качественное образование, однако многие затрудняются в выборе места обучения. Поэтому в статье предлагается краткое описание общих черт обучения в различных странах.

От: Yanal Образование> Курсыl 23/04/2013 lПоказы: 61

В статье приведен анализ разных принципов обучения мастеров колористике. Рекомендации по выбору курсов.

От: Оксана Артюшенкоl Образование> Курсыl 11/04/2013 lПоказы: 264

Одна из возможностей получить опыт проживания в другой стране, знать ее культуру и ментальность, усовершенствовать знание языка, обзавестись новыми знакомыми и друзьями – это международные молодежные программы. К тому же эти программы дают возможность не только посмотреть мир, а и подзаработать.

От: Петрl Образование> Курсыl 31/03/2013 lПоказы: 65

В данной статье мы решили рассмотреть пошаговый процес поступления в английский университет.

От: Artur Zangievl Образование> Курсыl 20/02/2013 lПоказы: 87
Блок автора
Категории статей
Quantcast