ASP.NET MVC 開發(fā)微信支付H5的實現(xiàn)示例(外置瀏覽器支付)
H5支付是指商戶在微信客戶端外的移動端網(wǎng)頁展示商品或服務,用戶在前述頁面確認使用微信支付時,商戶發(fā)起本服務呼起微信客戶端進行支付。
主要用于觸屏版的手機瀏覽器請求微信支付的場景??梢苑奖愕膹耐獠繛g覽器喚起微信支付。
微信開放平臺上的也只是簡單的介紹了一下邏輯和常見問題,網(wǎng)上查看了很多,說的都不夠具體
首先需要在微信商戶平臺里開通 H5支付
申請入口:登錄商戶平臺-->產(chǎn)品中心-->我的產(chǎn)品-->支付產(chǎn)品-->H5支付
代碼邏輯:
1、用戶在商戶側完成下單,使用微信支付進行支付
2、由商戶后臺向微信支付發(fā)起下單請求(調(diào)用統(tǒng)一下單接口)注:交易類型trade_type=MWEB
3、統(tǒng)一下單接口返回支付相關參數(shù)給商戶后臺,如支付跳轉url(參數(shù)名“mweb_url”),商戶通過mweb_url調(diào)起微信支付中間頁
4、中間頁進行H5權限的校驗,安全性檢查
5、如支付成功,商戶后臺會接收到微信側的異步通知
6、用戶在微信支付收銀臺完成支付或取消支付,返回商戶頁面(默認為返回支付發(fā)起頁面)
7、商戶在展示頁面,引導用戶主動發(fā)起支付結果的查詢
8,9、商戶后臺判斷是否接到收微信側的支付結果通知,如沒有,后臺調(diào)用我們的訂單查詢接口確認訂單狀態(tài)
10、展示最終的訂單支付結果給用戶
我們需要用到的參數(shù):
- AppID(應用ID)
- AppSecret(應用密鑰)
- 微信支付商戶號
- 微信商戶支付密鑰
我這里使用了第三方封裝的SDK。謝謝開發(fā)者SDK的幫助。
Senparc.Weixin
獻上地址:https://weixin.senparc.com/
H5支付其實就是生成一個鏈接,點擊后會激活微信APP,彈出支付窗口
所以需要生成一個符合規(guī)則的Url,引入SDK
Com.Wxpay.WxPayConfig wxConfig = new Com.Wxpay.WxPayConfig();
Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);
packageReqHandler.SetParameter("appid", wxConfig.appid);//APPID
packageReqHandler.SetParameter("mch_id", wxConfig.mchid);//商戶號
packageReqHandler.SetParameter("nonce_str", Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr());
packageReqHandler.SetParameter("body", "測試商品");
packageReqHandler.SetParameter("out_trade_no", model.OrderID);//訂單號
packageReqHandler.SetParameter("total_fee", cost.ToString()); //金額,以分為單位
packageReqHandler.SetParameter("spbill_create_ip", Request.UserHostAddress);//IP
packageReqHandler.SetParameter("notify_url", "http://" + HttpContext.Request.Url.Host + "/WxPay/PayNotifyUrl"); //回調(diào)地址
packageReqHandler.SetParameter("trade_type", "MWEB");//這個不可以改。固定為Mweb
packageReqHandler.SetParameter("sign", packageReqHandler.CreateMd5Sign("key", wxConfig.key));
string data = packageReqHandler.ParseXML();
var urlFormat = "https://api.mch.weixin.qq.com/pay/unifiedorder";
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
MemoryStream ms = new MemoryStream();
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);
var result = RequestUtility.HttpPost(urlFormat, null, ms);
var res = System.Xml.Linq.XDocument.Parse(result);
string mweb_url = res.Element("xml").Element("mweb_url").Value;
然后我們會得到下面的Xml
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx***********]]></appid> <mch_id><![CDATA[1*******]]></mch_id> <nonce_str><![CDATA[4rN3Sy63EsAErTq7]]></nonce_str> <sign><![CDATA[0E34B9B750778540436A5CDF005212CF]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201********************************]]></prepay_id> <trade_type><![CDATA[MWEB]]></trade_type> <mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=*******71655&package=1******9]]></mweb_url> </xml>
提取到 mweb_url,綁定到href上即可。
<a rel="external nofollow" >立即支付</a>
支付成功之后,在回調(diào)地址里處理業(yè)務邏輯
/// <summary>
/// 支付結果回調(diào)地址
/// </summary>
/// <returns></returns>
[HttpPost]
public virtual ActionResult PayNotifyUrl()
{
Com.Wxpay.WxPayConfig wxConfig = new Com.Wxpay.WxPayConfig();
Senparc.Weixin.MP.TenPayLibV3.ResponseHandler payNotifyRepHandler = new Senparc.Weixin.MP.TenPayLibV3.ResponseHandler(null);
payNotifyRepHandler.SetKey(wxConfig.key);
string return_code = payNotifyRepHandler.GetParameter("return_code");
string return_msg = payNotifyRepHandler.GetParameter("return_msg");
string xml = string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg);
if (return_code.ToUpper() != "SUCCESS")
{
return Content(xml, "text/xml");
}
string out_trade_no = payNotifyRepHandler.GetParameter("out_trade_no");
//微信服務器可能會多次推送到本接口,這里需要根據(jù)out_trade_no去查詢訂單是否處理,如果處理直接返回:return Content(xml, "text/xml"); 不跑下面代碼
//驗證請求是否從微信發(fā)過來(安全)
if (payNotifyRepHandler.IsTenpaySign())
{
//TO DO
}
else
{
}
return Content(xml, "text/xml");
}
注意:
不要使用此url直接打開,會提示錯誤。
微信官方文檔地址:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
asp.net+js實現(xiàn)的ajax sugguest搜索提示效果
阿會楠根據(jù)網(wǎng)上一份原作者不詳?shù)拇a進行了修改,以適合自己的項目并增加了多個功能。此次放出的代碼為基本實現(xiàn)代碼,也是最接近原來的代碼,略去其他功能。版權歸原作者所有。2009-04-04
Repeater控件動態(tài)變更列(Header,Item和Foot)信息(重構cs)
上一篇雖然它算不上是完全動態(tài)化,但它已經(jīng)達到初期想要的效果,現(xiàn)另開一篇,不是重新另外寫,而是想重構cs的代碼,因為前一篇的代碼雖然簡單,但代碼冗余過多,感興趣的朋友可以參考下哈2013-03-03
.NET使用StackTrace獲取方法調(diào)用信息的代碼演示
StackTrace, 位于 System.Diagnostics 命名空間下,名字很直觀,它代表一個方法調(diào)用的跟蹤堆棧,里面存放著按順序排列的棧幀對象(StackFrame),每當發(fā)生一次調(diào)用,就會壓入一個棧幀,這篇文章主要介紹了.NET使用StackTrace獲取方法調(diào)用信息,需要的朋友可以參考下2022-09-09

