C#開發微信門戶及應用(34)--微信裂變紅包

在上篇隨筆《C#開發微信門戶及應用(33)--微信現金紅包的封裝及使用》介紹了普通現金紅包的封裝和使用,這種紅包只能單獨一次發給一我的,用戶獲取了紅包就完成了,若是咱們讓用戶收到紅包後,能夠繼續發送給多個用戶,讓他們得到固定或者隨機金額的操做,這種稱之爲裂變紅包。本篇隨筆繼續上面的主題,繼續介紹其中裂變紅包的C#代碼封裝和使用操做。php

一、裂變紅包介紹

領到企業裂變紅包的用戶,能夠繼續幫好友領紅包,將企業紅包以裂變形式散播給更多好友,賦予營銷更多的趣味和愉悅!裂變紅包不斷強化企業品牌效應並造成裂變性傳播,是品牌宣傳的營銷利器。企業只須要指定一組紅包的個數和總金額,由微信支付計算出各紅包金額,簡單方便。html

微信支付裂變紅包向微信支付商戶開發,具體能力以下: json

一、商戶調用接口時,經過指定發送金額以及指定一位發送對象的方式發放一組裂變紅包api

二、指定發送對象領取到紅包後,資金直接進入微信零錢,帶給用戶微信支付原生的流暢體驗服務器

三、指定發送對象可以將組合中的剩餘紅包分享給好友,好友可繼續領取,造成傳播效應,放大企業品牌價值微信

裂變紅包的整體處理過程及接口和普通的現金紅包差異不太大,理解了現金紅包,對裂變紅包的封裝和使用過程應該是很容易的事情。微信開發

 

裂變紅包接口,用於企業向微信用戶我的發裂變紅包app

