在微信的應(yīng)用上,微信支付是一個(gè)比較有用的部分,但也是比較複雜的技術(shù)要點(diǎn),在微商大行其道的年代,自己的商店沒有增加微信支付好像也說不過去,微信支付旨在為廣大微信用戶及商家提供更優(yōu)質(zhì)的支付服務(wù),微信的支付和安全系統(tǒng)由騰訊財(cái)付通提供支援。本文主要介紹如何在微信公眾號(hào)上實(shí)現(xiàn)微信支付的接入、微信支付API的封裝,以及API的調(diào)用,實(shí)現(xiàn)我們一些常見的業(yè)務(wù)調(diào)用。
1、開通微信支付並配置
微信支付是需要微信公眾號(hào)的認(rèn)證基礎(chǔ),也就是只對(duì)認(rèn)證的公眾號(hào)開放,微信認(rèn)證需要簽署相關(guān)的資料,並且進(jìn)行對(duì)帳認(rèn)證,一般會(huì)有電話聯(lián)絡(luò)確認(rèn)相關(guān)的資訊的。
在微信支付API開始使用前,我們一般需要在後臺(tái)進(jìn)行一定的配置,如我們需要配置公眾號(hào)支付的授權(quán)目錄,測試白名單等信息,以及掃碼支援的回調(diào)處理位址(這個(gè)實(shí)作在後面再講),如下所示。
在使用API??之前,我們要知道微信一些關(guān)鍵的操作,如退款、撤銷訂單等操作是需要證書的,而且常規(guī)的支付操作,我們也需要商戶號(hào)、商家支付秘鑰等信息,這些證書和秘鑰信息,是我們從微信支付的商戶平臺(tái)上獲取的,我們微信支付開通並審核通過後,我們就可以登錄商戶平臺(tái)進(jìn)行相關(guān)的操作了。
首先我們需要在開發(fā)的電腦上安裝憑證。
然後需要設(shè)定API的密碼金鑰
#最後在【API安全】專案上下載憑證供我們開發(fā)環(huán)境使用。
?
2、微信支付API的介紹
微信支付配置相關(guān)的參數(shù),並取得憑證、API密碼、商家號(hào)等資訊後,我們可以開始了解微信支付的API的具體使用了,我們需要先把API封裝為C#的類別庫進(jìn)行使用,這樣才能在各種應(yīng)用裡面方便呼叫。
微信支付分為有多種方式,如掃碼支付、公眾號(hào)支付、JSAPI支付、APP支付等方面,不過核心的API都差不多,基本上都覆蓋了下面截圖的幾個(gè)API ,只是有部分的介面差異。
我們可以從其中掃碼付款開始了解,這個(gè)是對(duì)二維碼進(jìn)行掃碼支付的場景,分為了模式一和模式二兩種方式。
掃碼付款可分為兩種模式,商家依照支付場景選擇對(duì)應(yīng)模式。
【模式一】:商家後臺(tái)系統(tǒng)依據(jù)微信支付規(guī)則連結(jié)產(chǎn)生二維碼,連結(jié)中帶固定參數(shù)productid(可定義為產(chǎn)品識(shí)別或訂單號(hào))。用戶掃碼後,微信支付系統(tǒng)將productid和用戶唯一識(shí)別(openid)回調(diào)商戶後臺(tái)系統(tǒng)(需要設(shè)定支付回調(diào)URL),商戶後臺(tái)系統(tǒng)根據(jù)productid產(chǎn)生支付交易,最後微信支付系統(tǒng)發(fā)起用戶支付流程。
【模式二】:商家後臺(tái)系統(tǒng)呼叫微信支付【統(tǒng)一下單API】產(chǎn)生預(yù)付交易,將介面回傳的連結(jié)產(chǎn)生二維碼,用戶掃碼後輸入密碼完成支付交易。注意:此模式的預(yù)付單有效期限為2小時(shí),過期後無法支付。
根據(jù)掃碼支付的API說明,我們可以分別對(duì)這些介面(如統(tǒng)一下單、查詢訂單、關(guān)閉訂單、申請(qǐng)退款、查詢退款、下載對(duì)帳單等介面進(jìn)行逐一包裝,以方便我們的開發(fā)使用。先來看看統(tǒng)一下單的介面說明,以了解它的具體使用。
##除被掃支付場景以外,商家系統(tǒng)先呼叫該介面在微信支付服務(wù)後臺(tái)產(chǎn)生預(yù)付交易單,回傳正確的預(yù)付交易回話標(biāo)識(shí)後再按掃碼、JSAPI、APP等不同場景產(chǎn)生交易串調(diào)起付款。
2)介面連結(jié)
URL位址:https ://api.mch.weixin.qq.com/pay/unifiedorder
#3)是否需要憑證
請(qǐng)求參數(shù)看似很多,大概分成兩個(gè)部分,一部分是系統(tǒng)必須的固定參數(shù),一部分是業(yè)務(wù)所需的參數(shù)。
系統(tǒng)必須的固定參數(shù)如下所示。
有一部分是業(yè)務(wù)參數(shù),業(yè)務(wù)參數(shù)如下所示,主要是記錄訂單的相關(guān)產(chǎn)品ID、說明、費(fèi)用等等?
然後傳回的資料也是XML的,如下面範(fàn)例程式碼所示,而且其中的欄位內(nèi)容還不太確定,因此按官網(wǎng)的建議,使用字典集合來儲(chǔ)存?zhèn)骰氐馁Y料對(duì)象。
?
3、微信支付APIC#封裝和呼叫
///?<summary> ????///?微信支付接口 ????///?</summary> ????public?interface?ITenPayApi ????{?????? ????????///?<summary> ????????///?生成掃描支付模式一URL ????????///?</summary> ????????///?<param>商品ID ????????///?<returns></returns> ????????string?GetPrePayUrl(string?productId); ????????///?<summary> ????????///?生成直接支付url,支付url有效期為2小時(shí),模式二 ????????///?</summary> ????????///?<param>商品訂單數(shù)據(jù) ????????///?<returns></returns> ????????string?GetPayUrl(WxPayOrderData?info); ????????///?<summary> ????????///?統(tǒng)一下單。(不需要證書,默認(rèn)不需要) ????????///?除被掃支付場景以外,商戶系統(tǒng)先調(diào)用該接口在微信支付服務(wù)后臺(tái)生成預(yù)支付交易單, ????????///?返回正確的預(yù)支付交易回話標(biāo)識(shí)后再按掃碼、JSAPI、APP等不同場景生成交易串調(diào)起支付。 ????????///?</summary> ????????///?<param>商品訂單數(shù)據(jù) ????????WxPayData?UnifiedOrder(WxPayOrderData?info); ????????.............
其中的介面方法的輸入?yún)?shù)我們定義一個(gè)實(shí)體類別?
///?<summary> ????///?統(tǒng)一下單的商品訂單信息 ????///?</summary> ????public?class?WxPayOrderData ????{ ????????///?<summary> ????????///?商品ID,?trade_type=NATIVE,此參數(shù)必傳 ????????///?</summary> ????????public?string?product_id?{?get;?set;?} ????????///?<summary> ????????///?商品或支付單簡要描述 ????????///?</summary> ????????public?string?body?{?get;?set;?} ????????///?<summary> ????????///?訂單總金額,單位為分 ????????///?</summary> ????????public?int?total_fee?{?get;?set;?} ????????///?<summary> ????????///?商品標(biāo)記,代金券或立減優(yōu)惠功能的參數(shù),說明詳見代金券或立減優(yōu)惠 ????????///?</summary> ????????public?string?goods_tag?{?get;?set;?} ????????///?<summary> ????????///?交易類型,默認(rèn)為:NATIVE。 ????????///?JSAPI--公眾號(hào)支付、NATIVE--原生掃碼支付、APP--app支付 ????????///?</summary> ????????public?string?trade_type?{?get;?set;?} ????????///?<summary> ????????///?商品名稱明細(xì)列表 ????????///?</summary> ????????public?string?detail?{?get;?set;?} ????????///?<summary> ????????///?附加數(shù)據(jù) ????????///?在查詢API和支付通知中原樣返回,該字段主要用于商戶攜帶訂單的自定義數(shù)據(jù) ????????///?</summary> ????????public?string?attach?{?get;?set;?} ????????///?<summary> ????????///?用戶標(biāo)識(shí) ????????///?trade_type=JSAPI,此參數(shù)必傳,用戶在商戶appid下的唯一標(biāo)識(shí)。 ????????///?</summary> ????????public?string?openid?{?get;?set;?} ????????public?WxPayOrderData() ????????{ ????????????this.trade_type?=?"NATIVE"; ????????} ????}#然後我們定義一個(gè)介面?zhèn)骰氐念悇eWxPayData,它用來儲(chǔ)存回傳的物件資訊的,這個(gè)類別在官網(wǎng)例子裡面有說明,其裡面內(nèi)置一個(gè)排序過的字典對(duì)象進(jìn)行存儲(chǔ)數(shù)據(jù),部分代碼如下所示,我對(duì)它進(jìn)行了相關(guān)的修改,以方便在構(gòu)造函數(shù)裡面初始化一些必備的參數(shù)(固定參數(shù))。
public?class?WxPayData ????{ ????????//采用排序的Dictionary的好處是方便對(duì)數(shù)據(jù)包進(jìn)行簽名,不用再簽名之前再做一次排序 ????????private?SortedDictionary<string>?m_values?=?new?SortedDictionary<string>(); ???????? ????????///?<summary> ????????///?默認(rèn)構(gòu)造函數(shù) ????????///?如果initDefault為true,則自動(dòng)填入字段(appid,mch_id,time_stamp,nonce_str,out_trade_no,) ????????///?</summary> ????????public?WxPayData(bool?initDefault?=?false) ????????{ ????????????if(initDefault) ????????????{ ????????????????Init(); ????????????} ????????} ????????///?<summary> ????????///?對(duì)象初始化后,自動(dòng)填入字段(appid,mch_id,time_stamp,nonce_str,out_trade_no,) ????????///?</summary> ????????public?void?Init() ????????{ ????????????//初始化幾個(gè)參數(shù) ????????????this.SetValue("appid",?WxPayConfig.APPID);//公眾帳號(hào)id ????????????this.SetValue("mch_id",?WxPayConfig.MCHID);//商戶號(hào) ????????????this.SetValue("nonce_str",?GenerateNonceStr());//隨機(jī)字符串 ????????????this.SetValue("out_trade_no",?GenerateOutTradeNo(WxPayConfig.MCHID));//隨機(jī)字符串 ????????}</string></string>
然後我們根據(jù)上面的資料定義,可以實(shí)現(xiàn)統(tǒng)一下單的函數(shù)內(nèi)容,主要是把輸入?yún)?shù)轉(zhuǎn)換成我們需要的字典參數(shù)集合,如下程式碼所示。
///?<summary> ????????///?統(tǒng)一下單。(不需要證書,默認(rèn)不需要) ????????///?除被掃支付場景以外,商戶系統(tǒng)先調(diào)用該接口在微信支付服務(wù)后臺(tái)生成預(yù)支付交易單, ????????///?返回正確的預(yù)支付交易回話標(biāo)識(shí)后再按掃碼、JSAPI、APP等不同場景生成交易串調(diào)起支付。 ????????///?</summary> ????????///?<param>商品訂單數(shù)據(jù) ????????public?WxPayData?UnifiedOrder(WxPayOrderData?info) ????????{ ????????????WxPayData?data?=?new?WxPayData(true); ????????????data.SetValue("product_id",?info.product_id);//商品ID ????????????data.SetValue("openid",?info.openid);//商品ID ????????????//其他信息 ????????????data.SetValue("body",?info.body);//商品描述 ????????????data.SetValue("attach",?info.attach);//附加數(shù)據(jù) ????????????data.SetValue("total_fee",?info.total_fee);//總金額 ????????????data.SetValue("goods_tag",?info.goods_tag);//商品標(biāo)記 ????????????data.SetValue("trade_type",?info.trade_type);//交易類型 ????????????//默認(rèn)構(gòu)建 ????????????data.SetValue("time_start",?DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始時(shí)間 ????????????data.SetValue("time_expire",?DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易結(jié)束時(shí)間 ??????????..............最後的資料交換邏輯,我們透過對(duì)URL進(jìn)行POST提交XML資料給它取得回傳結(jié)果就可以了,如下所示。
????????????string?url?=?"https://api.mch.weixin.qq.com/pay/unifiedorder"; ????????????return?GetPostResult(data,?url);
其中上面的函數(shù)的代碼邏輯如下所示,主要是把返回的結(jié)果再還原為XML對(duì)象類WxPayData。
///?<summary> ????????///?通用的獲取結(jié)果函數(shù) ????????///?</summary> ????????private?WxPayData?GetPostResult(WxPayData?data,?string?url) ????????{ ????????????string?xml?=?data.ToXml(); ????????????string?response?=?helper.GetHtml(url,?xml,?true); ????????????WxPayData?result?=?new?WxPayData(); ????????????result.FromXml(response); ????????????return?result; ????????}
對(duì)于掃碼操作的模式二,直接生成一種二維碼,不需要后臺(tái)進(jìn)行回調(diào)的,那么它的實(shí)現(xiàn)邏輯只需要對(duì)上面代碼進(jìn)行封裝就可以了,如先構(gòu)建二維碼的函數(shù)代碼如下所示。
///?<summary> ????????///?生成直接支付url,支付url有效期為2小時(shí),模式二 ????????///?</summary> ????????///?<param>商品訂單數(shù)據(jù) ????????///?<returns></returns> ????????public?string?GetPayUrl(WxPayOrderData?info) ????????{ ????????????WxPayData?result?=?UnifiedOrder(info);//調(diào)用統(tǒng)一下單接口 ????????????return?result.GetString("code_url");//獲得統(tǒng)一下單接口返回的二維碼鏈接 ????????}
如在Winform界面里面,調(diào)用生成二維碼的代碼如下所示,主要邏輯就是構(gòu)建好二維碼,然后顯示在界面上。
private?void?btnGetPayUrl_Click(object?sender,?EventArgs?e) ????????{ ????????????//測試掃碼模式二的生成二維碼方式 ????????????WxPayOrderData?data?=?new?WxPayOrderData() ????????????{ ????????????????product_id?=?"123456789", ????????????????body?=?"測試支付-模式二", ????????????????attach?=?"愛奇迪技術(shù)支持", ????????????????detail?=?"測試掃碼支付-模式二", ????????????????total_fee?=?1, ????????????????goods_tag?=?"test1" ????????????}; ????????????var?url?=?api.GetPayUrl(data); ????????????var?image?=?api.GenerateQRImage(url); ????????????this.imgGetPayUrl.Image?=?image; ????????????this.imgGetPayUrl.SizeMode?=?PictureBoxSizeMode.StretchImage; ????????}
另外對(duì)于模式一,它在前端傳入一個(gè)簡單的產(chǎn)品ID,生成二維碼,當(dāng)用戶掃碼的時(shí)候,微信后臺(tái)會(huì)調(diào)用商戶平臺(tái)(我們服務(wù)器)的回調(diào)處理方法,這個(gè)回調(diào)方法會(huì)調(diào)用統(tǒng)一下單的API進(jìn)行生成支付交易,過程有點(diǎn)復(fù)雜,我們來看看,我們的實(shí)現(xiàn)代碼如下所示。
///?<summary> ????????///?生成掃描支付模式一URL ????????///?</summary> ????????///?<param>商品ID ????????///?<returns></returns> ????????public?string?GetPrePayUrl(string?productId) ????????{ ????????????WxPayData?data?=?new?WxPayData(true); ????????????data.SetValue("product_id",?productId);//商品ID????? ????????????data.SetValue("time_stamp",?data.GenerateTimeStamp());//隨機(jī)字符串????????? ????????????data.SetValue("sign",?data.MakeSign());//簽名 ????????????string?str?=?data.ToUrlParams();//轉(zhuǎn)換為URL串 ????????????string?url?=?"weixin://wxpay/bizpayurl?"?+?str; ????????????return?url; ????????}
它的調(diào)用代碼生成二維碼操作如下所示。
private?void?btnGetPrePayUrl_Click(object?sender,?EventArgs?e) ????????{ ????????????var?productId?=?"12345678"; ????????????var?url?=?api.GetPrePayUrl(productId); ????????????var?image?=?api.GenerateQRImage(url); ????????????this.imgGetPrePayUrl.Image?=?image; ????????????this.imgGetPayUrl.SizeMode?=?PictureBoxSizeMode.StretchImage; ????????}
我們?cè)诘谝恍」?jié)里面介紹了,需要在微信后臺(tái)配置掃碼的回調(diào)函數(shù),如下所示。
這樣我們還需要添加一個(gè)頁面aspx、或者一般處理程序ashx的方式來實(shí)現(xiàn)掃碼的回調(diào)過程。具體的邏輯也就是在這個(gè)頁面里面獲取到提交過來的參數(shù),然后調(diào)用統(tǒng)一下單處理后,進(jìn)行數(shù)據(jù)返回即可,代碼邏輯如下所示。
?
4、在頁面上進(jìn)行掃碼處理
前面的例子,我介紹了Winfrom的掃碼例子,很多時(shí)候,我們的應(yīng)用可能是基于Web的,那么它的實(shí)現(xiàn)是如何的呢,下面我繼續(xù)介紹一下。
首先我們?cè)谧约旱臉I(yè)務(wù)Web后臺(tái)系統(tǒng)里面,添加兩個(gè)頁面,主要是用來生成二維碼在頁面上進(jìn)行展示的,如下所示。
最終我們?cè)贜ativePayPage.aspx頁面上展示我們的二維碼,方便用戶進(jìn)行掃碼支付處理,頁面的代碼很簡單,我們只需要在前端頁面放置兩個(gè)圖片控件,圖片內(nèi)容通過MakeQRCode.aspx頁面進(jìn)行生成就可以了。
nbsp;html> ????<meta> ????<meta>? ????<title>微信支付樣例-掃碼支付</title> ????<div>掃碼支付模式一</div><br> ????<image></image> ????<br><br><br> ????<div>掃碼支付模式二</div><br> ????<image></image> ????
頁面后臺(tái)的代碼就是綁定二維碼的過程,代碼如下所示,和Winform的代碼類似操作。
protected?void?Page_Load(object?sender,?EventArgs?e) ????????{ ????????????TenPayApi?api?=?new?TenPayApi(); ????????????var?productId?=?"123456789"; ????????????//生成掃碼支付模式一url ????????????string?url1?=?api.GetPrePayUrl(productId); ????????????//生成掃碼支付模式二url ????????????WxPayOrderData?info?=?new?WxPayOrderData() ????????????{ ????????????????product_id?=?"123456789", ????????????????body?=?"測試支付-模式二", ????????????????attach?=?"愛奇迪技術(shù)支持", ????????????????detail?=?"測試掃碼支付-模式二", ????????????????total_fee?=?1, ????????????????goods_tag?=?"test1" ????????????}; ????????????string?url2?=?api.GetPayUrl(info); ????????????//將url生成二維碼圖片 ????????????Image1.ImageUrl?=?"MakeQRCode.aspx?data="?+?HttpUtility.UrlEncode(url1); ????????????Image2.ImageUrl?=?"MakeQRCode.aspx?data="?+?HttpUtility.UrlEncode(url2); ????????}
實(shí)現(xiàn)后的頁面效果如下所示。
實(shí)現(xiàn)并預(yù)覽效果,確定是我們所需的頁面后,我們可以發(fā)布在公眾號(hào)的菜單連接上進(jìn)行測試使用了。
打開微信公眾號(hào)-廣州愛奇迪,我們可以看到對(duì)應(yīng)的菜單發(fā)生改變,并且看到進(jìn)入微信支付的菜單可以進(jìn)行支付了。
??
??
?
以上就是微信支付的掃碼過程的一個(gè)實(shí)現(xiàn),微信支付還包括很多其他API接口,後面有機(jī)會(huì)可以繼續(xù)介紹。微信支付的介面實(shí)作雖然相對(duì)其他微信介面比較複雜一些,但是我們一旦完成幾個(gè)案例,後面的就相對(duì)比較容易的了,因?yàn)樗暮艚蟹绞交旧媳容^一致,很類似。
?更多C#開發(fā)微信入口網(wǎng)站及應(yīng)用微信支付存取與API封裝使用相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

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

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

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

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