【原創分享·微信支付】C# MVC 微信支付教程系列之現金紅包


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

紅包發放說明

用於企業向微信用戶個人發現金紅包

目前支持向指定微信用戶的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
這一段呢,就是告訴你,小盆友們,我這個是http請求的,所以,要用到 HttpWebRequest  這玩意,如果你不懂,哼哼,我也不會給demo你的,自己度娘去(是不是想罵他,那你罵吧,別罵我就行,因為接下來,我告訴你怎么整) 。接下來呢,這次這好家伙,需要用到證書了,這個怎么用啊,證書怎么添加啊,還是一頭霧水是吧?那您繼續罵,罵夠了,咱繼續往下走。接下來,請求方式,是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) 備注信息
這里面呢,就是請求的參數了,每個都有相應的解釋,所以,我就不多講了。然后呢,這些個參數就是讓你傳參的,但是我們弄好之后呢,到底是傳一個對象呢,還是字符串呢?一般用過請求的同伴都知道是字符串的格式,字符串也有好幾種,分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;
            }
        }  

 

 
 好,到此大功告成,下面是紅包發送的截圖:
 
 
到這里,就大功告成啦,接下來的東西,就由大家自己去展開拓展了,本次經驗分享到此結束,如果覺得寫得不錯,或者對你有幫助,請點“好文要頂”或者“關注我”,順帶也可以評論一兩句,大家互相交流交流, 轉載請保留原作者地址以及姓名
 
 
需要實時測試的,可以關注公眾號,測試相關功能(根據實際情況,可能會不定時更新程序,如果需要最新程序的,可以加群聯系,QQ群號在上面):
 
 
 

 

 
 
我新建一個QQ群,如果有問題,可以在群里提。如果合適,也會根據大家提的比較多的問題,來寫篇博文,幫助更多的人,群號:275523437
點擊鏈接加入群【.Net,MVC,EasyUI,MUI,Html,JS】http://jq.qq.com/?_wv=1027&k=2A0RbLd
 
 
(如果有私活,或者一起合作的,也可以私信找我呀,嘿嘿);
 
作者:南宮蕭塵  
E-mail:314791147@qq.com
QQ:314791147
日期:2016-05-27

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM