1. 程式人生 > >C# 微信支付之公眾號支付

C# 微信支付之公眾號支付

第一次接觸微信支付這塊, 把微信支付的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         }