C#開發(fā)微信門戶及應(yīng)用(35)--微信支付之企業(yè)付款封裝操作

在前面幾篇隨筆妇垢,都是介紹微信支付及紅包相關(guān)的內(nèi)容,其實支付部分的內(nèi)容還有很多宰衙,例如企業(yè)付款平道、公眾號支付或刷卡支付、搖一搖紅包供炼、代金券等方面的內(nèi)容一屋,這些都是微信接口支持的內(nèi)容,本篇繼續(xù)微信支付這一主題劲蜻,繼續(xù)介紹微信支付中的企業(yè)付款的操作陆淀,實現(xiàn)對企業(yè)付款A(yù)PI的接口C#代碼的封裝,以及測試效果先嬉。

1轧苫、企業(yè)付款的介紹

所謂企業(yè)付款指的是,在功能開放后諸如保險行業(yè)的客戶理賠疫蔓、退保含懊、商品退款、發(fā)放征集活動獎金衅胀、抽獎互動等操作都可以通過企業(yè)付款完成岔乔。而此前,微信支付只能提供客戶向企業(yè)單向付款滚躯。
商戶如果需要給用戶付款雏门,可以直接將錢打入用戶的“微信零錢”中,微信支付將做零錢入賬消息通知掸掏,零錢收支明細會展示相應(yīng)記錄茁影。針對無零錢賬戶的歷史客戶端版本,資金將進入用戶的紅包賬戶丧凤,微信支付無消息通知用戶募闲,企業(yè)可選擇自行觸達用戶。
通過認證的企業(yè)號可以開通微信支付功能愿待。通過認證的企業(yè)號可以管理平臺的“服務(wù)中心”的“微信支付”入口里進行微信支付功能申請浩螺。而開通微信支付功能后,企業(yè)號將擁有兩項功能:收款和付款仍侥。如果是用戶號對企業(yè)號付款要出,款項將會進入企業(yè)號所關(guān)聯(lián)的商戶號中。同時农渊,企業(yè)號可以通過微信紅包或微信轉(zhuǎn)賬的形式對用戶號付款厨幻。
企業(yè)付款,提供企業(yè)向用戶付款的功能,支持企業(yè)通過API接口付款况脆,或通過微信支付商戶平臺網(wǎng)頁功能操作付款饭宾。
涉及資金操作的功能,安全性要求較高格了,需要操作員安裝證書(商戶平臺-賬戶設(shè)置-密碼安全-操作證書)看铆;通過API或網(wǎng)頁操作,付款至目標(biāo)用戶(企業(yè)可根據(jù)APPID+OpenID鎖定目標(biāo)用戶)盛末。針對已實名認證的用戶弹惦,微信支付可提供校驗真實姓名一致性的可選功能。
企業(yè)付款提示:
◆ 給同一個實名用戶付款悄但,單筆單日限額2W/2W
◆ 給同一個非實名用戶付款棠隐,單筆單日限額2000/2000
◆ 一個商戶同一日付款總額限額100W
◆僅支持商戶號已綁定的APPID;
◆針對付款的目標(biāo)用戶檐嚣,已微信支付實名認證的用戶可提供校驗真實姓名的功能助泽,未實名認證的用戶無法校驗,企業(yè)可根據(jù)自身業(yè)務(wù)的安全級別選擇驗證類型嚎京;
◆付款金額必須小于或等于商戶當(dāng)前可用余額的金額嗡贺;
◆ 已付款的記錄,企業(yè)可通過企業(yè)付款查詢查看相應(yīng)數(shù)據(jù)鞍帝。

2诫睬、企業(yè)付款A(yù)PI

企業(yè)付款業(yè)務(wù)是基于微信支付商戶平臺的資金管理能力,為了協(xié)助商戶方便地實現(xiàn)企業(yè)向個人付款帕涌,針對部分有開發(fā)能力的商戶摄凡,提供通過API完成企業(yè)付款的功能。 比如目前的保險行業(yè)向客戶退保蚓曼、給付亲澡、理賠。
企業(yè)付款將使用商戶的可用余額辟躏,需確惫瓤郏可用余額充足土全。查看可用余額捎琐、充值、提現(xiàn)請登錄商戶平臺“資金管理”進行操作裹匙。
接口地址

接口鏈接:

https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

是否需要證書

請求需要雙向證書瑞凑。 詳見[證書使用]

(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3)

請求參數(shù)



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

<xml>
<mch_appid>wxe062425f740c30d8</mch_appid>
<mchid>10000098</mchid>
<nonce_str>3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>
<partner_trade_no>100000982014120919616</partner_trade_no>
<openid>ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</openid>
<check_name>OPTION_CHECK</check_name>
<re_user_name>張三</re_user_name>
<amount>100</amount>
<desc>節(jié)日快樂!</desc>
<spbill_create_ip>10.2.3.10</spbill_create_ip>
<sign>C97BDBACF37622775366F38B629F45E3</sign>
</xml> 

