示例#1
0
        public override CallbackInfo ProcessCallback(Order order, HttpRequest request, IDictionary <string, string> settings)
        {
            CallbackInfo callbackInfo = null;

            try
            {
                order.MustNotBeNull("order");
                request.MustNotBeNull("request");
                settings.MustNotBeNull("settings");
                settings.MustContainKey("SHAOUTPASSPHRASE", "settings");

                //Write data when testing
                if (settings.ContainsKey("TESTMODE") && settings["TESTMODE"] == "1")
                {
                    LogRequest <Ogone>(request, logGetData: true);
                }

                Dictionary <string, string> inputFields = new Dictionary <string, string>();

                string shaSign     = request.QueryString["SHASIGN"];
                string strAmount   = request.QueryString["AMOUNT"];
                string transaction = request.QueryString["PAYID"];
                string status      = request.QueryString["STATUS"];
                string cardType    = request.QueryString["BRAND"];
                string cardNo      = request.QueryString["CARDNO"];

                foreach (string key in request.QueryString.Keys)
                {
                    if (!key.Equals("SHASIGN"))
                    {
                        inputFields[key] = request.QueryString[key];
                    }
                }

                string strToHash = string.Join("", inputFields.OrderBy(i => i.Key)
                                               .Where(i => !string.IsNullOrWhiteSpace(i.Value))
                                               .Select(i => i.Key.ToUpperInvariant() + "=" + i.Value + settings["SHAOUTPASSPHRASE"]));
                string digest = new SHA512Managed().ComputeHash(Encoding.UTF8.GetBytes(strToHash)).ToHex().ToUpperInvariant();

                if (order.CartNumber == request.QueryString["ORDERID"] && digest.Equals(shaSign))
                {
                    callbackInfo = new CallbackInfo(decimal.Parse(strAmount, CultureInfo.InvariantCulture), transaction, status == "5" || status == "51" ? PaymentState.Authorized : PaymentState.Captured, cardType, cardNo);
                }
                else
                {
                    LoggingService.Instance.Warn <Ogone>("Ogone(" + order.CartNumber + ") - SHASIGN check isn't valid - Calculated digest: " + digest + " - Ogone SHASIGN: " + shaSign);
                }
            }
            catch (Exception exp)
            {
                LoggingService.Instance.Error <Ogone>("Ogone(" + order.CartNumber + ") - Process callback", exp);
            }

            return(callbackInfo);
        }