以下是C#开发微信红包的源码
public ActionResult CashRedPack() { //post请求 string reqUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; string nonce_str = WeChatMPToken.createNonceStr();//随机字符串 string sign = ""; // string mch_billno = ""; //商户订单号 string mch_id = "555555"; //商户号 string wxappid = "yyyyyy"; //公众号appid string nick_name = "oo"; //提供方名称 string send_name = "oo"; //商户名称 string re_openid = "oAeN5js2Jlm7bK851l8sTLSfur64"; //用户openid int total_amount = 100; //付款金额 int min_value = 100; //红包最小的金额 int max_value = 100; //红包最大的金额 int total_num = 1; //红包发放的人数 string wishing = "送您的现金红包"; //红包祝福语 string client_ip = "192.168.0.1"; //ip地址 string act_name = "晒单返现"; //活动名称 string remark = "晒单返现第二波"; // 活动备注 string logo_imgurl = "https://mmbiz.qlogo.cn";// 商户logo的url 选填参数 DateTime now = DateTime.Now; Random don = new Random(); string str = string.Empty; for (int i = 0; i < 10; i++) { str += don.Next(0, 10); } mch_billno = mch_id + now.Year + now.Month + now.Day + str; //计算sign string stringSignTemp = string.Empty; stringSignTemp += "act_name=" + act_name; stringSignTemp += "&client_ip=" + client_ip; if (!string.IsNullOrEmpty(logo_imgurl)) { stringSignTemp += "&logo_imgurl=" + logo_imgurl; } stringSignTemp += "&max_value=" + max_value; stringSignTemp += "&mch_billno=" + mch_billno; stringSignTemp += "&mch_id=" + mch_id; stringSignTemp += "&min_value=" + min_value; stringSignTemp += "&nick_name=" + nick_name; stringSignTemp += "&nonce_str=" + nonce_str; stringSignTemp += "&re_openid=" + re_openid; stringSignTemp += "&remark=" + remark; stringSignTemp += "&send_name=" + send_name; stringSignTemp += "&total_amount=" + total_amount; stringSignTemp += "&total_num=" + total_num; stringSignTemp += "&wishing=" + wishing; stringSignTemp += "&wxappid=" + wxappid; stringSignTemp += "&key=" + "199Mimo3848zhrmdgje33djgifekdo9"; //这个是你的api密钥 //计算MD5值 sign = MD5Security.GetMD5(stringSignTemp).ToUpper(); string fuckyou = string.Empty; fuckyou = "<xml>"; fuckyou += "<act_name><![CDATA[" + act_name + "]]></act_name>"; fuckyou += "<client_ip><![CDATA[" + client_ip + "]]></client_ip>"; fuckyou += "<logo_imgurl><![CDATA[" + logo_imgurl + "]]></logo_imgurl>"; fuckyou += "<max_value><![CDATA[" + max_value + "]]></max_value>"; fuckyou += "<mch_billno><![CDATA[" + mch_billno + "]]></mch_billno>"; fuckyou += "<mch_id><![CDATA[" + mch_id + "]]></mch_id>"; fuckyou += "<min_value><![CDATA[" + min_value + "]]></min_value>"; fuckyou += "<nick_name><![CDATA[" + nick_name + "]]></nick_name>"; fuckyou += "<nonce_str><![CDATA[" + nonce_str + "]]></nonce_str>"; fuckyou += "<re_openid><![CDATA[" + re_openid + "]]></re_openid>"; fuckyou += "<remark><![CDATA[" + remark + "]]></remark>"; fuckyou += "<send_name><![CDATA[" + send_name + "]]></send_name>"; fuckyou += "<total_amount><![CDATA[" + total_amount + "]]></total_amount>"; fuckyou += "<total_num><![CDATA[" + total_num + "]]></total_num>"; fuckyou += "<wishing><![CDATA[" + wishing + "]]></wishing>"; fuckyou += "<wxappid><![CDATA[" + wxappid + "]]></wxappid>"; fuckyou += "<sign><![CDATA[" + sign + "]]></sign>"; fuckyou += "</xml>"; //System.Xml.Linq.XDocument xml = System.Xml.Linq.XDocument.Parse(fuckyou); //Stream xmlStream = new MemoryStream(); //xml.Save(xmlStream); //byte[] bytes = new byte[xmlStream.Length]; //xmlStream.Read(bytes, 0, bytes.Length); //// 设置当前流的位置为流的开始 //xmlStream.Seek(0, SeekOrigin.Begin); Encoding encoding = Encoding.UTF8; byte[] bytes = encoding.GetBytes(fuckyou); //发送post 请求 附带折证书 try { //string url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; string cert = @"C:\cert\apiclient_cert.p12"; string password = "10026591"; ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); X509Certificate cer = new X509Certificate(cert, password,X509KeyStorageFlags.MachineKeySet); HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(reqUrl); webrequest.ClientCertificates.Add(cer); webrequest.Method = "post"; webrequest.ContentLength = bytes.Length; webrequest.GetRequestStream().Write(bytes, 0, bytes.Length); HttpWebResponse webreponse = (HttpWebResponse)webrequest.GetResponse(); Stream stream = webreponse.GetResponseStream(); string resp = string.Empty; using (StreamReader reader = new StreamReader(stream)) { resp = reader.ReadToEnd(); } } catch (Exception exp) { } //解析xml return Json(new { isSuccess = 1 },JsonRequestBehavior.AllowGet); } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { if (errors == SslPolicyErrors.None) return true; return false; }
这里面可能有几个需要注意的地方 当初我开发的时候也是遇到了
1.0
int total_amount = 100; //付款金额 这里的金额 是一分 而不是元
int min_value = 100; //红包最小的金额
int max_value = 100; //红包最大的金额
红包的最大值和最小值要是相同的
2.0
string cert = @"C:\cert\apiclient_cert.p12"; 证书所存放的地址不能是桌面 估计是没有权限 如果是桌面会提示找不到证书(即使安装过)
3.0
切记 安装证书的时候选择本地计算机 而不是当前用户 否则加载不了
使用代码创建证书的时候 要选择从本地计算机加载
时间: 2024-08-25 01:10:09