成功返回的數(shù)據(jù)示例:

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[]]></return_msg>
<mch_appid><![CDATA[wxec38b8ff840bd989]]></mch_appid>
<mchid><![CDATA[10013274]]></mchid>
<device_info><![CDATA[]]></device_info>
<nonce_str><![CDATA[lxuDzMnRjpcXzxLx0q]]></nonce_str>
<result_code><![CDATA[SUCCESS]]></result_code>
<partner_trade_no><![CDATA[10013574201505191526582441]]></partner_trade_no>
<payment_no><![CDATA[1000018301201505190181489473]]></payment_no>
<payment_time><![CDATA[2015-05-19 15:26:59]]></payment_time>
</xml>

根據(jù)上面的接口描述,以及輸入概页,返回參數(shù)籽御,我們可以構(gòu)建對應(yīng)的C#代碼的接口



根據(jù)上面的接口定義,我們可以定義接口信息如下所示

/// <summary>
/// 微信支付接口
/// </summary>
public interface ITenPayApi
{  

    /// <summary>
    /// 企業(yè)付款(請求需要雙向證書)
    /// 企業(yè)付款業(yè)務(wù)是基于微信支付商戶平臺的資金管理能力,為了協(xié)助商戶方便地實現(xiàn)企業(yè)向個人付款技掏,
    /// 針對部分有開發(fā)能力的商戶铃将,提供通過API完成企業(yè)付款的功能。 比如目前的保險行業(yè)向客戶退保哑梳、給付劲阎、理賠。
    /// 企業(yè)付款將使用商戶的可用余額鸠真,需確泵跸桑可用余額充足。查看可用余額吠卷、充值锡垄、提現(xiàn)請登錄商戶平臺“資金管理”進行操作。https://pay.weixin.qq.com/ 
    /// 注意:與商戶微信支付收款資金并非同一賬戶祭隔,需要單獨充值货岭。
    /// </summary>
    /// <param name="json">企業(yè)支付數(shù)據(jù)</param>
    /// <returns></returns>
    CorpPayResult CorpPay(CorpPayJson json);

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

其中上面的CorpPayJson 和CorpPayResult 分別是傳入?yún)?shù)和獲取的結(jié)果內(nèi)容,兩者的對象信息根據(jù)參數(shù)進行定義即可序攘。


/// <summary>
/// 企業(yè)付款的數(shù)據(jù)信息
/// </summary>
public class CorpPayJson
{
    public CorpPayJson()
    {
        this.check_name = "FORCE_CHECK";
    }

    /// <summary>
    /// 微信支付分配的終端設(shè)備號
    /// </summary>
    public string device_info { get; set; }

    /// <summary>
    /// 用戶openid
    /// </summary>
    public string openid { get; set; }

    /// <summary>
    /// 校驗用戶姓名選項,可以使用 PayCheckName枚舉對象獲取名稱
    /// NO_CHECK:不校驗真實姓名 
    /// FORCE_CHECK:強校驗真實姓名(未實名認證的用戶會校驗失敗茴她,無法轉(zhuǎn)賬) 
    /// OPTION_CHECK:針對已實名認證的用戶才校驗真實姓名(未實名認證用戶不校驗,可以轉(zhuǎn)賬成功)
    /// </summary>
    public string check_name { get; set; }

    /// <summary>
    /// 收款用戶真實姓名程奠。 
    /// 如果check_name設(shè)置為FORCE_CHECK或OPTION_CHECK丈牢,則必填用戶真實姓名
    /// </summary>
    public string re_user_name { get; set; }

    /// <summary>
    /// 企業(yè)付款金額,單位為分
    /// </summary>
    public int amount { get; set; }

    /// <summary>
    /// 企業(yè)付款操作說明信息瞄沙。必填己沛。
    /// </summary>
    public string desc { get; set; }

    /// <summary>
    /// 調(diào)用接口的機器Ip地址
    /// </summary>
    public string spbill_create_ip { get; set; }
}
/// <summary>
/// 企業(yè)付款操作的返回結(jié)果
/// </summary>
public class CorpPayResult : PayResult
{    
    /// <summary>
    /// 微信分配的公眾賬號ID(企業(yè)號corpid即為此appId)
    /// </summary>
    public string mch_appid { get; set; }

    /// <summary>
    /// 微信支付分配的終端設(shè)備號
    /// </summary>
    public string device_info { get; set; }

    /// <summary>
    /// 商戶使用查詢API填寫的單號的原路返回. 
    /// </summary>
    public string partner_trade_no { get; set; }

    /// <summary>
    /// 企業(yè)付款成功,返回的微信訂單號
    /// </summary>
    public string payment_no { get; set; }

    /// <summary>
    /// 企業(yè)付款成功時間
    /// </summary>
    public string payment_time { get; set; }
}

