紅包發放說明
用於企業向微信用戶個人發現金紅包
目前支持向指定微信用戶的openid發放指定金額紅包。(獲取openid參見微信公眾平台開發者文檔:網頁授權獲取用戶基本信息)
如需操作請登錄https://pay.weixin.qq.com/
這第一段話:第一、就是告訴你們,現在紅包,只能通過openid來發,不能通過我們的微信號(微信號是你的唯一id,在自己微信上可以看得到,openid也是唯一,但是在自己的微信上看不到,只能通過接口來獲取自己的openid,至於怎么后去,上面有鏈接,可以通過網頁授權來獲取)來發紅包。第二呢,就是告訴你,你要知道怎么后去openid。這個怎么獲取openid,我這里就不介紹了,這個屬於微信支付最基礎的了,如果你獲取不到openid,那么基本上所有功能你都做不了。如果不知道怎么弄的,還是看看官方的文檔,或者百度找找。我記得,好像我也有寫過相關的教程,但是我不記得有沒有發在博客園了。好了,先不扯這個。
接下來,看完了段話,我們來看真正的API,如下:
接口調用請求說明
請求Url | https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack |
---|---|
是否需要證書 | 是(證書及使用說明詳見商戶證書) |
請求方式 | POST |
請求參數
字段名 | 字段 | 必填 | 示例值 | 類型 | 說明 |
---|---|---|---|---|---|
隨機字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 隨機字符串,不長於32位 |
簽名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 詳見簽名生成算法 |
商戶訂單號 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商戶訂單號(每個訂單號必須唯一) 組成:mch_id+yyyymmdd+10位一天內不能重復的數字。 接口根據商戶訂單號支持重入,如出現超時可再調用。 |
商戶號 | mch_id | 是 | 10000098 | String(32) | 微信支付分配的商戶號 |
公眾賬號appid | wxappid | 是 | wx8888888888888888 | String(32) | 微信分配的公眾賬號ID(企業號corpid即為此appId)。接口傳入的所有appid應該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 |
商戶名稱 | send_name | 是 | 天虹百貨 | String(32) | 紅包發送者名稱 |
用戶openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接受紅包的用戶 用戶在wxappid下的openid |
付款金額 | total_amount | 是 | 1000 | int | 付款金額,單位分 |
紅包發放總人數 | total_num | 是 | 1 | int | 紅包發放總人數 total_num=1 |
紅包祝福語 | wishing | 是 | 感謝您參加猜燈謎活動,祝您元宵節快樂! | String(128) | 紅包祝福語 |
Ip地址 | client_ip | 是 | 192.168.0.1 | String(15) | 調用接口的機器Ip地址 |
活動名稱 | act_name | 是 | 猜燈謎搶紅包活動 | String(32) | 活動名稱 |
備注 | remark | 是 | 猜越多得越多,快來搶! | String(256) | 備注信息 |
數據示例:
<xml>
<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
<mch_id><![CDATA[888]]></mch_id>
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>
<send_name><![CDATA[send_name]]></send_name>
<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
<total_amount><![CDATA[200]]></total_amount>
<total_num><![CDATA[1]]></total_num>
<wishing><![CDATA[恭喜發財]]></wishing>
<client_ip><![CDATA[127.0.0.1]]></client_ip>
<act_name><![CDATA[新年紅包]]></act_name>
<remark><![CDATA[新年紅包]]></remark>
<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
</xml>

/// <summary> /// 發送微信紅包 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSendRedPack_Click(object sender, EventArgs e) { string strData = GetJsApiParameters(); string strUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";//這個就是發送紅包的API接口了 string strResult = WxRedPackPost(strUrl, strData); }
/// <summary> /// 構造參數 /// </summary> /// <returns></returns> public string GetJsApiParameters() { int iMin = 1000; int iMax = 9999; Random rd = new Random();//構造隨機數 string strMch_billno = WxPayConfig.MCHID + DateTime.Now.ToString("yyyyMMddHHmmss") + rd.Next(iMin, iMax).ToString(); WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("act_name", "活動名稱:功能測試");//活動名稱 jsApiParam.SetValue("client_ip", "192.168.1.216");//這里填寫的是我本機的內網ip,實際應用不知道需不需要改。 jsApiParam.SetValue("mch_billno", strMch_billno);//商戶訂單號,商戶訂單號(每個訂單號必須唯一)組成:mch_id+yyyymmdd+10位一天內不能重復的數字。 接口根據商戶訂單號支持重入,如出現超時可再調用。 jsApiParam.SetValue("mch_id", WxPayConfig.MCHID);//商戶號,微信支付分配的商戶號 jsApiParam.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//隨機字符串,不長於32位 jsApiParam.SetValue("remark", "備注信息,梁明曉");//備注信息 jsApiParam.SetValue("re_openid", "oZk_xsvzIqH2Xz_RPycJEYuTHAXx");//接收者的openid jsApiParam.SetValue("send_name", "雅達電子");//商戶名稱,紅包發送者名稱 jsApiParam.SetValue("total_amount", 100);//紅包金額,單位分 jsApiParam.SetValue("total_num", 1);//紅包發放總人數 jsApiParam.SetValue("wishing", "感謝您參加猜燈謎活動,祝您元宵節快樂!");//紅包祝福語 jsApiParam.SetValue("wxappid", WxPayConfig.APPID);//公眾賬號appid,微信分配的公眾賬號ID(企業號corpid即為此appId)。接口傳入的所有appid應該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 jsApiParam.SetValue("sign", jsApiParam.MakeSign());//簽名,切記,這個簽名參數必須放在最后,因為他生成的簽名,跟前面的參數有關系 string parameters = jsApiParam.ToXml(); return parameters; }

/// <summary> /// 提交請求 /// </summary> /// <param name="posturl"></param> /// <param name="postData"></param> /// <returns></returns> public string WxRedPackPost(string posturl, string postData) { Stream outstream = null; Stream instream = null; StreamReader sr = null; HttpWebResponse response = null; HttpWebRequest request = null; Encoding encoding = Encoding.UTF8; byte[] data = encoding.GetBytes(postData); // 准備請求... try { //CerPath證書路徑,這里是本機的路徑,實際應用中,按照實際情況來填寫 string certPath = @"F:\Jeffrey9061\SVN\Project\CompanyProject\西安培華微信用戶實時更新客戶端\西安培華微信用戶實時更新客戶端\" + WxPayConfig.SSLCERT_PATH; //證書密碼 string password = WxPayConfig.SSLCERT_PASSWORD; X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(certPath, password, X509KeyStorageFlags.MachineKeySet); // 設置參數 request = WebRequest.Create(posturl) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer;//不可少(個人理解為,返回的時候需要驗證) request.AllowAutoRedirect = true; request.Method = "POST"; request.ContentType = "text/xml"; request.ContentLength = data.Length; request.ClientCertificates.Add(cert);//添加證書請求 outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Close(); //發送請求並獲取相應回應數據 response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標網頁發送Post請求 instream = response.GetResponseStream(); sr = new StreamReader(instream, encoding); //返回結果網頁(html)代碼 string content = sr.ReadToEnd(); string err = string.Empty; return content; } catch (Exception ex) { string err = ex.Message; return string.Empty; } }



