C# 微信支付之公眾號支付
阿新 • • 發佈:2018-11-21
第一次接觸微信支付這塊, 把微信支付的sdk研究了很久,也 在網上找了很多的資料 記錄一下 防止哪天忘記。
微信支付步驟:
1,獲取code
2,獲取access_token 和使用者openID
3,查詢訂單詳情
4,初始化微信支付環境
6,提交充值資料
5,調統一下單介面 ,獲得後續相關介面的入口引數
6,完成支付
(一)、獲取code ,access_token 和使用者openID 在支付介面上都可以直接使用。 所以不做介紹了 , 直接到第四步。
(二)、放上支付核心的程式碼 及js (這裡也是用的支付介面 但是根據需要做了修改)
1 //初始化微信支付環境 2 function fCharge() { 4 if (typeof WeixinJSBridge == "undefined") { 5 if (document.addEventListener) { 6 document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); 7 } else if (document.attachEvent) {8 document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 9 document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); 10 } 11 } else { 12 fPostCharge(); 13 } 14 }
1 //提交充值資料 2 function fPostCharge() {3 var total_fee = $("#total_fee").val(); 4 total_fee = parseInt(total_fee)*100; 5 if (total_fee > 0) { 6 $.messager.progress({ 7 title: "", 8 msg: "正在呼叫微信支付介面,請稍後..." 9 }); 10 $.ajax({ 11 type: "post", 12 data: {total_fee:total_fee,projectID:@Model.ID}, 13 url: "@Url.Action("JSAPIPay", "WeChat")", 14 success: function (json) { 15 if(json.message == false){ 16 location.href="@Url.Action("Error", "WeChat")"; 17 }else{ 18 $.messager.progress('close');//記得關閉 19 20 onBridgeReady(json.objResult); 21 } 23 }, 24 error: function () { 25 $.messager.progress('close');//記得關閉 26 $.messager.alert("提示", '呼叫微信支付模組失敗,請稍後再試。', 'info') 27 } 28 }) 29 } 30 else { 31 alert("金額不可以為空或者為負數,請確認後再試.") 32 } 33 }
後臺接收
1 public ActionResult JSAPIPay(string total_fee, int projectID) 2 { 3 object objResult = ""; 4 //JSAPI支付預處理 5 try 6 { 7 if (Session["openid"] != null) {15 //若傳遞了相關引數,則調統一下單介面,獲得後續相關介面的入口引數 16 var project = REAS_BLL.bll_Project.GetByID(projectID); 17 18 JsApiPay jsApiPay = new JsApiPay(); 19 jsApiPay.openid = Session["openid"].ToString(); 20 jsApiPay.total_fee = Convert.ToInt32(total_fee); 21 jsApiPay.product_id = project.ID; 22 jsApiPay.body = project.Name + "(" + project.ReportNo + ")"; 23 24 WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(); 25 WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();//獲取H5調起JS API引數 26 27 ModelForOrder aOrder = new ModelForOrder() 28 { 29 appId = wxJsApiParam.GetValue("appId").ToString(), 30 nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(), 31 packageValue = wxJsApiParam.GetValue("package").ToString(), 32 paySign = wxJsApiParam.GetValue("paySign").ToString(), 33 timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(), 34 msg = "成功下單,正在接入微信支付." 35 }; 36 objResult = aOrder;
37 } 39 } 40 catch (Exception ex) 41 { 42 ModelForOrder aOrder = new ModelForOrder() 43 { 44 appId = "", 45 nonceStr = "", 46 packageValue = "", 47 paySign = "", 48 timeStamp = "", 49 msg = "下單失敗,請重試,多次失敗,請聯絡管理員." 50 }; 51 objResult = aOrder; 52 Log.Error(this.GetType().ToString(), ex.Message.ToString()); 53 } 54 return Json(new { Success= true, objResult }, JsonRequestBehavior.AllowGet); 55 }
1 //呼叫微信支付模組 2 function onBridgeReady(json) { 3 WeixinJSBridge.invoke( 4 'getBrandWCPayRequest', { 5 "appId": json.appId, //公眾號名稱,由商戶傳入 6 "timeStamp": json.timeStamp, //時間戳,自1970年以來的秒數 7 "nonceStr": json.nonceStr, //隨機串 8 "package": json.packageValue, 9 "signType": "MD5", //微信簽名方式: 10 "paySign": json.paySign //微信簽名 11 }, 12 function (res) { 13 if (res.err_msg == "get_brand_wcpay_request:ok") { 16 var total_fee = $("#total_fee").val(); 17 total_fee = parseInt(total_fee); 18 window.location.href = "@Url.Action("ProductPage", "WeChat")?total_fee="+total_fee+"&projectId="+@Model.ID; 19 fAlreadyPay(); 20 } // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在使用者支付成功後返回 ok,但並不保證它絕對可靠。 21 } 22 ); 23 }