目前想鹰,從商城網(wǎng)站紊婉、餐廳、商場(chǎng)辑舷、超市到菜市喻犁、小賣部、路邊攤,移動(dòng)支付無(wú)處不在肢础,極大地方便了我們的生活还栓。特別是微信支付,應(yīng)用極廣传轰,很受大眾歡迎剩盒。然而,對(duì)于擁有H5移動(dòng)商城的商家來(lái)說(shuō)慨蛙,微信支付只能在微信客戶端內(nèi)實(shí)現(xiàn)辽聊,而在微信中又無(wú)法使用支付寶,這是令人非常蛋疼的事股淡。
現(xiàn)在身隐,好消息來(lái)了!微信已全面開放了H5支付功能唯灵,它將實(shí)現(xiàn)在微信客戶端之外的H5商城網(wǎng)頁(yè)場(chǎng)景完成支付贾铝,極大地滿足了商家的收款需求和買家便捷支付的要求。
好東西當(dāng)然不能錯(cuò)過(guò)埠帕,但如何快速將H5支付功能嵌入到您的H5商城中呢垢揩?微信并沒(méi)有提供官方Demo可以參考。沒(méi)關(guān)系敛瓷,按照本文的方法叁巨,您不需要再花精力做額外的開發(fā),只需三步就能輕松搞定呐籽。
【我的思路】既然H5支付也是通過(guò)調(diào)用統(tǒng)一下單接口來(lái)實(shí)現(xiàn)锋勺,那么直接用官方提供的公眾號(hào)支付SDK(WxPayAPI_CS_v3)進(jìn)行擴(kuò)展和修改不就行了嗎?省時(shí)省力(本人比較懶狡蝶,能不折騰就盡量不折騰庶橱,哈哈)。
【準(zhǔn)備工作】一贪惹、您已經(jīng)調(diào)通了WxPayAPI_CS_v3(可以正常實(shí)現(xiàn)公眾號(hào)支付)苏章,二、您已經(jīng)開通了H5支付功能(需要去微信商戶平臺(tái)上申請(qǐng)開通)奏瞬。對(duì)這方面不清楚的朋友請(qǐng)查閱相關(guān)文檔枫绅,它不是本文所要討論的話題。
現(xiàn)在硼端,就讓我們開始吧并淋!
第一步
在WxPayAPI/ business文件夾下添加一個(gè)類,將其命名為H5Pay(可從JsApiPay.cs中復(fù)制相關(guān)代碼進(jìn)行修改珍昨,重點(diǎn)是將交易類型trade_type設(shè)置為MWEB县耽,另外還要傳遞終端IP)订咸,H5Pay.cs的完整代碼如下:
using System.Web;
namespace WxPayAPI
{
? ? public class H5Pay
? ? {
? ? ? ? public string GetPayUrl(string thip)
? ? ? ? {
? ? ? ? ? ? Log.Info(this.GetType().ToString(), "H5 pay url is producing...");
? ? ? ? ? ? WxPayData data = new WxPayData();
? ? ? ? ? ? data.SetValue("body",”商品描述”); //這里替換成你的數(shù)據(jù)
? ? ? ? ? ? data.SetValue("attach", "詳見我的訂單");//這里替換成你的數(shù)據(jù)
? ? ? ? ? ? data.SetValue("out_trade_no",”商戶訂單號(hào)”); //這里替換成你的數(shù)據(jù)
? ? ? ? ? ? data.SetValue("total_fee",”總金額”); //這里替換成你的數(shù)據(jù)
? ? ? ? ? ? data.SetValue("spbill_create_ip", thip);// 終端IP
? ? ? ? ? ? data.SetValue("trade_type", "MWEB");//交易類型
? ? ? ? ? ? data.SetValue("scene_info", "{'h5_info':{'type':'Wap','wap_url':'你的H5域名','wap_name':'你的商城名稱'}}");//場(chǎng)景信息
? ? ? ? ? ? WxPayData result = WxPayApi.UnifiedOrder(data);//調(diào)用統(tǒng)一下單接口
? ? ? ? ? ? string url = result.GetValue("mweb_url").ToString();//獲得統(tǒng)一下單接口返回的鏈接
? ? ? ? ? ? Log.Info(this.GetType().ToString(), "Get H5 pay url : " + url);
? ? ? ? ? ? return url;
? ? ? ? }
? ? }
}
說(shuō)明:GetPayUrl方法將返回微信支付中間頁(yè)的跳轉(zhuǎn)URL(即統(tǒng)一下單接口返回的mweb_url參數(shù))。
第二步
在example文件夾下添加一個(gè)Web窗體酬诀,將其命名為H5PayPage,前臺(tái)H5PayPage.aspx里不需要添加任何東西骆撇,在H5PayPage.aspx.cs中添加相關(guān)代碼瞒御,其完整代碼如下:
using System;
using System.Web;
namespace WxPayAPI
{
? ? public partial class H5PayPage : System.Web.UI.Page
? ? {
? ? ? ? protected void Page_Load(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? Log.Info(this.GetType().ToString(), "page load");
? ? ? ? ? ? H5Pay h5Pay = new H5Pay();
? ? ? ? ? ? string scip = GetIP();//獲取客戶端真實(shí)IP
? ? ? ? ? ? string url = h5Pay.GetPayUrl(scip);//通過(guò)統(tǒng)一下單接口進(jìn)行H5支付
? ? ? ? ? ? Response.Redirect(url); //跳轉(zhuǎn)到微信支付中間頁(yè)
? ? ? ? }
? ? ? ? //因H5支付要求商戶在統(tǒng)一下單接口中上傳用戶真實(shí)ip地址“spbill_create_ip”,故需要調(diào)用以下方法神郊。
? ? ? ? public string GetIP()
? ? ? ? {
? ? ? ? ? ? HttpRequest request = HttpContext.Current.Request;
? ? ? ? ? ? string result = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
? ? ? ? ? ? if (string.IsNullOrEmpty(result))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? result = request.ServerVariables["REMOTE_ADDR"];
? ? ? ? ? ? }
? ? ? ? ? ? if (string.IsNullOrEmpty(result))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? result = request.UserHostAddress;
? ? ? ? ? ? }
? ? ? ? ? ? if (string.IsNullOrEmpty(result))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? result = "0.0.0.0";
? ? ? ? ? ? }
? ? ? ? ? ? return result;
? ? ? ? }
? ? }
}
第三步
打開WxPayAPI/lib/WxPayApi.cs文件肴裙,找到UnifiedOrder方法,再找到如下4行原代碼:
inputObj.SetValue("appid", WxPayConfig.APPID);//公眾賬號(hào)ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商戶號(hào)
inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//終端ip
inputObj.SetValue("nonce_str", GenerateNonceStr());//隨機(jī)字符串
將其修改為:
//若終端IP未設(shè)置涌乳,則使用配置文件中的終端IP
if (!inputObj.IsSet("spbill_create_ip"))
{
inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//終端IP
}
inputObj.SetValue("appid", WxPayConfig.APPID);//公眾賬號(hào)ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商戶號(hào)
inputObj.SetValue("nonce_str", GenerateNonceStr());//隨機(jī)字符串
說(shuō)明:因?yàn)樵a傳遞給調(diào)用統(tǒng)一下單接口的終端IP是配置文件Config.cs中的默認(rèn)值(8.8.8.8)蜻懦,這樣肯定會(huì)出錯(cuò)(H5支付要求上傳用戶真實(shí)IP),因此需要加上一個(gè)判斷夕晓,即如果已經(jīng)設(shè)置了終端IP則不使用默認(rèn)值宛乃。
OK,這樣就行了蒸辆,是不是非常簡(jiǎn)單征炼?
【最后要說(shuō)的】其它平臺(tái)(如PHP、java等)照此思路操作也是一件很輕松的事兒躬贡。H5支付結(jié)果異步回調(diào)通知與公眾號(hào)支付(JSAPI支付)和掃碼支付都是統(tǒng)一的接口谆奥,如果你之前已做好了更新訂單的邏輯處理,那現(xiàn)在就不需要做重復(fù)勞動(dòng)了拂玻,是不是很爽酸些?