简介
用于企业向微信用户个人付款 ,支持向指定微信用户的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();
}
注:部分转载于网络