在上篇隨筆後,經(jīng)過對整個微信框架的完善和重構(gòu),已經(jīng)完成了對微信支付、企業(yè)付款、現(xiàn)金紅包、代金券及各種卡劵進行了封裝完成,並把其中微信支付及搖一搖紅包部分等內(nèi)容作為公眾號和企業(yè)號通用的部分,這些支付相關(guān)的接口在公眾號和企業(yè)號裡面,都可以進行調(diào)用的,在經(jīng)過一系列的優(yōu)化整理後,把這些內(nèi)容逐一進行介紹,希望大家喜歡支持。
1、現(xiàn)金紅包的概念及使用
1)使用場景
微信支付現(xiàn)金紅包向微信支付商家開發(fā),具體能力如下:
◆?商家呼叫介面時,透過指定發(fā)送物件以及發(fā)送金額的方式發(fā)放紅包,這樣的方式,允許商家靈活的應(yīng)用於各種各樣豐富的活動場景
◆?領(lǐng)取到紅包後,用戶的資金直接進入微信零錢,避免繁複的領(lǐng)獎流程,帶給用戶微信支付原生的流暢體驗
?
2)微信紅包發(fā)送規(guī)則
發(fā)送頻率規(guī)則
◆ 每分鐘發(fā)送紅包數(shù)量不得超過1800個;
◆ 同一個商家號,每分鐘最多給同一個用戶發(fā)送一個紅包;
紅包規(guī)則
◆ 單一紅包金額介於[1.00元,200.00元]之間;
◆同一個紅包只能發(fā)送給一個用戶;(如果以上規(guī)則不滿足您的需求,請發(fā)送郵件至wxhongbao@tencent.com獲取升級指引)
◆ 紅包發(fā)放後72小時未被領(lǐng)取將進行退款
?
3)?微信紅包介面呼叫流程
◆ 後臺API呼叫:待進入聯(lián)調(diào)程序時與開發(fā)進行詳細溝通;
◆ 告知伺服器:告知伺服器接收微信紅包的使用者openID,告知伺服器該使用者所獲得的金額;
◆ 從商務(wù)號扣款:伺服器取得資訊後從對應(yīng)的商務(wù)號扣取對應(yīng)的金額;
◆ 呼叫失?。阂虿环蟼魉鸵?guī)則,商務(wù)號餘額不足等原因造成呼叫失敗,回饋至呼叫方;
◆ 傳送成功:以微信紅包公眾帳號發(fā)送對應(yīng)紅包至對應(yīng)用戶;
#2、 現(xiàn)金紅包API介面的說明及C#的封裝
用於企業(yè)向微信用戶個人發(fā)現(xiàn)金紅包,目前支援向指定微信用戶的openid發(fā)放指定金額紅包。
雖然可以透過微信的商家後臺進行現(xiàn)金紅包的發(fā)放,但我們也可以利用微信提供的介面API進行現(xiàn)金紅包的發(fā)送。
介面呼叫請求說明
#請求Url | https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack |
---|---|
是否需要憑證 | 是(憑證及使用說明詳見商家憑證) |
#請求方式 | POST |
#請求參數(shù)
##欄位名稱 | |||||
---|---|---|---|---|---|
必填 | 範(fàn)例值 | 類型 | #說明 | 隨機字串 | |
#是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 隨機字串,不長於32位元 | 簽章 | |
是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 詳見簽章產(chǎn)生演算法 |
商家訂單號 mch_billno 是 | #10000098201411111234567890|
商家訂單號碼(每個訂單號碼必須唯一) | 組成:mch_id+yyyymmdd+10位元一天內(nèi)不能重複的數(shù)字。 | 介面根據(jù)商家訂單號碼支援重入,如出現(xiàn)逾時可再呼叫。 | 商家號碼 | ||
#是 | 10000098 | String(32) | 微信支付分配的商家號碼 | #公眾帳號appid | |
是 | wx88888888888888888 | #String(32) | 微信分配的公眾帳號ID(企業(yè)號corpid即為此appId)。介面?zhèn)魅氲乃衋ppid應(yīng)該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 | 商家名稱 | |
是 | 天虹百貨 | String(32) | #紅包發(fā)送者名稱 |
用戶openid re_openid | 是|
String(32 ) | 接受紅包的用戶 | 用戶在wxappid下的openid | ##付款金額 | ||
是 | 1000 | int | 付款金額,單位分 | 紅包發(fā)放總?cè)藬?shù)total_num是 | |
int | 紅包發(fā)放總?cè)藬?shù) | total_num=1 | 紅包祝福語 | ||
#是 | 感謝您參加猜燈謎活動,祝您元宵節(jié)快樂! | String(128) | 紅包祝福語 | #Ip位址 | |
是 | 192.168.0.1 | String(15) | 呼叫介面的機器Ip位址 | 活動名稱 | |
是 | 猜燈謎搶紅包活動 | String(32) | 活動名稱 | 備註 |
資料範(fàn)例:
<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ā)財]]></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ù)的說明,一般情況下,我們需要根據(jù)這些來決定如何實作C#程式碼的封裝,首先我們來定義我們需要的介面和類,如下所示。
透過分析上面的介面說明,我們可以發(fā)現(xiàn),其中介面有部分是固定的常規(guī)參數(shù),也就是一般公眾號或企業(yè)號的身份訊息,有部分是業(yè)務(wù)參數(shù),因此我們把它們分別分離出來,這樣有利於我們對接口的封裝和使用,那些常規(guī)的參數(shù)我們通過公眾號身份獲取就可以了,業(yè)務(wù)信息,我們可以定義一個實體類來進行數(shù)據(jù)的儲存交換即可。
對應(yīng)上圖的固定的常規(guī)參數(shù),在介面說明中如下所示。
因此,這些資訊我們從帳號裡面設(shè)定及取得即可,我們可以在管理後臺對它們進行配置,然後在程式碼邏輯裡面取出來使用即可。
根據(jù)上面的介紹,我們可以定義紅包介面程式碼如下所示。
///?<summary> ????///?微信紅包(搖一搖紅包)操作API ????///?</summary> ????public?interface?ILotteryApi ????{?????????????? ????????///?<summary> ????????///?用于企業(yè)向微信用戶個人發(fā)現(xiàn)金紅包。需要商戶證書 ????????///?目前支持向指定微信用戶的openid發(fā)放指定金額紅包。 ????????///?</summary> ????????///?<returns></returns> ????????SendRedPackResult?SendRedPack(SendRedPackJson?json);
其中的?SendRedPackJson 是我們變化的業(yè)務(wù)參數(shù),我們定義了一個類別來進行資訊的承載,方便想介面?zhèn)鬟f訊息。
///?<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> ????????///?紅包祝福語 ????????///?</summary> ????????public?string?wishing?{?get;?set;?} ????????///?<summary> ????????///?活動名稱 ????????///?</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)用接口的機器Ip地址 ????????///?</summary> ????????public?string?client_ip?{?get;?set;?} ????????public?SendRedPackJson() ????????{ ????????????this.total_num?=?1;//紅包發(fā)放總?cè)藬?shù) ????????} ????}
根據(jù)上面參數(shù)的定義,我們在現(xiàn)金紅包的介面實作裡面,具體程式碼如下所示,裡面的邏輯內(nèi)容,主要就是傳入常規(guī)參數(shù)和業(yè)務(wù)參數(shù)兩部分,然後呼叫介面的位址進行資料的提交(POST),取得回傳結(jié)果並進行解析即可。
///?<summary> ????????///?用于企業(yè)向微信用戶個人發(fā)現(xiàn)金紅包。需要商戶證書 ????????///?目前支持向指定微信用戶的openid發(fā)放指定金額紅包。 ????????///?</summary> ????????///?<returns></returns> ????????public?SendRedPackResult?SendRedPack(SendRedPackJson?json) ????????{ ????????????CheckAccount();//檢查AccountInfo的對象屬性值 ????????????//加入常規(guī)的參數(shù) ????????????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);//????紅包發(fā)送者名稱 ???????????? ????????????//商戶訂單號(每個訂單號必須唯一)?組成:mch_id+yyyymmdd+10位一天內(nèi)不能重復(fù)的數(shù)字。 ????????????//接口根據(jù)商戶訂單號支持重入,如出現(xiàn)超時可再調(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ā)送紅包操作是需要證書的,因此需要新增對應(yīng)的證書,證書是從微信的商家平臺上下載的。
在商家後臺的【API安全】專案上下載憑證供我們開發(fā)環(huán)境使用。
下載憑證後,在Windows環(huá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é)果?例如,我們在測試範(fàn)例裡面呼叫程式碼如下所示。
//現(xiàn)金紅包 ????????????????SendRedPackJson?packJson?=?new?SendRedPackJson() ????????????????{ ????????????????????act_name?=?"恭喜發(fā)財", ????????????????????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);成功呼叫後,我們可以在公眾號的對話裡面看到紅包的信息結(jié)果,如下是整個紅包發(fā)送及拆開的過程。
? ? ? ?
? ? ?
?更多C#開發(fā)微信入口網(wǎng)站及應(yīng)用微信現(xiàn)金紅包的封裝及使用?相關(guān)文章請關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)