C# .NET MVC微信JSAPI支付
C# .NET MVC微信JSAPI支付
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
開發(fā)工具與關(guān)鍵技術(shù):Visual Studio 2015 ASP .NET MVC
作者:熊俊杰
撰寫時間:2020.8.7
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
經(jīng)過本人不斷翻找資料和百度終于結(jié)合一些大佬的經(jīng)驗和思路弄出來一個MVC的微信支付了。
再弄微信支付之前我們需要先有一個商戶號,并且開通了微信支付的JSAPI支付功能,也需要申請微信公眾號并綁定指定的商戶號。
首先我們根據(jù)微信官方給出的文檔得知我們要在H5調(diào)起微信支付的流程如下:
文檔的鏈接 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4
在H5中調(diào)起微信支付,官方已經(jīng)明確的告訴了我們我們需要拿到哪些數(shù)據(jù)才可以調(diào)起微信支付的功能,如下:
只有拿到了這些數(shù)據(jù)并使用微信指定的方法‘WeixinJSBridge.invoke()’通過’getBrandWCPayRequest’來拉起微信支付,當(dāng)然這些都是最后的步驟。
首先我們需要檢測頁面是否在微信內(nèi)置環(huán)境中打開,先使用微信官方給的一個插件:
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>然后在使用如下方法判斷:
var ua = navigator.userAgent.toLowerCase();if (ua.match(/MicroMessenger/i) == "micromessenger") {//ios的ua中無miniProgram,但都有MicroMessenger(表示是微信瀏覽器)//https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CNwx.miniProgram.getEnv((res) => {if (openid == "") {getCode();}})} else {//alert('不在微信里');}因為微信的JSAPI支付只能在微信環(huán)境下才可以調(diào)起支付,在其他的環(huán)境中我們無法拉起微信支付的功能。
然后我們要去微信官方下載一個C#的JSAPI支付的示例,然后把其中的business和lib這兩個文件夾拷貝到自己的項目里面去
在這之前我們需要在控制器里面自定義一個實體
public class ModelForOrder{public string appId { get; set; }public string timeStamp { get; set; }public string nonceStr { get; set; }public string packageValue { get; set; }public string paySign { get; set; }public string msg { get; set; }}然后我們再去將js傳過來支付的金額傳到我們的控制器,再通過微信官方給的方法去獲取出我們需要的數(shù)據(jù)出來
JsApiPay jsApiPay = new JsApiPay(); [HttpPost]public ActionResult MeterRecharge(){object objResult = "";string strTotal_fee = Request.Form["totalfee"];string strFee = (double.Parse(strTotal_fee) * 100).ToString();var openid = Session["openid"].ToString();//用戶的OpenID//若傳遞了相關(guān)參數(shù),則調(diào)統(tǒng)一下單接口,獲得后續(xù)相關(guān)接口的入口參數(shù)jsApiPay.openid = openid;//jsApiPay.total_fee = int.Parse(strFee);//JSAPI支付預(yù)處理try{string strBody = "wx";//商品描述WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(strBody);WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();var dingdanhao = WxPayApi.DingDanHao;Session["DingDanHao"] = dingdanhao;ModelForOrder aOrder = new ModelForOrder(){appId = wxJsApiParam.GetValue("appId").ToString(),nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(),packageValue = wxJsApiParam.GetValue("package").ToString(),paySign = wxJsApiParam.GetValue("paySign").ToString(),timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(),msg = "成功下單,正在接入微信支付."};objResult = aOrder;}catch (Exception ex){ModelForOrder aOrder = new ModelForOrder(){appId = "",nonceStr = "",packageValue = "",paySign = "",timeStamp = "",msg = "下單失敗,請重試,多次失敗,請聯(lián)系管理員."};objResult = aOrder;}return Json(objResult);}在這里我們需要將官方的這個JsApiPay實體里面稍微做一些改動,在這我也是參照網(wǎng)絡(luò)上的模板來弄的,如下:
public JsApiPay(Page page){this.page = page;} 需要改為: public JsApiPay(){ }由于官方的這個GetJsApiParameters()實例是string類型的,這里我們改成了WxPayData類型的實例
public string GetJsApiParameters(){Log.Debug(this.GetType().ToString(), "JsApiPay::GetJsApiParam is processing...");WxPayData jsApiParam = new WxPayData();jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid"));jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp());jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr());jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id"));jsApiParam.SetValue("signType", "MD5");jsApiParam.SetValue("paySign", jsApiParam.MakeSign());string parameters = jsApiParam.ToJson();Log.Debug(this.GetType().ToString(), "Get jsApiParam : " + parameters);return parameters;}需要改為:
public WxPayData GetJsApiParameters(){Log.Debug(this.GetType().ToString(), "JsApiPay::GetJsApiParam is processing...");WxPayData jsApiParam = new WxPayData();jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid"));jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp());jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr());jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id"));jsApiParam.SetValue("signType", "MD5");jsApiParam.SetValue("paySign", jsApiParam.MakeSign());string parameters = jsApiParam.ToJson();Log.Debug(this.GetType().ToString(), "Get jsApiParam : " + parameters);return jsApiParam;}弄完這些我們還需要再lib文件夾的 DemoConfig這個示例里面的一些私人數(shù)據(jù),比如商戶號,商戶密匙,公眾號APPID 和公眾號密匙AppSecret等等.
弄完這些差不多就可以實現(xiàn)調(diào)起微信支付了,這里需要特別聲明這里支付的結(jié)果回調(diào)官方給了特別說明,不能保證絕對的正確,所以我們需要再去根據(jù)商戶訂單號或者微信支付號再去查詢回調(diào)結(jié)果保證數(shù)據(jù)不會出現(xiàn)錯誤。
總結(jié)
以上是生活随笔為你收集整理的C# .NET MVC微信JSAPI支付的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 名声虽响,学费也贵!北京大学软微计算机硕
- 下一篇: 2022R1快开门式压力容器操作考试试题