微信支付教程系列之現金紅包

 目錄

(一)微信公衆號開發之VS遠程調試
(二)微信公衆號開發之基礎梳理
(三)微信公衆號開發之自動消息回覆和自定義菜單
(四)微信公衆號開發之網頁受權獲取用戶基本信息
(五)微信公衆號開發之網頁中及時獲取當前用戶Openid及注意事項
(六)微信公衆號開發之掃碼支付
(七)微信公衆號開發之公衆號支付
(八)微信公衆號開發之現金紅包
(九)微信公衆號開發之回覆圖文消息(被動)

微信支付教程系列之現金紅包

        最近最弄這個微信支付的功能,而後掃碼、公衆號支付,這些都作了,閒着無聊,就看了看微信支付的其餘功能,發現還有一個叫「現金紅包」的玩意,想着本身平時也喜歡發紅包玩玩,可是就沒試過寫程序來實現,因此,心中就萌發了這個,搞一搞微信紅包的功能,想嘗試一下。
 
         首先,先去查看的,固然是官方的API了,可是看了以後,心中跟之前初次接觸微信支付那樣,心中萬頭草泥馬在奔騰。咱們想哈,一個這麼大的公司,我相信大家不缺技術人員吧,爲何大家就不能每一個功能模塊,按照語言大類,分別寫一個demo出來呢?你特麼,就簡簡單單的寫幾個接口給「咱們」看。其中,爲啥,「咱們」要加雙引號呢?由於,我以爲啊,騰訊這邊,寫的這個文檔,只給那些有四、5年工做經驗以上的,老手,對代碼和程序很是熟悉的人看的。由於,剛出來工做,或者才工做一兩年的,看這些接口,真特麼的是一頭霧水的。不知道我寫的這些,騰訊公司的人會不會看獲得,看到了,會不會找我去面談呢?畢竟,我也是準備過深圳發展的人,O(∩_∩)O哈哈~
 
         後來,不費話了,我貼一下官方的API來給看看,地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5
 
 

紅包發放說明

用於企業向微信用戶我的發現金紅包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
這一段呢,就是告訴你,小盆友們,我這個是http請求的,因此,要用到HttpWebRequest  這玩意,若是你不懂,哼哼,我也不會給demo你的,本身度娘去(是否是想罵他,那你罵吧,別罵我就行,由於接下來,我告訴你怎麼整)。接下來呢,此次這好傢伙,須要用到證書了,這個怎麼用啊,證書怎麼添加啊,仍是一頭霧水是吧?那您繼續罵,罵夠了,咱繼續往下走。接下來,請求方式,是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) 備註信息
這裏面呢,就是請求的參數了,每一個都有相應的解釋,因此,我就很少講了。而後呢,這些個參數就是讓你傳參的,可是咱們弄好以後呢,究竟是傳一個對象呢,仍是字符串呢?通常用過請求的同伴都知道是字符串的格式,字符串也有好幾種,分json和xml,此次微信支付裏面用到的就是xml了,咱們看他的demo,以下:

數據示例:

<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>

經過上面,咱們就很詳細的知道,咱們要的是xml了,很是幸運的是,微信支付的demo裏面,有這個轉xml的代碼,因此,下面個人代碼裏面,就直接用他的了。接下來,咱們就開始實戰了。
首先,咱們就新建一個窗體(雖然我用窗體,可是用在web上,也是同樣通用的)來,以下:
而後雙擊「測試微信紅包」,自動生成代碼如嚇:
       
複製代碼
 /// <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); } 
複製代碼

 

 
上面的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; }
複製代碼

 

上述這些:WxPayData,WxPayConfig,WxPayApi是在微信支付的demo中直接拿過來用的,大家也直接拿過來用就行,官方demo下載地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
缺乏的代碼就剩下:WxRedPackPost這個了,也會給你,通通都給你,O(∩_∩)O哈哈~( 記住哈,改寫的,我都寫了註釋,本身認真看)
       
複製代碼
     /// <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; } } 
複製代碼

 

 
 好,到此大功告成,下面是紅包發送的截圖:
 
原文地址:https://www.cnblogs.com/nangong/p/1a2add4356c7bcbab5990c89cbe37d38.html
相關文章
相關標籤/搜索