目前支持向指定微信用戶的openid發放指定金額裂變紅包。(獲取openid參見微信公衆平臺開發者文檔: 網頁受權獲取用戶基本信息微信公衆平臺

接口參數與用戶領用實際效果對應關係以下:post

接口調用請求說明

請求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack
是否須要證書 是(證書及使用說明詳見商戶證書
請求方式 POST

和前面介紹的現金紅包同樣,咱們也能夠把裂變紅包的參數分爲兩個部分,一個是常規參數,一個是業務參數,以下所示。

二、裂變紅包的C#代碼封裝

從上面的傳遞參數咱們能夠把它分兩部分,當咱們傳入下面的參數後

<xml> 
   <sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
   <mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
   <mch_id><![CDATA[1000888888]]></mch_id>
   <wxappid><![CDATA[wxcbda96de0b165486]]></wxappid> 
   <send_name><![CDATA[send_name]]></send_name> 
   <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid> 
   <total_amount><![CDATA[600]]></total_amount> 
   <amt_type><![CDATA[ALL_RAND]]></amt_type> 
   <total_num><![CDATA[3]]></total_num> 
   <wishing><![CDATA[恭喜發財]]></wishing>
   <act_name><![CDATA[新年紅包]]></act_name> 
   <remark><![CDATA[新年紅包]]></remark> 
   <nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str> 
</xml>

上面的傳入參數提交給地址:https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack 後,成功後會返回下面的XML。

<xml> 
   <return_code><![CDATA[SUCCESS]]></return_code> 
   <return_msg><![CDATA[發放成功.]]></return_msg> 
   <result_code><![CDATA[SUCCESS]]></result_code> 
   <err_code><![CDATA[0]]></err_code> 
   <err_code_des><![CDATA[發放成功.]]></err_code_des> 
   <mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno> 
   <mch_id>10010404</mch_id> 
   <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> 
   <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid> 
   <total_amount>3</total_amount> 
   <send_time><![CDATA[20150227091010]]></send_time>
   <send_listid><![CDATA[1000000000201502270093647546]]></send_listid>
</xml> 

若是失敗的時候,那麼返回的XML就少了不少信息,以下所示。

<xml>
   <return_code><![CDATA[FAIL]]></return_code>
   <return_msg><![CDATA[系統繁忙,請稍後再試.]]></return_msg>
   <result_code><![CDATA[FAIL]]></result_code>
   <err_code><![CDATA[268458547]]></err_code>
   <err_code_des><![CDATA[系統繁忙,請稍後再試.]]></err_code_des>
   <mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno>
   <mch_id>10010404</mch_id>
   <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>
   <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
   <total_amount>3</total_amount>
</xml>

根據這些規則,咱們對裂變紅包的接口和實現代碼進行了封裝,以便更好的使用。

例如咱們根據普通現金紅包和裂變紅包的實體類類似的特色,咱們設計了幾個類來存儲信息,傳入參數的對象關係以下圖所示。

一樣,對於返回的發送紅包結果,因爲須要考慮在錯誤的時候的信息返回和成功的信息返回,咱們設計了返回結果類的關係以下所示。

根據上面的設計思路,咱們設計的類代碼以下所示。

    /// <summary>
    /// 發送裂變紅包的數據信息
    /// </summary>
    public class SendGroupRedPackJson : BaseRedPackJson
    {     
        /// <summary>
        /// 紅包金額設置方式
        /// ALL_RAND—所有隨機,商戶指定總金額和紅包發放總人數,由微信支付隨機計算出各紅包金額
        /// </summary>
        public string amt_type { get; set; }

        public SendGroupRedPackJson()
        {
            this.amt_type = "ALL_RAND";
        }
    }

結果對象類的代碼以下所示。

    /// <summary>
    /// 發送紅包的返回結果
    /// </summary>
    public class SendRedPackResult : PayResult
    {
        /// <summary>
        /// 商戶訂單號
        /// </summary>
        public string mch_billno { get; set; }

        /// <summary>
        /// 商戶appid,接口傳入的全部appid應該爲公衆號的appid(在mp.weixin.qq.com申請的),不能爲APP的appid(在open.weixin.qq.com申請的)。
        /// </summary>
        public string wxappid { get; set; }
        /// <summary>
        /// 接受收紅包的用戶 
        /// 用戶在wxappid下的openid
        /// </summary>
        public string re_openid { get; set; }
        /// <summary>
        /// 付款金額,單位分
        /// </summary>
        public int total_amount { get; set; }
        /// <summary>
        /// 紅包發送時間
        /// </summary>
        public string send_time { get; set; }
        /// <summary>
        /// 紅包訂單的微信單號
        /// </summary>
        public string send_listid { get; set; }
    }

這樣,有了這些對象的代碼,咱們根據接口的說明,依舊遵循上篇隨筆介紹的接口設計方式,實現裂變紅包的代碼處理。

    /// <summary>
    /// 微信紅包、搖一搖紅包的操做API接口
    /// </summary>
    public interface ILotteryApi
    {              
        /// <summary>
        /// 用於企業向微信用戶我的發現金紅包。須要商戶證書
        /// 目前支持向指定微信用戶的openid發放指定金額紅包。
        /// </summary>
        /// <returns></returns>
        SendRedPackResult SendRedPack(SendRedPackJson json);

        /// <summary>
        /// 用於企業向微信用戶我的發裂變紅包。須要商戶證書
        /// 目前支持向指定微信用戶的openid發放指定金額裂變紅包。
        /// </summary>
        /// <returns></returns>
        SendRedPackResult SendGroupRedPack(SendGroupRedPackJson json);

        .............

而後實現它們的接口代碼以下所示。

    /// <summary>
    /// 微信紅包管理類
    /// </summary>
    public class LotteryApi : ILotteryApi
    {
        #region 裂變紅包說明
        //微信支付裂變紅包向微信支付商戶開發,具體能力以下: 
        //一、商戶調用接口時,經過指定發送金額以及指定一位發送對象的方式發放一組裂變紅包
        //二、指定發送對象領取到紅包後,資金直接進入微信零錢,帶給用戶微信支付原生的流暢體驗
        //三、指定發送對象可以將組合中的剩餘紅包分享給好友,好友可繼續領取,造成傳播效應,放大企業品牌價值
        #endregion

        /// <summary>
        /// 用於企業向微信用戶我的發裂變紅包。須要商戶證書
        /// 目前支持向指定微信用戶的openid發放指定金額裂變紅包。
        /// </summary>
        /// <returns></returns>
        public SendRedPackResult SendGroupRedPack(SendGroupRedPackJson json)
        {
            CheckAccount();//檢查AccountInfo的對象屬性值

            WxPayData data = new WxPayData();
            data.SetValue("wxappid", AccountInfo.UniteAppId);//公衆帳號appid
            data.SetValue("mch_id", AccountInfo.MchID);//商戶號
            data.SetValue("nonce_str", data.GenerateNonceStr());//隨機字符串
            data.SetValue("send_name", AccountInfo.Name);//    紅包發送者名稱
            
            //商戶訂單號(每一個訂單號必須惟一) 組成:mch_id+yyyymmdd+10位一天內不能重複的數字。
            //接口根據商戶訂單號支持重入,如出現超時可再調用。
            data.SetValue("mch_billno", data.GenerateOutTradeNo(AccountInfo.MchID));

            data.SetValue("re_openid", json.re_openid);//接收紅包的種子用戶(首個用戶)
            data.SetValue("total_amount", json.total_amount);//紅包發放總金額,即一組紅包金額總和,包括分享者的紅包和裂變的紅包,單位分
            data.SetValue("total_num", json.total_num);//紅包發放總人數,即總共有多少人能夠領到該組紅包(包括分享者)
            data.SetValue("wishing", json.wishing);//紅包祝福語
            data.SetValue("act_name", json.act_name);
            data.SetValue("remark", json.remark);
            data.SetValue("amt_type", json.amt_type);

            data.SetValue("sign", data.MakeSign(AccountInfo.PayAPIKey));//最後生成簽名

            var url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";
            return Helper.GetPayResultWithCert<SendRedPackResult>(data, url, AccountInfo.CertPath, AccountInfo.CertPassword);
        }

        ...............

 

三、裂變紅包接口的調用及效果展現

上面咱們對裂變紅包進行了接口的封裝,若是咱們須要發送裂變紅包的時候,直接調用上面的接口便可實現紅包發送的操做了。

例如調用接口的代碼以下所示。

                //裂變紅包
                SendGroupRedPackJson groupJson = new SendGroupRedPackJson()
                {  
                    act_name = "恭喜發財",
                    remark = "企業紅包",
                    wishing = "企業紅包",
                    total_amount = 600,
                    total_num = 4,
                    re_openid = tosendOpenId, //發送給用戶的OpenID
                };

                var groupResult = hbApi.SendGroupRedPack(groupJson);
                message = string.Format("企業發送裂變紅包:{0} {1}", groupResult.Success ? "成功" : "失敗", groupResult.Message);
                Console.WriteLine(message);
                Console.WriteLine(groupResult.ToJson());

其中hbApi的對象初始化代碼以下所示

ILotteryApi hbApi = new LotteryApi(accountInfo);

最後咱們能夠在微信上看到發過來的裂變紅包。

        

因爲發送紅包的金額都須要大於1塊,那麼若是咱們發送的金額大一些,那麼每一個人拆到的紅包金額是不等的,以下圖所示。

以上就是關於現金紅包和裂變紅包的接口封裝和使用過程,但願對你使用微信開發有所幫助,感謝支持。

 

若是對這個《C#開發微信門戶及應用》系列感興趣,能夠關注個人其餘文章,系列隨筆以下所示:

C#開發微信門戶及應用(36)--微信卡劵管理的封裝操做

C#開發微信門戶及應用(35)--微信支付之企業付款封裝操做

C#開發微信門戶及應用(34)--微信裂變紅包

C#開發微信門戶及應用(33)--微信現金紅包的封裝及使用

C#開發微信門戶及應用(32)--微信支付接入和API封裝使用

C#開發微信門戶及應用(31)--微信語義理解接口的實現和處理

C#開發微信門戶及應用(30)--消息的羣發處理和預覽功能

C#開發微信門戶及應用(28)--微信「搖一搖·周邊」功能的使用和接口的實現

C#開發微信門戶及應用(27)-公衆號模板消息管理 

C#開發微信門戶及應用(26)-公衆號微信素材管理

C#開發微信門戶及應用(25)-微信企業號的客戶端管理功能

C#開發微信門戶及應用(24)-微信小店貨架信息管理

C#開發微信門戶及應用(23)-微信小店商品管理接口的封裝和測試

C#開發微信門戶及應用(22)-微信小店的開發和使用

C#開發微信門戶及應用(21)-微信企業號的消息和事件的接收處理及解密 

C#開發微信門戶及應用(20)-微信企業號的菜單管理

C#開發微信門戶及應用(19)-微信企業號的消息發送(文本、圖片、文件、語音、視頻、圖文消息等)

C#開發微信門戶及應用(18)-微信企業號的通信錄管理開發之成員管理

C#開發微信門戶及應用(17)-微信企業號的通信錄管理開發之部門管理

C#開發微信門戶及應用(16)-微信企業號的配置和使用

C#開發微信門戶及應用(15)-微信菜單增長掃一掃、發圖片、發地理位置功能

C#開發微信門戶及應用(14)-在微信菜單中採用重定向獲取用戶數據

C#開發微信門戶及應用(13)-使用地理位置擴展相關應用

C#開發微信門戶及應用(12)-使用語音處理

C#開發微信門戶及應用(11)--微信菜單的多種表現方式介紹

C#開發微信門戶及應用(10)--在管理系統中同步微信用戶分組信息

C#開發微信門戶及應用(9)-微信門戶菜單管理及提交到微信服務器

C#開發微信門戶及應用(8)-微信門戶應用管理系統功能介紹

C#開發微信門戶及應用(7)-微信多客服功能及開發集成

C#開發微信門戶及應用(6)--微信門戶菜單的管理操做

C#開發微信門戶及應用(5)--用戶分組信息管理

C#開發微信門戶及應用(4)--關注用戶列表及詳細信息管理

C#開發微信門戶及應用(3)--文本消息和圖文消息的應答

C#開發微信門戶及應用(2)--微信消息的處理和應答

C#開發微信門戶及應用(1)--開始使用微信接口

相關文章
相關標籤/搜索