示例#1
0
        public async Task <PaymentOrderBaseResponse> GeneratePaymentOrder(PaymentOrderRequest request)
        {
            var apiHost = await _appSettingService.Get(ShopKeys.ApiHost);

            var wxRequest = new WeChatPayUnifiedOrderRequest
            {
                Body           = request.Subject,
                OutTradeNo     = request.OrderNo,
                TotalFee       = Convert.ToInt32(request.TotalAmount * 100),
                OpenId         = request.OpenId,
                TradeType      = "JSAPI",
                SpbillCreateIp = "127.0.0.1",
                NotifyUrl      = $"{apiHost.Trim('/')}/api/mp/pay/notify/{request.OrderNo}",
            };
            var response = await _client.ExecuteAsync(wxRequest);

            if (response?.ReturnCode == "SUCCESS" && response?.ResultCode == "SUCCESS")
            {
                var req = new WeChatPayLiteAppCallPaymentRequest
                {
                    Package = "prepay_id=" + response.PrepayId
                };

                // https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5
                // 将参数(parameter)给 小程序前端 让他调起支付API
                var parameter = await _client.ExecuteAsync(req);

                var json = JsonConvert.SerializeObject(parameter);
                return(JsonConvert.DeserializeObject <PaymentOrderResponse>(json));
            }
            throw new Exception(response?.ReturnMsg);
        }
示例#2
0
 public async Task ExecuteAsync(HttpContext context)
 {
     try
     {
         var body = (await context.Request.ReadFormAsync()).AsNameValueCollection();
         if (body?.Count == 0)
         {
             throw new ArgumentNullException(nameof(body));
         }
         var request = new AppPayRequest();
         request.AddParameters(new AppPayModel()
         {
             Body       = body.Get("Body"),
             OutTradeNo = body.Get("Out_Trade_No"),
             TotalFee   = int.Parse(body.Get("Total_Amount"))
         });
         await context.Response.WriteAsync((await _client.ExecuteAsync(request)).ToJson());
     }
     catch (System.Exception ex)
     {
         context.Response.StatusCode = StatusCodes.Status500InternalServerError;
         await context.Response.WriteAsync(ex.Message);
     }
     context.Response.ContentType = "application/json; charset=UTF-8";
     await context.Response.Body.FlushAsync();
 }
        public async Task <PaymentOrderBaseResponse> GeneratePaymentOrder(PaymentOrderRequest request)
        {
            var ip = Dns.GetHostEntry(Dns.GetHostName())
                     .AddressList.FirstOrDefault(address => address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)?.ToString()
                     ?? "127.0.0.1";

            var apiHost = await _appSettingService.Get(ShopKeys.ApiHost);

            var wxRequest = new WeChatPayUnifiedOrderRequest
            {
                Body       = request.Subject,
                OutTradeNo = request.OrderNo,
                TotalFee   = Convert.ToInt32(request.TotalAmount * 100),
                OpenId     = request.OpenId,
                TradeType  = "JSAPI",
                //SpbillCreateIp = "127.0.0.1",
                SpBillCreateIp = ip,
                NotifyUrl      = $"{apiHost.Trim('/')}/api/mp/pay/notify/{request.OrderNo}",
            };

            var config = await _appSettingService.Get <MiniProgramOptions>();

            var opt = new WeChatPayOptions()
            {
                AppId  = config.AppId,
                MchId  = config.MchId,
                Secret = config.AppSecret,
                Key    = config.Key
            };
            var response = await _client.ExecuteAsync(wxRequest, opt);

            if (response?.ReturnCode == WeChatPayCode.Success && response?.ResultCode == WeChatPayCode.Success)
            {
                var req = new WeChatPayLiteAppSdkRequest
                {
                    Package = $"prepay_id={response.PrepayId}"
                };

                // https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5
                // 将参数(parameter)给 小程序前端 让他调起支付API
                var parameter = await _client.ExecuteAsync(req, opt);

                var json = JsonConvert.SerializeObject(parameter);
                return(JsonConvert.DeserializeObject <PaymentOrderResponse>(json));
            }
            throw new Exception(response?.ReturnMsg);
        }
        public async Task <OkObjectResult> ScanPay(string Body, string Out_Trade_No, int Total_Amount)
        {
            var request = new ScanPayRequest();

            request.AddParameters(new ScanPayModel()
            {
                Body       = Body,
                OutTradeNo = Out_Trade_No,
                TotalFee   = Total_Amount
            });
            return(Ok(await _client.ExecuteAsync(request)));
        }
