Exemple #1
0
        /// <summary>
        /// 签到获取密钥
        /// </summary>
        /// <returns></returns>
        public SignResponseModel Sign(VisualSelfServiceEquipment equipment)
        {
            Bitmap map = new Bitmap();

            map[11] = map[41] = map[42] = map[60] = map[63] = true;
            Iso8583 iso8583 = new Iso8583(map);

            iso8583[11].Content  = Settings.SysTraceNum;
            Settings.SysTraceNum = (Convert.ToInt32(Settings.SysTraceNum) + 1).ToString().PadLeft(6, '0');
            iso8583[41].Content  = equipment.TerminalNo;// Settings.TerminalNo;
            iso8583[42].Content  = Settings.MerchantCode;
            iso8583[60].FieldLenIndicator.Content = "011";
            iso8583[60].Content = "00003010003";
            iso8583[63].FieldLenIndicator.Content = "003";
            iso8583[63].Content = "001";
            Message msg = new Message(iso8583);

            msg.TPDU.Content        = Settings.TPDU;
            msg.MessageHead.Content = Settings.MsgHead;
            msg.MessageType.Content = "0800";
            Iso8583 Res_iso8583 = new Iso8583();
            Message Res_Msg     = new Message(Res_iso8583);

            Res_Msg.Unpack(msg.Send(Settings.BankIp, Convert.ToInt32(Settings.BankPort)));
            SignResponseModel responseModel = new SignResponseModel()
            {
                ResponseCode = Res_iso8583[39].Content
            };

            if (responseModel.ResponseCode == "00")
            {
                responseModel.Content = BitConverter.ToString(Res_iso8583[62].Pack()).Replace("-", "");
            }
            return(responseModel);
        }
        public override void DecodeBody(byte[] bytes)
        {
            MemoryStream ms = new MemoryStream(bytes);

            using (ms){
                SignResponseModel entity = Serializer.Deserialize <SignResponseModel>(ms);
                this.Result = entity.Result;
            }
        }
        public override byte[] EncodeBody()
        {
            SignResponseModel entity = new SignResponseModel();

            entity.Result = this.Result;
            MemoryStream ms = new MemoryStream();

            using (ms){
                Serializer.Serialize(ms, entity);
                return(ms.ToArray());
            }
        }
        /// <summary>
        /// 签到
        /// </summary>
        /// <returns></returns>
        public bool Sign()
        {
            ServiceUtil.PayClient.Open();
            SignResponseModel responseModel = ServiceUtil.PayClient.Sign(new VisualSelfServiceEquipment {
                TerminalNo = Settings.TerminalNo
            });

            ServiceUtil.PayClient.Close();

            if (responseModel.ResponseCode != "00")
            {
                return(false);
            }
            string        key       = responseModel.Content;
            StringBuilder sbWorkKey = new StringBuilder();
            bool          result    = false;

            switch (_creditCardPayType)
            {
            case CreditCardPayType.AllInPay:
                #region 通联验证逻辑
                sbWorkKey.Append(key.Substring(6, 32));
                StringBuilder sbMak = new StringBuilder();
                sbMak.Append(key.Substring(46, 16));
                StringBuilder sbTrk = new StringBuilder();
                sbTrk.Append(key.Substring(86, 32));

                IEncry.LoadWorkKeySign(sbWorkKey, sbMak, sbTrk);

                result = IEncry.CheckPIN(new StringBuilder("0000000000000000")).Substring(0, 8) == key.Substring(38, 8) &&
                         IEncry.CheckMAK(new StringBuilder("0000000000000000")).Substring(0, 8) == key.Substring(78, 8) &&
                         IEncry.CheckTRK(new StringBuilder("0000000000000000")).Substring(0, 8) == key.Substring(118, 8);
                #endregion
                break;

            case CreditCardPayType.ChinaUnionPay:
                #region 银联加密
                sbWorkKey.Append(key.Substring(4, 32));
                sbMak = new StringBuilder();
                sbMak.Append(key.Substring(44, 16));
                IEncry.LoadWorkKeySign(sbWorkKey, sbMak);
                result = IEncry.CheckPIN(new StringBuilder("0000000000000000")).Substring(0, 8) == key.Substring(36, 8) &&
                         IEncry.CheckMAK(new StringBuilder("0000000000000000")).Substring(0, 8) == key.Substring(76, 8);
                #endregion
                break;

            default:
                break;
            }

            return(result);
        }