Example #1
0
        /// <summary>
        /// 用于企业向微信用户个人付款
        /// 目前支持向指定微信用户的openid付款
        /// </summary>
        /// <param name="dataInfo">微信支付需要post的xml数据</param>
        /// <param name="timeOut"></param>
        /// <returns></returns>
        public async Task <TransfersResult> TransfersAsync(int tenantId, TenPayV3TransfersRequestData dataInfo)
        {
            var          urlFormat     = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
            var          data          = dataInfo.PackageRequestHandler.ParseXML();
            var          formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
            MemoryStream memoryStream  = new MemoryStream();

            memoryStream.Write(formDataBytes, 0, formDataBytes.Length);
            memoryStream.Seek(0, SeekOrigin.Begin);//设置指针读取位置

            //本地或者服务器的证书位置(证书在微信支付申请成功发来的通知邮件中)
            string cert = await SettingManager.GetSettingValueForTenantAsync(WechatSettings.Pay.SslcertPath, tenantId);

            //私钥(在安装证书时设置)
            string password = dataInfo.MchId;

            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            //调用证书
            X509Certificate2 x509Certificate2 = new X509Certificate2(
                PathHelper.GetAbsolutePath(cert),
                password,
                X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);

            string          resultXml       = RequestUtility.HttpPost(urlFormat, null, memoryStream, null, null, Encoding.UTF8, x509Certificate2, Config.TIME_OUT);
            TransfersResult transfersResult = new TransfersResult(resultXml);

            return(transfersResult);
        }
Example #2
0
        /// <summary>
        /// 微信转账
        /// </summary>
        /// <param name="request">请求</param>
        /// <param name="config">配置</param>
        /// <returns>结果</returns>
        public static TransfersResult Transfers(TransfersRequest request, Config config)
        {
            TransfersResult       result = new TransfersResult();
            TransfersQueryRequest transfersQueryRequest = new TransfersQueryRequest
            {
                PartnerTradeNo = request.PartnerTradeNo
            };
            TransfersQueryResult transfersQueryResult = TransfersQuery(transfersQueryRequest, config);

            if (transfersQueryResult.Status == TransfersStatus.Success)
            {
                result.IsSuccess = TransfersStatus.Success;
                return(result);
            }
            if (transfersQueryResult.Status == TransfersStatus.Processing)
            {
                result.IsSuccess = TransfersStatus.Processing;
                return(result);
            }

            var requestStr = TenpayUtil.GetTransfersRequestXml(request, config);
            var response   = HttpHelp.PostXmlToUrl(Config.TransfersUrl, requestStr, config.GetTransfersCertPath(), config.GetPid());

            result = TenpayUtil.ConvertToTransfersResult(response);
            return(result);
        }
Example #3
0
        public async Task Withdraw(WalletRecord walletRecord)
        {
            using (CurrentUnitOfWork.SetTenantId(walletRecord.TenantId))
            {
                string appId = await SettingManager.GetSettingValueForTenantAsync(WechatSettings.General.AppId, walletRecord.TenantId);

                string mchId = await SettingManager.GetSettingValueForTenantAsync(WechatSettings.Pay.MchId, walletRecord.TenantId);

                string key = await SettingManager.GetSettingValueForTenantAsync(WechatSettings.Pay.Key, walletRecord.TenantId);

                UserLogin userLogin = userLoginRepository.GetAll().Where(model => model.UserId == walletRecord.UserId &&
                                                                         model.LoginProvider == "Weixin").FirstOrDefault();

                if (userLogin == null)
                {
                    throw new Exception(L("TheUserHasNoWeixinLogin"));
                }
                string openId = userLogin.ProviderKey;
                string nonce  = TenPayV3Util.GetNoncestr();

                TenPayV3TransfersRequestData TenPayV3TransfersRequestData = new TenPayV3TransfersRequestData(
                    appId,
                    mchId,
                    null,
                    nonce,
                    walletRecord.SerialNumber,
                    openId,
                    key,
                    "NO_CHECK",
                    null,
                    (int)(-walletRecord.Money),
                    L("Withdraw"),
                    IPHelper.GetAddressIP());
                TransfersResult transfersResult = await TransfersAsync(walletRecord.TenantId, TenPayV3TransfersRequestData);

                if (transfersResult.return_code == "FAIL")
                {
                    WalletManager.WithdrawNotify(walletRecord, false, transfersResult.return_msg);
                }
                bool success = transfersResult.result_code == "FAIL" ? false : true;
                WalletManager.WithdrawNotify(walletRecord, success, transfersResult.err_code_des);
            }
        }
Example #4
0
        /// <summary>
        /// 微信转账解密结果
        /// </summary>
        /// <param name="xml">xml</param>
        /// <returns>微信转账解密结果</returns>
        public static TransfersResult ConvertToTransfersResult(string xml)
        {
            TransfersResult transfersQueryResult = new TransfersResult();

            if (xml == null)
            {
                transfersQueryResult.IsSuccess = TransfersStatus.Processing;
                transfersQueryResult.Message   = "注意1-当返回错误码为“SYSTEMERROR”时,一定要使用原单号重试,否则可能造成重复支付等资金风险。";
            }
            else
            {
                XElement doc        = XElement.Parse(xml);
                var      returnCode = doc.Element("return_code").GetString();
                if (returnCode == "SUCCESS")
                {
                    if (doc.Element("err_code").GetString() == "SYSTEMERROR")
                    {
                        transfersQueryResult.IsSuccess = TransfersStatus.Processing;
                        transfersQueryResult.Message   = "注意1-当返回错误码为“SYSTEMERROR”时,一定要使用原单号重试,否则可能造成重复支付等资金风险。";
                    }
                    else if (doc.Element("result_code").GetString() == "SUCCESS")
                    {
                        transfersQueryResult.IsSuccess      = TransfersStatus.Success;
                        transfersQueryResult.PartnerTradeNo = doc.Element("partner_trade_no").GetString();
                        transfersQueryResult.TransactionId  = doc.Element("payment_no").GetString();
                        transfersQueryResult.PaymentTime    = doc.Element("payment_time").GetDateTime();
                    }
                    else
                    {
                        transfersQueryResult.IsSuccess = TransfersStatus.Falied;
                        transfersQueryResult.Message   = doc.Element("err_code_des").GetString();
                    }
                }
                else
                {
                    transfersQueryResult.IsSuccess = TransfersStatus.Falied;
                    transfersQueryResult.Message   = doc.Element("return_msg").GetString();
                }
            }
            return(transfersQueryResult);
        }