企業(yè)付款的API實現(xiàn)和前面兩種紅包的處理方式 差不多距境,一個是傳入常規(guī)的賬號信息申尼,一個是傳入業(yè)務(wù)參數(shù),然后提交獲取結(jié)果即可垫桂,具體代碼如下所示师幕。

/// <summary>
/// 企業(yè)付款(請求需要雙向證書)
/// 企業(yè)付款業(yè)務(wù)是基于微信支付商戶平臺的資金管理能力,為了協(xié)助商戶方便地實現(xiàn)企業(yè)向個人付款诬滩,
/// 針對部分有開發(fā)能力的商戶霹粥,提供通過API完成企業(yè)付款的功能。 比如目前的保險行業(yè)向客戶退保疼鸟、給付后控、理賠。
/// 企業(yè)付款將使用商戶的可用余額空镜,需確焙铺裕可用余額充足捌朴。查看可用余額、充值张抄、提現(xiàn)請登錄商戶平臺“資金管理”進行操作砂蔽。https://pay.weixin.qq.com/ 
/// 注意:與商戶微信支付收款資金并非同一賬戶,需要單獨充值署惯。
/// </summary>
/// <param name="json">企業(yè)支付數(shù)據(jù)</param>
/// <returns></returns>
public CorpPayResult CorpPay(CorpPayJson json)
{
    CheckAccount();//檢查AccountInfo的對象屬性值

    WxPayData data = new WxPayData();
    data.SetValue("mch_appid", AccountInfo.UniteAppId);//公眾賬號appid察皇, 注意是mch_appid,而非wxappid
    data.SetValue("mchid", AccountInfo.MchID);//商戶號, 注意是mchid而非mch_id
    data.SetValue("nonce_str", data.GenerateNonceStr());//隨機字符串
    data.SetValue("spbill_create_ip", NetworkUtil.GetIPAddress());//終端ip      
    data.SetValue("partner_trade_no", data.GenerateOutTradeNo(AccountInfo.MchID));//隨機字符串

    data.SetValue("device_info", json.device_info);//終端ip            
    data.SetValue("openid", json.openid);
    data.SetValue("check_name", json.check_name);
    data.SetValue("re_user_name", json.re_user_name);
    data.SetValue("amount", json.amount);
    data.SetValue("desc", json.desc);

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

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

接口定義及實現(xiàn)好后泽台,我們可以在項目中對API進行調(diào)用測試什荣,具體代碼如下所示

CorpPayJson json = new CorpPayJson()
{
    amount = 100,
    check_name = PayCheckName.FORCE_CHECK.ToString(),
    desc = "測試退款",
    openid = this.openId,
    device_info = "",
    re_user_name = "伍華聰",
    spbill_create_ip = NetworkUtil.GetIPAddress()
};

var result = api.CorpPay(json);
var message = string.Format("企業(yè)直接付款:{0} {1}", result.Success ? "成功" : "失敗", result.Message);
Console.WriteLine(message);
Console.WriteLine(result.ToJson());

付款操作成功后,我們可以看到這個錢是直接到用戶錢包里面去的怀酷,而且我們也可以在商戶后臺進行記錄的查看稻爬,可以看到對應(yīng)的記錄。


如果對這個《C#開發(fā)微信門戶及應(yīng)用》系列感興趣蜕依,可以關(guān)注我的其他文章.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桅锄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子样眠,更是在濱河造成了極大的恐慌友瘤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檐束,死亡現(xiàn)場離奇詭異辫秧,居然都是意外死亡,警方通過查閱死者的電腦和手機被丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門盟戏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甥桂,你說我怎么就攤上這事柿究。” “怎么了黄选?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵蝇摸,是天一觀的道長。 經(jīng)常有香客問我办陷,道長貌夕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任懂诗,我火速辦了婚禮蜂嗽,結(jié)果婚禮上苗膝,老公的妹妹穿的比我還像新娘殃恒。我一直安慰自己植旧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布离唐。 她就那樣靜靜地躺著病附,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亥鬓。 梳的紋絲不亂的頭發(fā)上完沪,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音嵌戈,去河邊找鬼覆积。 笑死,一個胖子當(dāng)著我的面吹牛熟呛,可吹牛的內(nèi)容都是我干的宽档。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼庵朝,長吁一口氣:“原來是場噩夢啊……” “哼吗冤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起九府,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤椎瘟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侄旬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肺蔚,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年儡羔,在試婚紗的時候發(fā)現(xiàn)自己被綠了婆排。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡笔链,死狀恐怖段只,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鉴扫,我是刑警寧澤赞枕,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站坪创,受9級特大地震影響炕婶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜莱预,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一柠掂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧依沮,春花似錦涯贞、人聲如沸枪狂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽州疾。三九已至,卻和暖如春皇拣,著一層夾襖步出監(jiān)牢的瞬間严蓖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工氧急, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颗胡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓吩坝,卻偏偏與公主長得像杭措,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钾恢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容