用於企業向微信用戶我的發現金紅包php
目前支持向指定微信用戶的openid發放指定金額紅包。(獲取openid參見微信公衆平臺開發者文檔:網頁受權獲取用戶基本信息)html
如需操做請登陸https://pay.weixin.qq.com/web
這第一段話:第1、就是告訴大家,如今紅包,只能經過openid來發,不能經過咱們的微信號(微信號是你的惟一id,在本身微信上能夠看獲得,openid也是惟一,可是在本身的微信上看不到,只能經過接口來獲取本身的openid,至於怎麼後去,上面有連接,能夠經過網頁受權來獲取)來發紅包。第二呢,就是告訴你,你要知道怎麼後去openid。這個怎麼獲取openid,我這裏就不介紹了,這個屬於微信支付最基礎的了,若是你獲取不到openid,那麼基本上全部功能你都作不了。若是不知道怎麼弄的,仍是看看官方的文檔,或者百度找找。我記得,好像我也有寫過相關的教程,可是我不記得有沒有發在博客園了。好了,先不扯這個。算法
接下來,看完了段話,咱們來看真正的API,以下:json
請求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) | 商戶訂單號(每一個訂單號必須惟一)api 組成:mch_id+yyyymmdd+10位一天內不能重複的數字。微信 接口根據商戶訂單號支持重入,如出現超時可再調用。cookie |
商戶號 | 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) | 接受紅包的用戶app 用戶在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; } }