1: #region Namespaces
2: using System;
3: using System.Data;
4: using System.Configuration;
5: using System.Web;
6: using System.Web.Security;
7: using System.Web.UI;
8: using System.Web.UI.WebControls;
9: using System.Web.UI.WebControls.WebParts;
10: using System.Web.UI.HtmlControls;
11: using System.Text;
12: using System.Net;
13: using System.IO;
14: #endregion
15:
16:
17:
18: /// <summary>
19: /// Summary description for AuthorizeNet
20: /// </summary>
21: public static class AuthorizeNet
22: {
23: #region Private Member(s)
24: private static string UNEXPECTED_ERROR = "Unexpected error";
25: private static string AUTHORIZENET_TEST_URL = "https://test.authorize.net/gateway/transact.dll";
26: private static string AUTHORIZENET_LIVE_URL = "https://authorize.net/gateway/transact.dll";
27: #endregion
28:
29:
30: #region Transaction Type Enum(s)
31:
32: // Transaction Type
33: public enum TransactionType
34: {
35: AUTH_CAPTURE = 0,
36: AUTH_ONLY,
37: PRIOR_AUTH_CAPTURE,
38: CREDIT,
39: VOID
40: }
41:
42: // Get string for Enum
43: public static string GetSringForEnum(TransactionType TransType)
44: {
45: switch (TransType)
46: {
47: case TransactionType.AUTH_CAPTURE:
48: return "AUTH_CAPTURE";
49: break;
50: case TransactionType.AUTH_ONLY:
51: return "AUTH_ONLY";
52: break;
53: case TransactionType.PRIOR_AUTH_CAPTURE:
54: return "PRIOR_AUTH_CAPTURE";
55: break;
56: case TransactionType.CREDIT:
57: return "CREDIT";
58: break;
59: case TransactionType.VOID:
60: return "VOID";
61: break;
62: default:
63: return string.Empty;
64: break;
65: }
66: }
67:
68: #endregion
69:
70:
71: /// <summary>
72: /// Generate Rququest string
73: /// </summary>
74: /// <param name="objAuthorizeNetRequest"></param>
75: /// <returns></returns>
76: private static string GetRequestString(AuthorizeNetRequest objAuthorizeNetRequest,TransactionType TransType)
77: {
78: StringBuilder stbRequest = new StringBuilder(string.Empty);
79:
80: stbRequest.Append("x_login=");
81: stbRequest.Append(objAuthorizeNetRequest.Login);
82: stbRequest.Append("&x_type=");
83: stbRequest.Append(GetSringForEnum(TransType));
84: stbRequest.Append("&x_amount=");
85: stbRequest.Append(objAuthorizeNetRequest.Amount);
86: stbRequest.Append("&x_card_num=");
87: stbRequest.Append(objAuthorizeNetRequest.CardNumber);
88: stbRequest.Append("&x_exp_date=");
89: stbRequest.Append(objAuthorizeNetRequest.CardExpirationDate);
90: stbRequest.Append("&x_tran_key=");
91: stbRequest.Append(objAuthorizeNetRequest.TransactionKey);
92: stbRequest.Append("&x_relay_response=FALSE");
93: stbRequest.Append("&x_delim_data=TRUE");
94: stbRequest.Append("&x_delim_char=|");
95: stbRequest.Append("&x_email=chiragrdarji@yahoo.co.in");
96: // If x_test_request = FALSE, TransactionId is generated.
97: stbRequest.Append("&x_test_request=FALSE");
98:
99: // First name and Last will be displayed in Transaction report. (LastName,FirstName)
100: stbRequest.Append("&x_first_name=Chirag");
101: stbRequest.Append("&x_last_name=Darji");
102: stbRequest.Append("&x_company=XO Limited");
103:
104:
105:
106: if (TransType == TransactionType.CREDIT || TransType == TransactionType.PRIOR_AUTH_CAPTURE || TransType == TransactionType.VOID)
107: {
108: stbRequest.Append("&x_trans_id=");
109: stbRequest.Append(objAuthorizeNetRequest.TransactionId);
110: }
111:
112: return stbRequest.ToString();
113: }
114:
115:
116: /// <summary>
117: /// Authorize the merchant detail and if merchant is valid process the credit card.
118: /// </summary>
119: /// <param name="objAuthorizeNetRequest"></param>
120: /// <returns></returns>
121: public static AuthorizeNetResponse CallAuthorizeNetMethod(AuthorizeNetRequest objAuthorizeNetRequest)
122: {
123: AuthorizeNetResponse objAuthorizeNetResponse = new AuthorizeNetResponse();
124: string strRequest = GetRequestString(objAuthorizeNetRequest, objAuthorizeNetRequest.TransactionType);
125: string strResponse = string.Empty;
126:
127: WebRequest objWebRequest = WebRequest.Create(AUTHORIZENET_TEST_URL);
128: objWebRequest.Method = "POST";
129: objWebRequest.ContentLength = strRequest.Length;
130: objWebRequest.ContentType = "application/x-www-form-urlencoded";
131:
132: // Add request parameters to memory stream before sending the web request.
133: using (StreamWriter objStreamWriter = new StreamWriter(objWebRequest.GetRequestStream()))
134: {
135: objStreamWriter.Write(strRequest);
136: objStreamWriter.Close();
137: }
138:
139:
140: // Get Response back.
141: WebResponse objWebResponse = objWebRequest.GetResponse();
142:
143: // Retrieve result parameter.
144: using (StreamReader objStreamReader = new StreamReader(objWebResponse.GetResponseStream()))
145: {
146: strResponse = objStreamReader.ReadToEnd();
147: objStreamReader.Close();
148: }
149:
150: HandleResponse(strResponse, objAuthorizeNetResponse);
151:
152: return objAuthorizeNetResponse;
153: }
154:
155:
156: /// <summary>
157: /// Set Response to indicate failure
158: /// </summary>
159: /// <param name="objAuthorizeNetResponse"></param>
160: /// <param name="ErrorMessage"></param>
161: private static void HandleError(AuthorizeNetResponse objAuthorizeNetResponse,string ErrorMessage)
162: {
163: objAuthorizeNetResponse.IsSuccess = false;
164: objAuthorizeNetResponse.Errors = ErrorMessage;
165: }
166:
167:
168: /// <summary>
169: /// Check the response and identify the result of the request.
170: /// </summary>
171: /// <param name="strResponse"></param>
172: /// <param name="objAuthorizeNetResponse"></param>
173: private static void HandleResponse(string strResponse, AuthorizeNetResponse objAuthorizeNetResponse)
174: {
175: /**********************************************************************************************************************************************************************************************************
176: * We will get the response srting as shown below, this is a sample string
177: *
178: * 1|1|1|This transaction has been approved.|RmFjFi|Y|508252758|||100.00|CC|auth_capture||||||||||||chiragrdarji@yahoo.co.in||||||||||||||AAD0537178B11C0F1105614FD1774773||2||||||||||||||||||||||||||||
179: *
180: * The first value before the first pipe(|) symbol indicates the result.
181: * Below is teh link that represents the different Response code
182: * http://www.authorize.net/support/Merchant/Transaction_Response/Response_Reason_Codes_and_Response_Reason_Text.htm
183: **********************************************************************************************************************************************************************************************************/
184: string[] strWebResponse = strResponse.Split(new char[] { '|' }, StringSplitOptions.None);
185:
186: if (strResponse != null)
187: {
188: // Check the response
189: if (strWebResponse[0] == "1")
190: {
191: objAuthorizeNetResponse.IsSuccess = true;
192: if (strWebResponse.Length > 3)
193: objAuthorizeNetResponse.SuccessMessage = strWebResponse[3];
194: // If x_test_request = FALSE, we will get transaction id else Transaction id = 0
195: if (strWebResponse.Length > 6)
196: objAuthorizeNetResponse.TransactionId = strWebResponse[6];
197: }
198: else
199: {
200: if (strWebResponse.Length > 3)
201: HandleError(objAuthorizeNetResponse, strWebResponse[3]);
202: else
203: HandleError(objAuthorizeNetResponse, UNEXPECTED_ERROR);
204: }
205: }
206: else
207: {
208: HandleError(objAuthorizeNetResponse, UNEXPECTED_ERROR);
209: }
210: }
211: }