示例#5
0
        public async Task <WeChatPayPlatformCertificate> GetCertificateAsync(IWeChatPayClient client, WeChatPayOptions options)
        {
            // 如果证书序列号已缓存,则直接使用缓存的
            var platformCert = _certDictionary.Values.Where(cert => cert.EffectiveTime <DateTime.Now && cert.ExpireTime> DateTime.Now).FirstOrDefault();

            if (platformCert != null)
            {
                return(platformCert);
            }

            // 否则重新下载新的平台证书
            var request  = new WeChatPayCertificatesRequest();
            var response = await client.ExecuteAsync(request, options);

            foreach (var certificate in response.Certificates)
            {
                // 若证书序列号未被缓存,解密证书并加入缓存
                if (!_certDictionary.ContainsKey(certificate.SerialNo))
                {
                    switch (certificate.EncryptCertificate.Algorithm)
                    {
                    case nameof(AEAD_AES_256_GCM):
                    {
                        var certStr = AEAD_AES_256_GCM.Decrypt(certificate.EncryptCertificate.Nonce, certificate.EncryptCertificate.Ciphertext, certificate.EncryptCertificate.AssociatedData, options.V3Key);

                        var cert = new WeChatPayPlatformCertificate
                        {
                            SerialNo      = certificate.SerialNo,
                            EffectiveTime = DateTime.Parse(certificate.EffectiveTime),
                            ExpireTime    = DateTime.Parse(certificate.ExpireTime),
                            Certificate   = new X509Certificate2(Encoding.ASCII.GetBytes(certStr))
                        };

                        _certDictionary.TryAdd(certificate.SerialNo, cert);
                    }
                    break;

                    default:
                        throw new WeChatPayException($"Unknown algorithm: {certificate.EncryptCertificate.Algorithm}");
                    }
                }
            }

            // 重新从缓存获取
            platformCert = _certDictionary.Values.Where(cert => cert.EffectiveTime <DateTime.Now && cert.ExpireTime> DateTime.Now).FirstOrDefault();
            if (platformCert != null)
            {
                return(platformCert);
            }
            else
            {
                throw new WeChatPayException("Download certificates failed!");
            }
        }
示例#6
0
        /// <summary>
        /// 提现到银行卡
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <PayBankResponse> PayBank(PayBankRequest request)
        {
            // 获取Rsa值
            // var wxRequest = new WeChatPayRiskGetPublicKeyRequest();
            // var response = await _client.ExecuteAsync(wxRequest, _wechatPayOption);
            var result = new PayBankResponse();

            var wxRequest = new WeChatPayPayBankRequest
            {
                PartnerTradeNo = request.PartnerTradeNo,
                BankNo         = request.BankNo,
                TrueName       = request.TrueName,
                BankCode       = request.BankCode,
                Amount         = request.Amount,
                Desc           = request.Desc
            };

            try
            {
                var response = await _client.ExecuteAsync(wxRequest, _wechatPayOption);

                if (response.ReturnCode == WeChatPayCode.Success)
                {
                    if (response.ResultCode == WeChatPayCode.Success)
                    {
                        result.IsSuccess = true;
                    }
                    result.Message = response.ErrCodeDes;
                }
                else
                {
                    result.Message = response.ReturnMsg;
                }
            }
            catch (Exception ex)
            {
                result.Message = ex.Message;
            }
            return(result);
        }
