/// <summary>
        /// 中间件调用
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            //判断是否为websocket请求
            if (context.WebSockets.IsWebSocketRequest)
            {
                //接收客户端
                var cancellationToken = context.RequestAborted;
                var currentWebSocket  = await context.WebSockets.AcceptWebSocketAsync();

                var socket = new PayQrWebSocket {
                    WebSocket = currentWebSocket
                };
                _SetStationInfo(socket, context);//设置客户端的数据
                await _wsconnMgr.AddSocket(socket);

                while (socket.WebSocket.State == WebSocketState.Open)
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        break;
                    }
                    var status = _wsHandler.GetPayQrStatus(socket);
                    switch (status)
                    {
                    case PayQrStatuses.INITIAL:                //初始化
                        await _wsHandler.GetPayQrInfo(socket); //发送获取到的二维码信息给客户端,客户端进行握手处理

                        _wsHandler.StartScaningDetect(socket);
                        break;

                    case PayQrStatuses.MONITORSCANING:                                     //开始监控
                        await _wsHandler.ScanningTimeoutDetect(socket, cancellationToken); //如果超时则会退出

                        Thread.Sleep(300);
                        continue;

                    case PayQrStatuses.ERROR:
                        break;
                    }

                    Thread.Sleep(500);
                }
                await _wsconnMgr.RemoveSocket(socket);
            }
            await this._next(context);
        }
Exemple #2
0
        /// <summary>
        /// 获取支付信息
        /// </summary>
        /// <param name="socket"></param>
        public async Task GetPayQrInfo(PayQrWebSocket socket)
        {
            CHIS.Models.PayQrInfo QrInfo = null;
            try
            {
                string h = await Ass.Net.WebHelper.WebPost(GetUrl("QRPay:HostUrl", "QRPay:GetPayInfo") + $"?payOrderId={socket.PayOrderId}");

                QrInfo = GetFromJsonString <CHIS.Models.PayQrInfo>(h);
                if (QrInfo.status == "ERROR")
                {
                    throw new Exception();
                }
                if (QrInfo.status == "PAYEDSUCCESS")
                {
                    await NotifyToClient(socket, QrInfo);

                    socket.PayQrStatus = PayQrStatuses.PAYEDSUCCESS;
                    await _wsconnMgr.RemoveSocket(socket);//关闭连接
                }
                else
                {
                    QrInfo.union2DCodeUrl = GetUnion2DCodeUrl(QrInfo);//获取统一二维码
                    socket.WxQrUrl        = QrInfo.wx2DCodeUrl;
                    socket.AliQrUrl       = QrInfo.ali2DCodeUrl;
                    socket.PayAmount      = QrInfo.totalAmount;
                    await NotifyToClient(socket, QrInfo);

                    socket.PayQrStatus = PayQrStatuses.GETPAYINFO;
                }
            }
            catch (Exception ex)
            {
                if (QrInfo == null)
                {
                    QrInfo = new CHIS.Models.PayQrInfo()
                    {
                        rlt = false, msg = ex.Message, status = "ERROR"
                    }
                }
                ;
                await NotifyToClient(socket, QrInfo);

                await _wsconnMgr.RemoveSocket(socket);//关闭连接
            }
        }