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

我在上篇隨筆《C#開發微信門戶及應用(32)--微信支付接入和API封裝使用》介紹爲微信支付的API封裝及使用,其中介紹瞭如何配置好支付環境,並對掃碼支付的兩種方式如何在C#開發中使用進行了介紹,本隨筆繼續介紹微信支付的相關內容,介紹其中的微信現金紅包和裂變紅包的封裝和使用。php

在上篇隨筆後,通過對整個微信框架的完善和重構,已經完成了對微信支付、企業付款、現金紅包、代金券及各類卡劵進行了封裝完成,並把其中微信支付及搖一搖紅包部分等內容做爲公衆號和企業號通用的部分,這些支付相關的接口在公衆號和企業號裏面,均可以進行調用的,在通過一系列的優化整理後,把這些內容逐一進行介紹,但願你們喜歡支持。html

一、現金紅包的概念及使用

1)使用場景算法

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

◆ 商戶調用接口時,經過指定發送對象以及發送金額的方式發放紅包,這樣的方式,容許商戶靈活的應用於各類各樣豐富的活動場景api

◆ 領取到紅包後,用戶的資金直接進入微信零錢,避免繁複的領獎流程,帶給用戶微信支付原生的流暢體驗安全

 

2)微信紅包發送規則
發送頻率規則

◆ 每分鐘發送紅包數量不得超過1800個;服務器

◆ 同一個商戶號,每分鐘最多給同一個用戶發送一個紅包;微信

紅包規則

◆ 單個紅包金額介於[1.00元,200.00元]之間;app

◆ 同一個紅包只能發送給一個用戶;(若是以上規則不知足您的需求,請發郵件至wxhongbao@tencent.com獲取升級指引)框架

◆ 紅包發放後72小時未被領取將進行退款

 

3) 微信紅包接口調用流程

◆ 後臺API調用:待進入聯調過程時與開發進行詳細溝通;

◆ 告知服務器:告知服務器接收微信紅包的用戶openID,告知服務器該用戶得到的金額;

◆ 從商務號扣款:服務器獲取信息後從對應的商務號扣取對應的金額;

◆ 調用失敗:因不符合發送規則,商務號餘額不足等緣由形成調用失敗,反饋至調用方;

◆ 發送成功:以微信紅包公衆帳號發送對應紅包至對應用戶;

微信紅包接口調用流程


二、 現金紅包API接口的說明及C#的封裝

用於企業向微信用戶我的發現金紅包,目前支持向指定微信用戶的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>
<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>

上面是接口及輸入參數的說明,通常狀況下,咱們須要根據這些來決定如何實現C#代碼的封裝,首先咱們來定義咱們須要的接口和類,以下所示。

經過分析上面的接口說明,咱們能夠發現,其中接口有部分是固定的常規參數,也就是通常公衆號或者企業號的身份信息,有部分是業務參數,所以咱們把它們分別分離出來,這樣有利於咱們對接口的封裝和使用,那些常規的參數咱們經過公衆號身份獲取就能夠了,業務信息,咱們能夠定義一個實體類來進行數據的存儲交換便可。

對應上圖的固定的常規參數,在接口說明中以下所示。

所以,這些信息咱們從帳號裏面設置及獲取便可,咱們能夠在管理後臺對它們進行配置,而後在代碼邏輯裏面取出來使用便可。

根據上面的介紹,咱們能夠定義紅包接口代碼以下所示。

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

其中的 SendRedPackJson 是咱們變化的業務參數,咱們定義了一個類來進行信息的承載,方便想接口傳遞信息。

    /// <summary>
    /// 現金紅包和裂變紅包的基礎信息
    /// </summary>
    public class BaseRedPackJson
    {
        /// <summary>
        /// 接受紅包的用戶
        /// 用戶openid    
        /// </summary>
        public string re_openid { get; set; }

        /// <summary>
        /// 付款金額,單位分
        /// </summary>
        public int total_amount { get; set; }

        /// <summary>
        /// 紅包發放總人數
        /// </summary>
        public int total_num { get; set; }

        /// <summary>
        /// 紅包祝福語
        /// </summary>
        public string wishing { get; set; }

        /// <summary>
        /// 活動名稱
        /// </summary>
        public string act_name { get; set; }

        /// <summary>
        /// 備註信息
        /// </summary>
        public string remark { get; set; }
    }

    /// <summary>
    /// 發送紅包的數據信息
    /// </summary>
    public class SendRedPackJson :BaseRedPackJson
    {
        /// <summary>
        /// 調用接口的機器Ip地址
        /// </summary>
        public string client_ip { get; set; }

        public SendRedPackJson()
        {
            this.total_num = 1;//紅包發放總人數
        }
    }

根據上面參數的定義,咱們在現金紅包的接口實現裏面,具體代碼以下所示,裏面的邏輯內容,主要就是傳入常規參數和業務參數兩部分,而後調用接口的地址進行數據的提交(POST),獲取返回結果並進行解析便可。

        /// <summary>
        /// 用於企業向微信用戶我的發現金紅包。須要商戶證書
        /// 目前支持向指定微信用戶的openid發放指定金額紅包。
        /// </summary>
        /// <returns></returns>
        public SendRedPackResult SendRedPack(SendRedPackJson 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("client_ip", json.client_ip);
            data.SetValue("act_name", json.act_name);
            data.SetValue("remark", json.remark);

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

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

其中發送紅包操做是須要證書的,所以須要添加對應的證書,證書是從微信的商戶平臺上進行下載的。

在商戶後臺的【API安全】項目上下載證書供咱們開發環境使用。

下載證書後,在Windows環境,咱們通常須要雙擊安裝,輸入所需的商戶號做爲密碼便可。

在代碼裏面,咱們可使用證書類進行添加

            HttpHelper helper = new HttpHelper();

 helper.ClientCertificates = new X509CertificateCollection(); certPath = Path.Combine(System.Environment.CurrentDirectory, certPath); helper.ClientCertificates.Add(new X509Certificate2(certPath, certPassword)); string response = helper.GetHtml(url, xml, true);

 

三、微信紅包的使用結果

 例如,咱們在測試例子裏面調用代碼以下所示。

                //現金紅包
                SendRedPackJson packJson = new SendRedPackJson()
                {
                    act_name = "恭喜發財",
                    client_ip = NetworkUtil.GetIPAddress(),
                    remark = "企業紅包",
                    wishing = "企業紅包",
                    total_amount = 100,
                    total_num = 1,
                    re_openid = tosendOpenId //發送給用戶的OpenID
                };
                var result = hbApi.SendRedPack(packJson);
                var message = string.Format("企業發送紅包:{0} {1}", result.Success ? "成功" : "失敗", result.Message);
                Console.WriteLine(message);
                Console.WriteLine(result.ToJson());

其中的hbApi是上面接口的構造,以下代碼所示。

 AccountInfo  accountInfo = new AccountInfo()
    {
       Name = this.SendName,
        AppID = this.AppId,
        AppSecret = this.AppSecret,
        MchID = this.MchID,
        PayAPIKey = this.PayAPIKey,
        CertPath = this.CertPath,
        CertPassword = this.CertPassword,
         PayNotifyUrl = this.PayNotifyUrl
     };
 ILotteryApi hbApi = new LotteryApi(accountInfo);

成功調用後,咱們能夠在公衆號的對話裏面看到紅包的信息結果,以下是整個紅包發送及拆開的過程。

            

 

若是對這個《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)--開始使用微信接口

相關文章
相關標籤/搜索