示例#7
0
        public async Task <Result> Agree(int id)
        {
            var apply = await _withdrawalHistoryRepository.FirstOrDefaultAsync(id);

            if (apply == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }
            if (apply.Status != WithdrawalStatus.Apply)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "当前申请状态不允许确认"));
            }

            var openId = await _custoemrRepository.Query()
                         .Where(e => e.Id == apply.CustomerId)
                         .Select(e => e.OpenId)
                         .FirstOrDefaultAsync();

            apply.Status  = WithdrawalStatus.Success;
            apply.Message = "提现成功";

            var wxRequest = new WeChatPayPromotionTransfersRequest
            {
                PartnerTradeNo = apply.PartnerTradeNo,
                OpenId         = openId,
                CheckName      = "FORCE_CHECK",//  "NO_CHECK"
                ReUserName     = apply.Name,
                Amount         = apply.Amount,
                Desc           = "提现"
            };
            var response = await _client.ExecuteAsync(wxRequest, _weChatPayOptions);

            if (response.ReturnCode != WeChatPayCode.Success || response.ResultCode != WeChatPayCode.Success)
            {
                apply.Status      = WithdrawalStatus.Failed;
                apply.Message     = "提现异常,请重新申请";
                apply.Description = response.ErrCodeDes;

                await _customerManager.UpdateAssets(apply.CustomerId, 0, apply.Total, -apply.ReservedAmount, "提现失败返回金额");
            }

            await _withdrawalHistoryRepository.UpdateAsync(apply);

            return(Result.Ok());
        }
示例#8
0
        private async Task <X509Certificate2> LoadPlatformCertificateAsync(string serial, WeChatPayOptions options)
        {
            // 如果证书序列号已缓存,则直接使用缓存的
            if (_platformCertificateManager.TryGetValue(serial, out var certificate2))
            {
                return(certificate2);
            }

            // 否则重新下载新的平台证书
            var request  = new WeChatPayCertificatesRequest();
            var response = await _client.ExecuteAsync(request, options);

            foreach (var certificate in response.Certificates)
            {
                // 若证书序列号未被缓存,解密证书并加入缓存
                if (!_platformCertificateManager.ContainsKey(certificate.SerialNo))
                {
                    switch (certificate.EncryptCertificate.Algorithm)
                    {
                    case nameof(AEAD_AES_256_GCM):
                    {
                        var certStr = AEAD_AES_256_GCM.Decrypt(certificate.EncryptCertificate.Nonce, certificate.EncryptCertificate.Ciphertext, certificate.EncryptCertificate.AssociatedData, options.V3Key);
                        var cert    = new X509Certificate2(Encoding.UTF8.GetBytes(certStr));
                        _platformCertificateManager.TryAdd(certificate.SerialNo, cert);
                    }
                    break;

                    default:
                        throw new WeChatPayException($"Unknown algorithm: {certificate.EncryptCertificate.Algorithm}");
                    }
                }
            }

            // 重新从缓存获取
            if (_platformCertificateManager.TryGetValue(serial, out certificate2))
            {
                return(certificate2);
            }
            else
            {
                throw new WeChatPayException("Download certificates failed!");
            }
        }
示例#9
0
        // 刷卡支付
        public async Task <OrderResult> MicroPay(PayRequest request)
        {
            var order = OrderService.Get(request.Id);
            var req   = new WeChatPayMicroPayRequest
            {
                OutTradeNo     = order.Order_SN,
                Body           = order.Name,
                TotalFee       = (int)(order.Order_Money * 100),
                SpBillCreateIp = App.Context.GetClientIp(),
                AuthCode       = request.AuthCode
            };

            logger.LogDebug($"Wepay MicroPay begin with: {request.Id}");
            var res = await client.ExecuteAsync(req, options.Value);

            if (res.ReturnCode == "SUCCESS" && res.ResultCode == "SUCCESS")
            {
                logger.LogDebug($"Wepay MicroPay end with: {request.Id} SUCCESS");
                return(new OrderResult
                {
                    Success = true,
                    Order = OrderService.Paidup(
                        order,
                        res.TransactionId,
                        (decimal)(res.TotalFee / 100.0),
                        res.TimeEnd,
                        PayType.Wechat
                        )
                });
            }

            logger.LogDebug($"Wepay MicroPay end with: {request.Id} Fail: {res.ErrCode}:{res.ErrCodeDes}");
            return(new OrderResult
            {
                Success = false,
                Error = $"{res.ErrCode}:{res.ErrCodeDes}"
            });
        }
