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")); }
/// <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 }); }