public async Task <PayOutput> Pay(PayInput input) { var orderInfo = _sellAppService.GetOrderInfo(input.OrderId); if (orderInfo == null) { throw new LotteryDataException("下单失败,请稍后重试"); } if (!orderInfo.OrderCost.Equals(input.Price)) { throw new LotteryDataException("订单金额错误,请核对订单信息"); } if (input.IsType != PayType.AliPay && input.IsType != PayType.Wechat) { throw new LotteryDataException("请选择支付方式"); } var paysApiInfo = _sellAppService.GetPaysApiInfo(); var payInfo = new PayOrderDto() { Uid = paysApiInfo.Uid, Price = input.Price.ToString("#0.00"), Istype = (int)input.IsType, // Goodsname = input.GoodsName, Notify_url = paysApiInfo.NotifyUrl, Return_url = paysApiInfo.ReturnUrl, Orderid = input.OrderId, Orderuid = _lotterySession.UserName, }; payInfo.Key = GetPayKey(payInfo, paysApiInfo.Token); return(_sellAppService.GetPayOrderInfo(payInfo, paysApiInfo.PaysApi)); }
/// <summary> /// 创建交易日志 /// </summary> /// <returns></returns> private async Task <TransactionLog> CreateToPayTransactionInfo(PayInput input, Exception exception = null) { var transactionInfo = new TransactionInfo() { Amount = input.TotalAmount, CustomData = input.CustomData, OutTradeNo = input.OutTradeNo ?? GenerateOutTradeNo(), PayChannel = input.PayChannel, Subject = input.Subject, TransactionState = TransactionStates.NotPay, //TransactionId = "", Exception = exception }; TransactionLog transactionLog = null; if (input.PayChannel == PayChannels.GlobalAlipay) { //添加货币符号,以支持国际支付 var config = Magicodes.Alipay.Global.GlobalAlipayAppService.GetPayConfigFunc(); transactionLog = _transactionLogHelper.CreateTransactionLog(transactionInfo, config.Currency); } else { transactionLog = _transactionLogHelper.CreateTransactionLog(transactionInfo); } await _transactionLogHelper.SaveAsync(transactionLog); return(transactionLog); }
public async Task <IActionResult> SendPayment(WalletTransactViewModel model, CancellationToken cancellationToken) { AjaxResult result = new AjaxResult("Error"); if (ModelState.IsValid) { PayInput input = new PayInput(); CustomUser user = await UserManager.GetUserAsync(User); input.Deposits = model.Deposits; input.Description = "عملیات شارژ حساب"; input.Redirect = SiteSetting.CallBackUrl + $"?transactType={TransactType.Creditor}"; input.PhoneNumber = user.PhoneNumber; PaymentRequest response = await Payment.PayAsync(input, cancellationToken); if (Assert.NotNull(response) && response.Status == 1 && Assert.NotNull(response.Token)) { result.Status = "Success"; result.RedirectUrl = SiteSetting.RedirectUrl + response.Token; user.PaymentToken = response.Token; await UserManager.UpdateAsync(user); return(new JsonResult(result)); } else { result.Errors.Add(response.ErrorMessage); } return(new JsonResult(result)); } result.AddErrors(ModelState); return(new JsonResult(result)); }
public async Task <JsonResult> GetPaySign(PayInput input) { using (CurrentUnitOfWork.DisableFilter(DataFilters.MustHaveTenant, DataFilters.MayHaveTenant)) { Order order = _orderRepository.Get(input.Id); TenPayV3Info tenPayV3Info = await GetTenPayV3Info(InfrastructureSession.TenantId.Value); string timeStamp = TenPayV3Util.GetTimestamp(); string nonceStr = TenPayV3Util.GetNoncestr(); if (order.PrepayIdCreatedTime.HasValue && order.PrepayIdCreatedTime < DateTime.Now.AddHours(-2)) { throw new UserFriendlyException(L("TheOrderHasOverTime")); } if (string.IsNullOrEmpty(order.PrepayId)) { string body = order.Title; //商品或支付单简要描述 string out_trade_no = order.Number; //商户系统内部的订单号,32个字符内,可包含字母,其他说明见商户订单号 int totalFee = (int)(order.PayMoney * 100); //订单总金额,只能是整数。 string spbill_create_ip = Request.UserHostAddress; //APP和网页支付提交用户端IP,Native支付填调用微信支付API的机器IP string openid = WechatUserManager.GetOpenid(order.User.ToUserIdentifier()); TenPayV3UnifiedorderRequestData xmlDataInfo = new TenPayV3UnifiedorderRequestData( tenPayV3Info.AppId, tenPayV3Info.MchId, body, out_trade_no, totalFee, Request.UserHostAddress, tenPayV3Info.TenPayV3Notify, //trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。必传,这里需要将去获取openid赋值上去 TenPayV3Type.JSAPI, openid, tenPayV3Info.Key, nonceStr); UnifiedorderResult unifiedorderResult = TenPayV3.Unifiedorder(xmlDataInfo, 10000); string prepay_id = unifiedorderResult.prepay_id; order.PrepayId = prepay_id; order.PrepayIdCreatedTime = DateTime.Now; _orderRepository.Update(order); } nonceStr = TenPayV3Util.GetNoncestr(); RequestHandler paysignReqHandler = new RequestHandler(null); paysignReqHandler.Init(); //设置支付参数 paysignReqHandler.SetParameter("appId", tenPayV3Info.AppId); paysignReqHandler.SetParameter("timeStamp", timeStamp); paysignReqHandler.SetParameter("nonceStr", nonceStr); string package = string.Format("prepay_id={0}", order.PrepayId); paysignReqHandler.SetParameter("package", package); string paySign = TenPayV3.GetJsPaySign(tenPayV3Info.AppId, timeStamp, nonceStr, package, tenPayV3Info.Key); paysignReqHandler.SetParameter("paySign", paySign); return(Json(paysignReqHandler.GetAllParameters())); } }
/// <summary> /// 支付 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task <object> Pay(PayInput input) { Logger.Debug("准备发起支付:" + input.ToJsonString()); object output = null; Exception exception = null; if (input.OutTradeNo == null) { input.OutTradeNo = GenerateOutTradeNo(); } try { //TODO:添加客户端请求头判断,支持自动使用PC/H5/APP等支付 switch (input.PayChannel) { case PayChannels.WeChatPay: output = await WeChatAppPay(input); break; case PayChannels.AliPay: output = await AliAppPay(input); break; case PayChannels.GlobalAlipay: output = await GlobalAlipay(input); break; case PayChannels.BalancePay: await BalancePay(input); return(null); default: throw new UserFriendlyException("当前不支持此种类型的支付!"); } } catch (Exception ex) { exception = ex; } if (input.PayChannel != PayChannels.BalancePay) { //创建交易日志 await CreateToPayTransactionInfo(input, exception); if (exception != null) { Logger.Error("支付失败!", exception); throw new UserFriendlyException("支付异常,请联系客服人员或稍后再试!"); } } return(output); }
public IActionResult Pay(PayInput input) { PaymentRequest result = _Payment.Pay(input); if (result != null && result.Status == 100) { _unitOfWork.OrderRepo.SetTransactionID(input.OrderId, result.Authority); return(Redirect("https://sandbox.zarinpal.com/pg/StartPay/" + result.Authority)); } return(View("PayErorr", result)); }
public IActionResult Completed(OrderViewModel model) { PayInput model2 = new PayInput(); if (ModelState.IsValid) { model.Lines = _cart.List; model2.OrderId = TempData["OrderId"] != null ? (int)TempData["OrderId"] : 0; model2.Amount = Convert.ToInt32(model.Lines.Sum(c => c.product.Price * c.Quentity)); _cart.Clear(); } return(View(model2)); }
public async Task <PaymentRequest> PayAsync(PayInput input, CancellationToken cancellationToken) { Dictionary <string, string> post_values = new Dictionary <string, string> { { "api", siteSetting.Api }, { "amount", input.Deposits.ToString() }, { "redirect", input.Redirect }, { "description", input.Description }, { "mobile", input.PhoneNumber }, }; string response = await RequestSender.RequestAsync(HttpMethod.Post, siteSetting.GatewaySend, post_values, cancellationToken); return(response.ToCsharpObject <PaymentRequest>()); }
/// <summary> /// 余额支付 /// </summary> /// <param name="input"></param> /// <returns></returns> protected async Task BalancePay(PayInput input) { var data = JsonConvert.DeserializeObject <JObject>(input.CustomData); var uid = data["uid"]?.ToString(); var log = await CreateToPayTransactionInfo(input); if (data["key"]?.ToString() == "系统充值") { throw new UserFriendlyException("余额支付不支持此业务!"); } var userIdentifer = UserIdentifier.Parse(uid); await UserManager.UpdateRechargeInfo(userIdentifer, (int)(-input.TotalAmount * 100)); await _paymentCallbackManager.ExecuteCallback(data["key"]?.ToString(), log.OutTradeNo, log.TransactionId, (int)(input.TotalAmount * 100), data); }
public ApiResult <PayOutput> PaySync(PayInput parameter) { //if (!this.IsFormValid()) { // return ApiResult.Failure<PayOutput>(this.FormInvalidReason(), MessageCodes.ParameterValidationFailure); //} //Resolve<IPayService>().Log($"支付参数:{parameter.ToJson()}"); var result = Resolve <IPayService>().Pay(parameter, HttpContext); Resolve <IPayService>().Log($"支付返回结果:{result.Item2.ToJson()}"); if (result.Item1.Succeeded) { return(ApiResult.Success(result.Item2)); } return(ApiResult.Failure <PayOutput>(result.Item1.ToString(), MessageCodes.ServiceFailure)); }
public PaymentRequest Pay(PayInput input) { _payment = new ZarinpalSandbox.Payment(Convert.ToInt32(input.Amount)); // var result = _payment.PaymentRequest(input.OrderId + input.Description, "https://localhost:5001/Payment/Verify", input.Email, input.Mobile); var result = _payment.PaymentRequest(input.OrderId + input.Description, "https://localhost:5001/Payment/Verify"); PaymentRequest pay = new PaymentRequest(); if (result.IsCompletedSuccessfully) { _session.SetInt32(result.Result.Authority, input.Amount); pay.Authority = result.Result.Authority; pay.Link = result.Result.Link; pay.Status = result.Result.Status; } return(pay);; }
public ApiResult WechatAppPay([FromBody] PayInput parameter) { var pay = Resolve <IPayService>().GetSingle(parameter.PayId); // 获取前台Url,实现跳转支付完成后跳转功能 var url = HttpWeb.ClientHost; // 后台服务端Url var serviceUrl = HttpWeb.ServiceHost; var result = Resolve <IPayService>().WechatAppPayment(ref pay, url, serviceUrl); //(parameter, HttpContext); if (result.Item1.Succeeded) { return(ApiResult.Success(result.Item2)); } return(ApiResult.Failure <PayOutput>(result.Item1.ToString(), MessageCodes.ServiceFailure)); }
public PayOutput GetPayOutput(PayInput input) { OrderDto order = Get(new OrderGetInput() { Id = input.Id }); if (order.PaymentStatus == PaymentStatus.Payed) { throw new UserFriendlyException("the order has payed!"); } PayOutput payOutput = new PayOutput() { Order = order }; return(payOutput); }
public async Task <string> Recharge(RechargeInput input) { var payInput = new PayInput { Body = "系统充值", TotalAmount = input.TotalAmount, Subject = "系统充值", CustomData = new { key = "系统充值", uid = AbpSession.ToUserIdentifier().ToUserIdentifierString() }.ToJsonString() }; //使用统一支付接口 var result = await _payAppService.Pay(payInput); return((string)(result is string?result : result.ToJsonString())); }
public virtual async Task <PaymentDto> PayAsync(Guid id, PayInput input) { var payment = await _repository.GetAsync(id); if (payment.UserId != CurrentUser.GetId()) { throw new UsingUnauthorizedPaymentException(CurrentUser.GetId(), payment.Id); } var configurations = await GetPayeeConfigurationsAsync(payment); foreach (var property in input.ExtraProperties) { configurations.AddIfNotContains(new KeyValuePair <string, object>(property.Key, property.Value)); } await _paymentManager.StartPaymentAsync(payment, configurations); return(await MapToGetOutputDtoAsync(payment)); }
public virtual Task <PaymentDto> PayAsync(Guid id, PayInput input) { return(_service.PayAsync(id, input)); }
public async Task <JsonResult> Pay(string DisCountTitle, string OrderId, CancellationToken cancellationToken) { AjaxResult result = new AjaxResult("Error"); PayInput input = new PayInput(); PaymentRequest response = new PaymentRequest(); CustomUser user = new CustomUser(); DisCount DisCount = new DisCount(); if (string.IsNullOrEmpty(OrderId)) { result.Errors.Add("اطلاعات ارسالی صحیح نیس"); return(new JsonResult(result)); } Order order = await orderRepository.GetByIdAsync(Guid.Parse(OrderId), cancellationToken); if (order == null) { result.Errors.Add("اطلاعات ارسالی صحیح نیس"); return(new JsonResult(result)); } input.Deposits = order.TotalPrice; if (!string.IsNullOrEmpty(DisCountTitle)) { DisCount = await disCountRepository.GetByTitle(DisCountTitle.Trim(), cancellationToken); input.Deposits = DisCount != null?DisCountHelper.ComputeDisCount(DisCount, order.TotalPrice) : order.TotalPrice; } if (User.Identity.IsAuthenticated) { user = await customUserManager.GetUserAsync(User); } else { string anonymousUserId = cookieManager.Get <string>("LocalhostCart"); user = await orderRepository.GetAnonymousUser(anonymousUserId, cancellationToken); } input.Deposits = DisCountHelper.WithdrawFromWallet(user, input.Deposits); input.PhoneNumber = user?.PhoneNumber; if (input.Deposits >= 1000) { input.Redirect = siteSetting.BuyCourseCallBackUrl; input.Description = "تصویه صورت حساب با احتساب تخفیف و کسر از کیف پولتان"; response = await payment.PayAsync(input, cancellationToken); } else { result.Status = "Success"; result.RedirectUrl = ""; result.MessageWhenSuccessed = " مبلغ با محاسبه تخفیف و کسر از کیف پول پرداخت شد"; DisCount.Count = DisCount.Count > 0 ? --DisCount.Count : DisCount.Count; await customUserManager.UpdateAsync(user); order.IsBought = true; await disCountRepository.UpdateAsync(DisCount, cancellationToken); return(new JsonResult(result)); } if (Assert.NotNull(response) && response.Status == 1 && Assert.NotNull(response.Token)) { result.Status = "Success"; result.RedirectUrl = siteSetting.RedirectUrl + response.Token; user.PaymentToken = response.Token; DisCount.Count = DisCount.Count > 0 ? DisCount.Count-- : DisCount.Count; await customUserManager.UpdateAsync(user); order.IsBought = true; await disCountRepository.UpdateAsync(DisCount, cancellationToken); return(new JsonResult(result)); } else { result.Errors.Add("عملیات پرداخت با شکست مواجه شد لطفا بعدا امتحان کنید"); result.Errors.Add(response.ErrorMessage); } return(new JsonResult(result)); }
/// <inheritdoc /> /// <summary> /// 网站支付 /// </summary> /// <param name="input"></param> /// <returns></returns> public Task <PayOutput> Pay(PayInput input) { //把请求参数打包成数组 var sParaTemp = new SortedDictionary <string, string> { { "service", "create_forex_trade" }, { "partner", _alipaySettings.Partner }, { "_input_charset", _alipaySettings.CharSet.ToLower() }, { "sign_type", _alipaySettings.SignType }, { "notify_url", input.NotifyUrl ?? _alipaySettings.Notify }, { "return_url", input.ReturnUrl ?? _alipaySettings.ReturnUrl }, { "currency", input.Currency ?? _alipaySettings.Currency }, { "out_trade_no", input.TradeNo ?? Guid.NewGuid().ToString("N") }, { "subject", input.Subject }, { "body", input.Body } }; if (input.RmbFee > 0) { sParaTemp.Add("rmb_fee", input.RmbFee.ToString()); } else { sParaTemp.Add("total_fee", input.TotalFee.ToString()); } if (!string.IsNullOrWhiteSpace(input.TimeoutRule)) { sParaTemp.Add("timeout_rule", input.TimeoutRule); } if (!string.IsNullOrWhiteSpace(input.AuthToken)) { sParaTemp.Add("auth_token", input.AuthToken); } if (!string.IsNullOrWhiteSpace(input.Supplier)) { sParaTemp.Add("supplier", input.Supplier); } if (!string.IsNullOrWhiteSpace(input.SecondaryMerchantId)) { sParaTemp.Add("secondary_merchant_id", input.SecondaryMerchantId); } if (!string.IsNullOrWhiteSpace(input.SecondaryMerchantName)) { sParaTemp.Add("secondary_merchant_name", input.SecondaryMerchantName); } if (!string.IsNullOrWhiteSpace(input.SecondaryMerchantIndustry)) { sParaTemp.Add("secondary_merchant_industry", input.SecondaryMerchantIndustry); } if (input.OrderGmtCreate.HasValue) { sParaTemp.Add("order_gmt_create", input.OrderGmtCreate.Value.ToString("yyyy-MM-dd hh:mm:ss")); } if (input.OrderValidTime.HasValue && input.OrderValidTime > 0) { sParaTemp.Add("order_valid_time", input.OrderValidTime.Value.ToString()); } if (input.SplitFundInfo != null && input.SplitFundInfo.Count > 0) { foreach (var splitFundInfoDto in input.SplitFundInfo) { if (input.RmbFee > 0) { splitFundInfoDto.Currency = "CNY"; } else { splitFundInfoDto.Currency = input.Currency ?? _alipaySettings.Currency; } } //分账信息 sParaTemp.Add("split_fund_info", Newtonsoft.Json.JsonConvert.SerializeObject(input.SplitFundInfo)); } //过滤签名参数数组 sParaTemp.FilterPara(); var dic = sParaTemp.BuildRequestPara(_alipaySettings); var html = dic.GetHtmlSubmitForm(_alipaySettings.Gatewayurl, _alipaySettings.CharSet); return(Task.FromResult(new PayOutput { FormHtml = html, Parameters = dic })); }
/// <inheritdoc /> /// <summary> /// 网站支付 /// </summary> /// <param name="input"></param> /// <returns></returns> public Task <PayOutput> Pay(PayInput input) { //把请求参数打包成数组 var sParaTemp = new SortedDictionary <string, string> { { "service", "create_forex_trade" }, { "partner", _alipaySettings.Partner }, { "_input_charset", _alipaySettings.CharSet.ToUpper() }, { "sign_type", _alipaySettings.SignType }, { "notify_url", input.NotifyUrl ?? _alipaySettings.Notify }, { "return_url", input.ReturnUrl ?? _alipaySettings.ReturnUrl }, { "currency", input.Currency ?? _alipaySettings.Currency }, { "out_trade_no", input.TradeNo ?? Guid.NewGuid().ToString("N") }, { "subject", input.Subject }, { "product_code", "NEW_OVERSEAS_SELLER" }, }; if (!string.IsNullOrWhiteSpace(input.Body)) { //商品信息,不支持特殊字符。格式:[{"goods_name":"名称1","quantity":"数量1"},{"goods_name":"名称2","quantity":"数量2"}]。 if (!input.Body.StartsWith("[")) { input.Body = JsonConvert.SerializeObject(new List <object>() { new { goods_name = input.Body, quantity = 1 } }); } sParaTemp.Add("body", input.Body); } if (input.RmbFee > 0) { sParaTemp.Add("rmb_fee", input.RmbFee.ToString()); } else { sParaTemp.Add("total_fee", input.TotalFee.ToString()); } if (!string.IsNullOrWhiteSpace(input.TimeoutRule)) { sParaTemp.Add("timeout_rule", input.TimeoutRule); } if (!string.IsNullOrWhiteSpace(input.AuthToken)) { sParaTemp.Add("auth_token", input.AuthToken); } if (!string.IsNullOrWhiteSpace(input.Supplier)) { sParaTemp.Add("supplier", input.Supplier); } if (!string.IsNullOrWhiteSpace(input.SecondaryMerchantId)) { sParaTemp.Add("secondary_merchant_id", input.SecondaryMerchantId); } if (!string.IsNullOrWhiteSpace(input.SecondaryMerchantName)) { sParaTemp.Add("secondary_merchant_name", input.SecondaryMerchantName); } if (!string.IsNullOrWhiteSpace(input.SecondaryMerchantIndustry)) { sParaTemp.Add("secondary_merchant_industry", input.SecondaryMerchantIndustry); } if (input.OrderGmtCreate.HasValue) { sParaTemp.Add("order_gmt_create", input.OrderGmtCreate.Value.ToString("yyyy-MM-dd hh:mm:ss")); } if (input.OrderValidTime.HasValue && input.OrderValidTime > 0) { sParaTemp.Add("order_valid_time", input.OrderValidTime.Value.ToString()); } #region 设置分账信息 if (input.SplitFundInfo != null && input.SplitFundInfo.Count > 0) { foreach (var splitFundInfoDto in input.SplitFundInfo) { if (input.RmbFee > 0) { splitFundInfoDto.Currency = "CNY"; } else { splitFundInfoDto.Currency = input.Currency ?? _alipaySettings.Currency; } } //分账信息 sParaTemp.Add("split_fund_info", Newtonsoft.Json.JsonConvert.SerializeObject(input.SplitFundInfo)); } else if (_alipaySettings.SplitFundInfo != null && _alipaySettings.SplitFundInfo.Count > 0) { input.SplitFundInfo = new List <SplitFundInfoDto>(); foreach (var splitFundInfo in _alipaySettings.SplitFundInfo) { var splitFundInfoDto = new SplitFundInfoDto() { Desc = splitFundInfo.Desc, TransIn = splitFundInfo.TransIn }; if (input.RmbFee > 0) { splitFundInfoDto.Currency = "CNY"; } else { splitFundInfoDto.Currency = input.Currency ?? _alipaySettings.Currency; } if (splitFundInfo.AmountRate > 0) { var amount = input.TotalFee > 0 ? input.TotalFee : input.RmbFee; //日元取整数,其他的保留两位小数 splitFundInfoDto.Amount = splitFundInfoDto.Currency == "JPY" ? decimal.Floor(splitFundInfo.AmountRate * amount) : decimal.Round(splitFundInfo.AmountRate * amount, 2); } } //分账信息 sParaTemp.Add("split_fund_info", Newtonsoft.Json.JsonConvert.SerializeObject(input.SplitFundInfo)); } #endregion //过滤签名参数数组 sParaTemp.FilterPara(); var dic = sParaTemp.BuildRequestPara(_alipaySettings); LoggerAction?.Invoke("Debug", "支付参数:" + JsonConvert.SerializeObject(dic)); var html = dic.GetHtmlSubmitForm(_alipaySettings.Gatewayurl, _alipaySettings.CharSet); return(Task.FromResult(new PayOutput { FormHtml = html, Parameters = dic })); }
public ActionResult Index(PayInput input) { PayOutput PayOutput = _orderAppService.GetPayOutput(input); return(View(PayOutput)); }