net版本 微信现金红包接口调用的时候,老是出现签名错误
创建签名 所使用到的几个方法
string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; //随机字符串 string nonce_str = CreateRandomCode(32); //商户号 string mch_id = "111111111111"; //商户订单号 string mch_billno = mch_id + DateTime.Now.ToString("yyyyMMdd") + Rand();//自己生成把 //公众账号appid string wxappid = "222222222222222222222"; //提供方名称 string nick_name = "提供方名称"; //商户名称 string send_name = "商户名称"; //用户openid string re_openid = s.open_id; //付款金额 这里要注意 提现是 1 - 200元 ,但是这里的单位是 “分” string total_amount = (money * 100).ToString(); //最小红包金额 string min_value = (money * 100).ToString(); //最大红包金额 string max_value = (money * 100).ToString(); //红包发放总人数 string total_num = "1"; //红包祝福语 string wishing = "活动名称"; string client_ip = "192.168.10.0"; //活动名称 string act_name = "活动名称"; //备注 string remark = "提现问题,请联系客服人员"; Dictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("act_name", act_name); parameters.Add("client_ip", client_ip); parameters.Add("min_value", min_value); parameters.Add("max_value", max_value); parameters.Add("mch_billno", mch_billno); parameters.Add("mch_id", mch_id); parameters.Add("nonce_str", nonce_str); parameters.Add("nick_name", nick_name); parameters.Add("re_openid", re_openid); parameters.Add("remark", remark); parameters.Add("send_name", send_name); parameters.Add("total_num", total_num); parameters.Add("total_amount", total_amount); parameters.Add("wishing", wishing); parameters.Add("wxappid", wxappid); //生成签名 string sign = CreateSignString(parameters, "自己的 API密钥 ");
提供一个 加密的方法 CreateSignString
static string CreateSignString(Dictionary<string, string> parameters, string paySecret) { foreach (var key in parameters.Keys.Where(key => string.IsNullOrEmpty(parameters[key]))) { parameters.Remove(key); } //第一步,设所有収送戒者接收到的数据为集合 M,将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序), //使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串 stringA。 //特别注意以下重要规则: //1.参数名 ASCII 码从小到大排序(字典序) ; //2.如果参数的值为空不参与签名; //3.参数名区分大小写; //4.验证调用返回戒微信主劢通知签名时,传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验。 var keyArray = parameters.Keys.ToArray(); Array.Sort(keyArray); var keyString = keyArray.Aggregate("", (current, t) => current + (t + "=" + parameters[t] + "&")); //第二步,在 stringA 最后拼接上 key=商户支付密钥得到 stringSignTemp 字符串, //并对 stringSignTemp 进行 MD5 运算,再将得到的字符串所有字符转换为大写,得到 sign的值 signValue keyString += "key=" + paySecret; return toMD5(keyString).ToUpper(); } public static string toMD5(string str) { byte[] md5Bytes = Encoding.UTF8.GetBytes(str); MD5 md5 = new MD5CryptoServiceProvider(); byte[] cryptString = md5.ComputeHash(md5Bytes); int len; string temp = String.Empty; len = cryptString.Length; for (int i = 0; i < len; i++) { temp += cryptString[i].ToString("X2"); } return temp; }
随机数
public string CreateRandomCode(int codeCount, int flag = 0) { string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z"; if (flag == 1) { allChar = "0,1,2,3,4,5,6,7,8,9"; } //里面的字符你可以自己加啦 string[] allCharArray = allChar.Split(','); string randomCode = ""; int temp = -1; Random random = new Random(); for (int i = 0; i < codeCount; i++) { if (temp != -1) { random = new Random(i * temp * (int)DateTime.Now.Ticks); } int t = random.Next(35); if (temp == t) { return CreateRandomCode(codeCount); } temp = t; randomCode += allCharArray[temp]; } return randomCode; } public string Rand() { string all = "0,1,2,3,4,5,6,7,8,9"; string[] allChar = all.Split(','); string result = ""; Random rand = new Random(); for (int i = 0; i < 10; i++) { result += allChar[rand.Next(9)]; } return result; }
请求api 带证书的方法
public string OpenReadWithHttps(string URL, string strPostdata, string strEncoding) { try { Encoding encoding = Encoding.UTF8; string cert = @"D:\apiclient_cert.p12"; string password = " 这里是填写的是 微信支付商户号 "; ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); X509Certificate cer = new X509Certificate(cert, password); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); request.ClientCertificates.Add(cer); request.Method = "post"; request.Accept = "text/html, application/xhtml+xml, */*"; request.ContentType = "application/x-www-form-urlencoded"; byte[] buffer = encoding.GetBytes(strPostdata); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding(strEncoding))) { return reader.ReadToEnd(); } } catch (Exception e) { return ""; } }