C# 微信转账到零钱

简介

用于企业向微信用户个人付款 ,支持向指定微信用户的openid付款。

适用场景

在拥有某小程序或公众号内的用户的openid情况下,完成企业微信你对指定用户完成转账的场景。

C# 代码

	private const string mch_appid = ""; //商户账号的appid
	private const string mchid = ""; //商户号
	private const string key =""; //微信支付平台商家设置的私钥
	private string amount = ""; //转账金额,单位为分
	private string desc = ""; //付款备注
	private string openid = ""; //收款用户的openid
	private string re_user_name =""; //用户的真实姓名
	private string _requesturl="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; //请求微信接口地址
	private static string[] strs = new string[]
                                 {
                                  "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                                  "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
                                 };
                                 
	 /// <summary>
     /// 微信转账到零钱
     /// </summary>
	public static string WxPayToMoney()
        {
            try
            {
                IDictionary<string, string> moneyrequest = new Dictionary<string, string>();
                moneyrequest.Add("mch_appid", mch_appid); //商户账号的appid
                moneyrequest.Add("mchid", mchid); //商户号
                moneyrequest.Add("check_name", "FORCE_CHECK"); //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
                moneyrequest.Add("amount", amount); //转账金额,单位为分
                moneyrequest.Add("desc", desc);//付款备注
                moneyrequest.Add("nonce_str",CreateNonce_str());//随机字符串
                moneyrequest.Add("openid", openid);//收款用户openid
                moneyrequest.Add("partner_trade_no", DateTime.Now.ToString("yyyyMMddHHmmss")); //订单号
                //moneyrequest.Add("spbill_create_ip", "11.111.111.111"); //ip地址,可不传
                moneyrequest.Add("re_user_name", re_user_name);//收款用户姓名  
                moneyrequest.Add("sign", WePaySign(moneyrequest, key)); //设置签名
                return GetPostResult(moneyrequest, _requesturl);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

		/// <summary>
        /// 获取微信接口的返回参数
        /// </summary>
        /// <param name="data"></param>
        /// <param name="url"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        private static string GetPostResult(IDictionary<string, string> data, string url)
        {
            try
            {
                string _req_data = "<xml>";
                //遍历定义模型的属性
                foreach (KeyValuePair<string, string> kvp in data)
                {
                    _req_data += "<" + kvp.Key + ">" + kvp.Value + "</" + kvp.Key + ">";
                }
                _req_data += "</xml>";
                string response = CreatePostHttpResponse(url, _req_data, int.MaxValue, null, Encoding.UTF8);
                return response;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

 		/// <summary>  
        /// 创建POST方式的HTTP请求  
        /// </summary>  
        /// <param name="url">请求的URL</param>  
        /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>  
        /// <param name="timeout">请求的超时时间</param>  
        /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
        /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>  
        /// <returns></returns>  
 		public static string CreatePostHttpResponse(string url, string parameters, int? timeout, string userAgent, Encoding requestEncoding)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }
            if (requestEncoding == null)
            {
                throw new ArgumentNullException("requestEncoding");
            }
            HttpWebRequest request = null;
            //证书配置
            string cert = @""; //证书路径
            string password = ""; //证书密码
            X509Certificate cer = new X509Certificate(cert, password);
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            //如果是发送HTTPS请求  
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                request = WebRequest.Create(url) as HttpWebRequest;
                request.ProtocolVersion = HttpVersion.Version10;
            }
            else
            {
                request = WebRequest.Create(url) as HttpWebRequest;
            }
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ClientCertificates.Add(cer);
            if (!string.IsNullOrEmpty(userAgent))
            {
                request.UserAgent = userAgent;
            }
            else
            {
                request.UserAgent = DefaultUserAgent;
            }
            if (timeout.HasValue)
            {
                request.Timeout = timeout.Value;
            }
            //如果需要POST数据  
            if (!string.IsNullOrEmpty(parameters))
            {
                string buffer = parameters;
                byte[] data = requestEncoding.GetBytes(buffer.ToString());
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
            }
            StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream(), requestEncoding);
            string da = reader.ReadToEnd();

            CommonHelper.Log(da);
            return da;
        }
		
        /// <summary>  
        /// 创建随机字符串  
        /// </summary>  
        /// <returns></returns>  
        public static string CreateNonce_str()
        {
            Random r = new Random();
            var sb = new StringBuilder();
            var length = strs.Length;
            for (int i = 0; i < 15; i++)
            {
                sb.Append(strs[r.Next(length - 1)]);
            }
            return sb.ToString();
        }

 		/// <summary>
        /// 微信签名算法
        /// </summary>
        /// <param name="InDict"></param>
        /// <param name="TenPayV3_Key"></param>
        /// <returns></returns>
        private static string WePaySign(IDictionary<string, string> InDict, string TenPayV3_Key)
        {
            Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);
            packageReqHandler.Init();
            var StrA = new StringBuilder();
            InDict = InDict.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
            foreach (KeyValuePair<string, string> kvp in InDict)
            {
                if (kvp.Value != null || !string.IsNullOrEmpty(kvp.Value))
                {
                    StrA.Append(string.Format("{0}={1}&", kvp.Key, kvp.Value));
                }
            }
            StrA.Append("key=" + TenPayV3_Key); //注:key为商户平台设置的密钥key
            return MakeSign(StrA.ToString());
        }
        
		/// <summary>
        /// 签名MD5加密并全部转换成大写
        /// </summary>
        /// <param name="signValue"></param>
        /// <returns></returns>
        private static string MakeSign(string signValue)
        {
            //MD5加密
            var md5 = MD5.Create();
            var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(signValue));
            var sb = new StringBuilder();
            foreach (byte b in bs)
            {
                sb.Append(b.ToString("x2"));
            }
            //所有字符转为大写
            return sb.ToString().ToUpper();
        }

注:部分转载于网络

发布了4 篇原创文章 · 获赞 7 · 访问量 40

猜你喜欢

转载自blog.csdn.net/qq_41470939/article/details/105551198
今日推荐