溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

發(fā)布時(shí)間:2021-03-12 10:04:03 來(lái)源:億速云 閱讀:140 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章給大家分享的是有關(guān)微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

1、現(xiàn)金紅包的概念及使用

1)使用場(chǎng)景

微信支付現(xiàn)金紅包向微信支付商戶開發(fā),具體能力如下:

◆ 商戶調(diào)用接口時(shí),通過(guò)指定發(fā)送對(duì)象以及發(fā)送金額的方式發(fā)放紅包,這樣的方式,允許商戶靈活的應(yīng)用于各種各樣豐富的活動(dòng)場(chǎng)景

◆ 領(lǐng)取到紅包后,用戶的資金直接進(jìn)入微信零錢,避免繁復(fù)的領(lǐng)獎(jiǎng)流程,帶給用戶微信支付原生的流暢體驗(yàn)

2)微信紅包發(fā)送規(guī)則

發(fā)送頻率規(guī)則

◆ 每分鐘發(fā)送紅包數(shù)量不得超過(guò)1800個(gè);

◆ 同一個(gè)商戶號(hào),每分鐘最多給同一個(gè)用戶發(fā)送一個(gè)紅包;

紅包規(guī)則

◆ 單個(gè)紅包金額介于[1.00元,200.00元]之間;

◆ 同一個(gè)紅包只能發(fā)送給一個(gè)用戶;(如果以上規(guī)則不滿足您的需求,請(qǐng)發(fā)郵件至wxhongbao@tencent.com獲取升級(jí)指引)

◆ 紅包發(fā)放后72小時(shí)未被領(lǐng)取將進(jìn)行退款

3) 微信紅包接口調(diào)用流程

◆ 后臺(tái)API調(diào)用:待進(jìn)入聯(lián)調(diào)過(guò)程時(shí)與開發(fā)進(jìn)行詳細(xì)溝通;

◆ 告知服務(wù)器:告知服務(wù)器接收微信紅包的用戶openID,告知服務(wù)器該用戶獲得的金額;

◆ 從商務(wù)號(hào)扣款:服務(wù)器獲取信息后從對(duì)應(yīng)的商務(wù)號(hào)扣取對(duì)應(yīng)的金額;

◆ 調(diào)用失?。阂虿环习l(fā)送規(guī)則,商務(wù)號(hào)余額不足等原因造成調(diào)用失敗,反饋至調(diào)用方;

◆ 發(fā)送成功:以微信紅包公眾賬號(hào)發(fā)送對(duì)應(yīng)紅包至對(duì)應(yīng)用戶;

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

2、 現(xiàn)金紅包API接口的說(shuō)明及C#的封裝

用于企業(yè)向微信用戶個(gè)人發(fā)現(xiàn)金紅包,目前支持向指定微信用戶的openid發(fā)放指定金額紅包。

雖然可以通過(guò)微信的商戶后臺(tái)進(jìn)行現(xiàn)金紅包的發(fā)放,但我們也可以利用微信提供的接口API進(jìn)行現(xiàn)金紅包的發(fā)送。

接口調(diào)用請(qǐng)求說(shuō)明

請(qǐng)求Urlhttps://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
是否需要證書是(證書及使用說(shuō)明詳見商戶證書)
請(qǐng)求方式POST

請(qǐng)求參數(shù)

字段名字段必填示例值類型說(shuō)明
隨機(jī)字符串nonce_str5K8264ILTKCH16CQ2502SI8ZNMTM67VSString(32)隨機(jī)字符串,不長(zhǎng)于32位
簽名signC380BEC2BFD727A4B6845133519F3AD6String(32)詳見簽名生成算法
商戶訂單號(hào)mch_billno10000098201411111234567890String(28)

商戶訂單號(hào)(每個(gè)訂單號(hào)必須唯一)

組成:mch_id+yyyymmdd+10位一天內(nèi)不能重復(fù)的數(shù)字。

接口根據(jù)商戶訂單號(hào)支持重入,如出現(xiàn)超時(shí)可再調(diào)用。

商戶號(hào)mch_id10000098String(32)微信支付分配的商戶號(hào)
公眾賬號(hào)appidwxappidwx8888888888888888String(32)微信分配的公眾賬號(hào)ID(企業(yè)號(hào)corpid即為此appId)。接口傳入的所有appid應(yīng)該為公眾號(hào)的appid(在mp.weixin.qq.com申請(qǐng)的),不能為APP的appid(在open.weixin.qq.com申請(qǐng)的)。
商戶名稱send_name天虹百貨String(32)紅包發(fā)送者名稱
用戶openidre_openidoxTWIuGaIt6gTKsQRLau2M0yL16EString(32)

接受紅包的用戶

用戶在wxappid下的openid

付款金額total_amount1000int付款金額,單位分
紅包發(fā)放總?cè)藬?shù)total_num1int

紅包發(fā)放總?cè)藬?shù)

total_num=1

紅包祝福語(yǔ)wishing感謝您參加猜燈謎活動(dòng),祝您元宵節(jié)快樂(lè)!String(128)紅包祝福語(yǔ)
Ip地址client_ip192.168.0.1String(15)調(diào)用接口的機(jī)器Ip地址
活動(dòng)名稱act_name猜燈謎搶紅包活動(dòng)String(32)活動(dòng)名稱
備注remark猜越多得越多,快來(lái)?yè)專?/td>String(256)備注信息

數(shù)據(jù)示例:

<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[恭喜發(fā)財(cái)]]></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>

