C# .NET MVC微信JSAPI支付
C# .NET MVC微信JSAPI支付
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
開發工具與關鍵技術:Visual Studio 2015 ASP .NET MVC
作者:熊俊杰
撰寫時間:2020.8.7
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
經過本人不斷翻找資料和百度終于結合一些大佬的經驗和思路弄出來一個MVC的微信支付了。
再弄微信支付之前我們需要先有一個商戶號,并且開通了微信支付的JSAPI支付功能,也需要申請微信公眾號并綁定指定的商戶號。
首先我們根據微信官方給出的文檔得知我們要在H5調起微信支付的流程如下:
文檔的鏈接 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4
在H5中調起微信支付,官方已經明確的告訴了我們我們需要拿到哪些數據才可以調起微信支付的功能,如下:
只有拿到了這些數據并使用微信指定的方法‘WeixinJSBridge.invoke()’通過’getBrandWCPayRequest’來拉起微信支付,當然這些都是最后的步驟。
首先我們需要檢測頁面是否在微信內置環境中打開,先使用微信官方給的一個插件:
<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支付只能在微信環境下才可以調起支付,在其他的環境中我們無法拉起微信支付的功能。
然后我們要去微信官方下載一個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傳過來支付的金額傳到我們的控制器,再通過微信官方給的方法去獲取出我們需要的數據出來
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//若傳遞了相關參數,則調統一下單接口,獲得后續相關接口的入口參數jsApiPay.openid = openid;//jsApiPay.total_fee = int.Parse(strFee);//JSAPI支付預處理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 = "下單失敗,請重試,多次失敗,請聯系管理員."};objResult = aOrder;}return Json(objResult);}在這里我們需要將官方的這個JsApiPay實體里面稍微做一些改動,在這我也是參照網絡上的模板來弄的,如下:
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這個示例里面的一些私人數據,比如商戶號,商戶密匙,公眾號APPID 和公眾號密匙AppSecret等等.
弄完這些差不多就可以實現調起微信支付了,這里需要特別聲明這里支付的結果回調官方給了特別說明,不能保證絕對的正確,所以我們需要再去根據商戶訂單號或者微信支付號再去查詢回調結果保證數據不會出現錯誤。
總結
以上是生活随笔為你收集整理的C# .NET MVC微信JSAPI支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 名声虽响,学费也贵!北京大学软微计算机硕
- 下一篇: C# 键值对 KeyValue 解析