示例#10
0
        public async Task <IActionResult> MicroPay(WeChatPayMicroPayViewModel viewModel)
        {
            var request = new WeChatPayMicroPayRequest
            {
                Body           = viewModel.Body,
                OutTradeNo     = viewModel.OutTradeNo,
                TotalFee       = viewModel.TotalFee,
                SpBillCreateIp = viewModel.SpBillCreateIp,
                AuthCode       = viewModel.AuthCode
            };
            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);

            // ViewData["response"] = response.Body;
            return(Ok(response.Body));
        }
示例#11
0
        public async Task <IActionResult> GetCertificates()
        {
            if (Request.Method == "POST")
            {
                var request  = new WeChatPayCertificatesRequest();
                var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);

                ViewData["response"] = response.Body;
                return(View());
            }

            return(View());
        }
示例#12
0
        // 刷卡支付
        public async Task <WeChatPayMicroPayResponse> MicroPay(PayRequest request)
        {
            var order = orderService.GetByRef(request.Id);
            var req   = new WeChatPayMicroPayRequest
            {
                OutTradeNo     = order.Order_SN,
                Body           = order.Name,
                TotalFee       = (int)(order.Pay_Money * 100),
                SpBillCreateIp = App.Context.GetClientIp(),
                AuthCode       = request.AuthCode
            };

            return(await client.ExecuteAsync(req, options.Value));
        }
示例#13
0
        public async Task <IActionResult> MicroPay(string out_trade_no, int total_fee, string body, string spbill_create_ip, string auth_code)
        {
            var request = new WeChatPayMicroPayRequest
            {
                Body           = body,
                OutTradeNo     = out_trade_no,
                TotalFee       = total_fee,
                SpbillCreateIp = spbill_create_ip,
                AuthCode       = auth_code
            };
            var response = await _client.ExecuteAsync(request);

            ResponseModel responseModel = new ResponseModel()
            {
                code = HTTPResponseCode.PartialContent,
                data = response.Body
            };

            Dictionary <string, string> result = new Dictionary <string, string>();

            result.Add("return_code", response.ReturnCode);
            result.Add("return_msg", response.ReturnMsg);

            if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
            {
                responseModel.code = HTTPResponseCode.Successful;
            }
            else
            {
                responseModel.code = HTTPResponseCode.BadRequest;
                result.Add("err_code", response.ErrCode);
                result.Add("err_code_des", response.ErrCodeDes);
            }
            responseModel.message = JsonConvert.SerializeObject(result);
            return(Json(responseModel));
        }
示例#14
0
        public async Task <IActionResult> AppPay(WeChatPayAppPayV3ViewModel viewModel)
        {
            var model = new WeChatPayTransactionsAppBodyModel
            {
                AppId  = _optionsAccessor.Value.AppId,
                MchId  = _optionsAccessor.Value.MchId,
                Amount = new Amount {
                    Total = viewModel.Total, Currency = "CNY"
                },
                Description = viewModel.Description,
                NotifyUrl   = viewModel.NotifyUrl,
                OutTradeNo  = viewModel.OutTradeNo,
            };

            var request = new WeChatPayTransactionsAppRequest();

            request.SetBodyModel(model);

            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);

            if (!response.IsError)
            {
                var req = new WeChatPayAppSdkRequest
                {
                    PrepayId = response.PrepayId
                };

                var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);

                // 将参数(parameter)给 ios/android端
                // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml
                ViewData["parameter"] = JsonSerializer.Serialize(parameter);
                ViewData["response"]  = response.Body;
                return(View());
            }

            ViewData["response"] = response.Body;
            return(View());
        }