上面是接口及輸入?yún)?shù)的說(shuō)明,一般情況下,我們需要根據(jù)這些來(lái)決定如何實(shí)現(xiàn)C#代碼的封裝,首先我們來(lái)定義我們需要的接口和類,如下所示。

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

通過(guò)分析上面的接口說(shuō)明,我們可以發(fā)現(xiàn),其中接口有部分是固定的常規(guī)參數(shù),也就是一般公眾號(hào)或者企業(yè)號(hào)的身份信息,有部分是業(yè)務(wù)參數(shù),因此我們把它們分別分離出來(lái),這樣有利于我們對(duì)接口的封裝和使用,那些常規(guī)的參數(shù)我們通過(guò)公眾號(hào)身份獲取就可以了,業(yè)務(wù)信息,我們可以定義一個(gè)實(shí)體類來(lái)進(jìn)行數(shù)據(jù)的存儲(chǔ)交換即可。

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

對(duì)應(yīng)上圖的固定的常規(guī)參數(shù),在接口說(shuō)明中如下所示。

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

因此,這些信息我們從賬號(hào)里面設(shè)置及獲取即可,我們可以在管理后臺(tái)對(duì)它們進(jìn)行配置,然后在代碼邏輯里面取出來(lái)使用即可。

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

根據(jù)上面的介紹,我們可以定義紅包接口代碼如下所示。

/// <summary>
    /// 微信紅包(搖一搖紅包)操作API
    /// </summary>
    public interface ILotteryApi
    {              
        /// <summary>
        /// 用于企業(yè)向微信用戶個(gè)人發(fā)現(xiàn)金紅包。需要商戶證書
        /// 目前支持向指定微信用戶的openid發(fā)放指定金額紅包。
        /// </summary>
        /// <returns></returns>
        SendRedPackResult SendRedPack(SendRedPackJson json);

其中的 SendRedPackJson 是我們變化的業(yè)務(wù)參數(shù),我們定義了一個(gè)類來(lái)進(jìn)行信息的承載,方便想接口傳遞信息。

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

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

        /// <summary>
        /// 紅包發(fā)放總?cè)藬?shù)
        /// </summary>
        public int total_num { get; set; }

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

        /// <summary>
        /// 活動(dòng)名稱
        /// </summary>
        public string act_name { get; set; }

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

    /// <summary>
    /// 發(fā)送紅包的數(shù)據(jù)信息
    /// </summary>
    public class SendRedPackJson :BaseRedPackJson
    {
        /// <summary>
        /// 調(diào)用接口的機(jī)器Ip地址
        /// </summary>
        public string client_ip { get; set; }

        public SendRedPackJson()
        {
            this.total_num = 1;//紅包發(fā)放總?cè)藬?shù)
        }
    }

根據(jù)上面參數(shù)的定義,我們?cè)诂F(xiàn)金紅包的接口實(shí)現(xiàn)里面,具體代碼如下所示,里面的邏輯內(nèi)容,主要就是傳入常規(guī)參數(shù)和業(yè)務(wù)參數(shù)兩部分,然后調(diào)用接口的地址進(jìn)行數(shù)據(jù)的提交(POST),獲取返回結(jié)果并進(jìn)行解析即可。

/// <summary>
        /// 用于企業(yè)向微信用戶個(gè)人發(fā)現(xiàn)金紅包。需要商戶證書
        /// 目前支持向指定微信用戶的openid發(fā)放指定金額紅包。
        /// </summary>
        /// <returns></returns>
        public SendRedPackResult SendRedPack(SendRedPackJson json)
        {
            CheckAccount();//檢查AccountInfo的對(duì)象屬性值

            //加入常規(guī)的參數(shù)
            WxPayData data = new WxPayData();
            data.SetValue("wxappid", AccountInfo.UniteAppId);//公眾賬號(hào)appid
            data.SetValue("mch_id", AccountInfo.MchID);//商戶號(hào)
            data.SetValue("nonce_str", data.GenerateNonceStr());//隨機(jī)字符串
            data.SetValue("send_name", AccountInfo.Name);//    紅包發(fā)送者名稱
            
            //商戶訂單號(hào)(每個(gè)訂單號(hào)必須唯一) 組成:mch_id+yyyymmdd+10位一天內(nèi)不能重復(fù)的數(shù)字。
            //接口根據(jù)商戶訂單號(hào)支持重入,如出現(xiàn)超時(shí)可再調(diào)用。
            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);
        }

其中發(fā)送紅包操作是需要證書的,因此需要添加對(duì)應(yīng)的證書,證書是從微信的商戶平臺(tái)上進(jìn)行下載的。

在商戶后臺(tái)的【API安全】項(xiàng)目上下載證書供我們開發(fā)環(huán)境使用。

下載證書后,在Windows環(huán)境,我們一般需要雙擊安裝,輸入所需的商戶號(hào)作為密碼即可。

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

在代碼里面,我們可以使用證書類進(jìn)行添加

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、微信紅包的使用結(jié)果

例如,我們?cè)跍y(cè)試?yán)永锩嬲{(diào)用代碼如下所示。

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

其中的hbApi是上面接口的構(gòu)造,如下代碼所示。

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

成功調(diào)用后,我們可以在公眾號(hào)的對(duì)話里面看到紅包的信息結(jié)果,如下是整個(gè)紅包發(fā)送及拆開的過(guò)程。

微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法       微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法     微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法

感謝各位的閱讀!關(guān)于“微信開發(fā)之微信現(xiàn)金紅包的封裝及使用方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI