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