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

来源:http://www.cnblogs.com/wuhuacong/archive/2016/04/25/5429958.html
-Advertisement-
Play Games

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


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

在上篇隨筆後,經過對整個微信框架的完善和重構,已經完成了對微信支付、企業付款、現金紅包、代金券及各種卡劵進行了封裝完成,並把其中微信支付及搖一搖紅包部分等內容作為公眾號和企業號通用的部分,這些支付相關的介面在公眾號和企業號裡面,都可以進行調用的,在經過一系列的優化整理後,把這些內容逐一進行介紹,希望大家喜歡支持。

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

1)使用場景

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

◆ 商戶調用介面時,通過指定發送對象以及發送金額的方式發放紅包,這樣的方式,允許商戶靈活的應用於各種各樣豐富的活動場景

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

 

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

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

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

紅包規則

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

◆ 同一個紅包只能發送給一個用戶;(如果以上規則不滿足您的需求,請發郵件至[email protected]獲取升級指引)

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

 

3) 微信紅包介面調用流程

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

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

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

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

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

微信紅包介面調用流程


2、 現金紅包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);

 

3、微信紅包的使用結果

 例如,我們在測試例子裡面調用代碼如下所示。

                //現金紅包
                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);

成功調用後,我們可以在公眾號的對話裡面看到紅包的信息結果,如下是整個紅包發送及拆開的過程。

            

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MongoDB安裝 使用的版本為3.0,虛擬機操作系統為rhel-server-7.0-x86_641. 將mongodb-linux-x86_64-rhel70-3.0.11.tgz上傳並解壓到 /usr/local/mongodb 目錄下2. 設置環境變數# vi /etc/profile添加e ...
  • 在Linux中使用vi命令編輯mysql_backup.sh時遇到下麵提示信息 E325: ATTENTIONFound a swap file by the name ".mysql_backup.sh.swp" owned by: root dated: Sat Apr 23 23:58:28 ... ...
  • ...
  • 因為休眠功能在部分電腦無法正常工作,所以Ubuntu預設是不開啟休眠功能。 要想開啟休眠功能先進行如下測試: 1、先檢查是否有交換分區(swap),如果有確認交換分區至少和實際可用記憶體一樣大。 2、按Ctrl+Alt+T開啟終端或者Dash搜索開啟終端 3、運行sudo pm-hibernate, ...
  • 1、當我想要使用sudo時,提示 一開始以為是PATH不對,就各種百度各種試 都不好使,最後發現是我裝的debian 8.4.0 amd64 1並不是全功能,sudo沒有裝 2、apt源總是連接到cdrom,使用apt-get install時總是提示出錯,因為我是通過u盤ios鏡像安裝的 可以把c ...
  • HAProxy: 實現了一種事件驅動,單一進程模型,支持數萬計的併發連接,用於為tcp和http應用程式提供高可用,負載均衡和代理服務的解決方案,尤其適用於高負載且需要持久連接或7層處理機制的web站點 代理(http): 正向代理: 反向代理: 代理作用:web緩存(加速)、反向代理、內容路由(根 ...
  • 1、sl 奔跑吧,火車! nick-suo@ubuntu:~$ sudo apt-get install sl 2、telnet 星球大戰 nick-suo@ubuntu:~$ telnet towel.blinkenlights.nl 3、cmatrix 代碼屏保 nick-suo@ubuntu: ...
  • 最近看了一些Android驅動開發前需要知道的資料,收穫很多,接下來就談談我自己的一些心得體會。 Android在近幾年時間發展迅速,已經成為智能手機操作系統的老大。不過,因為Android原生的代碼支持的設備並不多,所以我們要想在自己的設備上完美地運行Android就需要另外地開發一些程式,從而可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...