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