public async Task <IActionResult> ScanCodeGen(string orderName, string orderAmount, string outTradeNo)
        {
            AlipayTradePrecreateContentBuilder builder = BuildPrecreateContent(orderName, orderAmount, outTradeNo);

            //如果需要接收扫码支付异步通知,那么请把下面两行注释代替本行。
            //推荐使用轮询撤销机制,不推荐使用异步通知,避免单边账问题发生。
            AlipayF2FPrecreateResult precreateResult = await _alipayF2FService.TradePrecreateAsync(builder);

            //string notify_url = "http://10.5.21.14/Pay/Notify";  //商户接收异步通知的地址
            //AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, notify_url);

            //以下返回结果的处理供参考。
            //payResponse.QrCode即二维码对于的链接
            //将链接用二维码工具生成二维码打印出来,顾客可以用支付宝钱包扫码支付。
            var bitmap = new Bitmap(Path.Combine(_hostingEnvironment.WebRootPath, "images/error.png"));

            switch (precreateResult.Status)
            {
            case ResultEnum.SUCCESS:
                bitmap.Dispose();
                bitmap = RenderQrCode(precreateResult.response.QrCode);
                //轮询订单结果
                //根据业务需要,选择是否新起线程进行轮询
                ParameterizedThreadStart parStart = new ParameterizedThreadStart(LoopQuery);
                Thread myThread = new Thread(parStart);
                object o        = precreateResult.response.OutTradeNo;
                myThread.Start(o);
                break;

            case ResultEnum.FAILED:
                Console.WriteLine("生成二维码失败:" + precreateResult.response.Body);
                break;

            case ResultEnum.UNKNOWN:
                Console.WriteLine("生成二维码失败:" + (precreateResult.response == null ? "配置或网络异常,请检查后重试" : "系统异常,请更新外部订单后重新发起请求"));
                break;
            }
            MemoryStream ms = new MemoryStream();

            bitmap.Save(ms, ImageFormat.Png);
            byte[] bytes = ms.GetBuffer();
            ms.Close();
            return(File(bytes, "image/png"));
        }
Beispiel #2
0
        /// <summary>
        /// 面对面支付生成支付二维码
        /// </summary>
        /// <param name="input">支付数据</param>
        /// <param name="asyncNotifyUrl">异步通知地址,为空则表示为同步轮询模式</param>
        /// <param name="loopQueryAction">同步轮询回调函数</param>
        /// <param name="fTFConfig">面对面支付其它配置</param>
        /// <returns></returns>
        private async Task <FTFOutput> FTFGenQRCode(AlipayTradePrecreateContentBuilder input, string asyncNotifyUrl, Action <AlipayF2FPrecreateResult> loopQueryAction, FTFConfig fTFConfig)
        {
            // 参数检测
            var isAsyncNotify = !asyncNotifyUrl.IsNullOrWhiteSpace();

            if (!isAsyncNotify && loopQueryAction == null)
            {
                throw new NullReferenceException("轮询模式下 loopQueryAction 不能为空!");
            }
            // 收款账号检测,如果为空则默认填入全局配置的Uid
            if (input.seller_id.IsNullOrWhiteSpace())
            {
                input.seller_id = this._alipayService.Options.Uid;
            }



            Bitmap       bitmap       = null;
            MemoryStream memoryStream = null;
            var          message      = string.Empty;

            //推荐使用轮询撤销机制,不推荐使用异步通知,避免单边账问题发生。
            AlipayF2FPrecreateResult precreateResult = null;

            // 异步通知
            if (isAsyncNotify)
            {
                precreateResult = await _alipayF2FService.TradePrecreateAsync(input, asyncNotifyUrl);
            }// 同步轮询
            else
            {
                precreateResult = await _alipayF2FService.TradePrecreateAsync(input);
            }

            switch (precreateResult.Status)
            {
            case F2FResultEnum.SUCCESS:
                // 将链接用二维码工具生成二维码打印出来,顾客可以用支付宝钱包扫码支付。
                bitmap = RenderQrCode(precreateResult.response.QrCode);
                // 同步轮询模式,触发轮询回调函数
                if (!isAsyncNotify)
                {
                    loopQueryAction.Invoke(precreateResult);
                }
                break;

            case F2FResultEnum.FAILED:
                message = $"生成二维码失败: {precreateResult.response.Body}";
                break;

            case F2FResultEnum.UNKNOWN:
                message = "生成二维码失败:" + (precreateResult.response == null ? "配置或网络异常,请检查后重试" : "系统异常,请更新外部订单后重新发起请求");
                break;
            }

            // 如果位图为空,则生成错误提示二维码
            if (bitmap == null)
            {
                bitmap = new Bitmap(fTFConfig == null ? this._fTFConfig?.QRCodeGenErrorImageFullPath : fTFConfig.QRCodeGenErrorImageFullPath);
            }

            // 转换成字节数组
            memoryStream = new MemoryStream();
            bitmap.Save(memoryStream, ImageFormat.Png);
            var imgBuffer = memoryStream.GetBuffer();

            // 释放资源
            memoryStream.Dispose();
            bitmap.Dispose();

            return(new FTFOutput()
            {
                QRCodeImageBuffer = imgBuffer,
                IsSuccess = precreateResult.Status == F2FResultEnum.SUCCESS,
                Message = message
            });
        }