/// <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);
        }
Beispiel #2
0
        /// <summary>
        /// 企业付款
        /// </summary>
        /// <param name="outTradeNo">流水号</param>
        /// <param name="openId"></param>
        /// <param name="amount">金额 decimal(单位 元,最少一元起付)</param>
        /// <param name="desc">描述</param>
        /// <param name="ip">请求Ip</param>
        /// <returns></returns>
        public static string Transfers(string outTradeNo, string openId, decimal amount, string desc, string ip)
        {
            try
            {
                const string deviceInfo  = "";
                string       nonceStr    = TenPayV3Util.GetNoncestr();
                var          xmlDataInfo = new TenPayV3TransfersRequestData(
                    WxOpenId,   //商户账号appid
                    MchId,      //商户号
                    deviceInfo, //设备号 非必填
                    nonceStr,   //随机字符串
                    outTradeNo, //partner_trade_no商户订单号(只能是字母或者数字,不能包含有符号)
                    openId,     //
                    MchIdkey,   //商户号key
                    "NO_CHECK", // 校验用户姓名选项 NO_CHECK:不校验真实姓名
                    "",         //收款用户姓名
                    amount,     //金额
                    desc,       //企业付款描述信息
                    ip          //调用接口的机器Ip地址
                    );

                string cert    = CertPath;     //证书绝对路径
                string certPwd = CertPassword; //证书密码
                var    result  = TenPayV3.Transfers(xmlDataInfo, cert, certPwd);
                Log.WriteLogToTxt("企业付款 result:" + JsonHelper.ToJson(result), LogType.Info);
                return(result.result_code == "SUCCESS" ? "成功" : result.err_code_des);
            }
            catch (Exception ex)
            {
                WxWriteLogError(ex, "异常企业付款");
            }
            return("");
        }
        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);
            }
        }