微信JSApi支付~集成到MVC環境後的最後一個坑(網上沒有這種解決方案)

来源:http://www.cnblogs.com/lori/archive/2016/04/14/5390537.html
-Advertisement-
Play Games

大叔第一人 之前寫了關於微信的坑《微信JSApi支付~坑和如何填坑》,今天將微信的jsapi支付封裝到了MVC環境里,當然也出現了一些新的坑,如支付參數應該是Json對象而不是Json字元串,這樣也會應付引起“get_brand_wcpay_request:fail_invalid appid”這個 ...


大叔第一人

之前寫了關於微信的坑《微信JSApi支付~坑和如何填坑》,今天將微信的jsapi支付封裝到了MVC環境里,當然也出現了一些新的坑,如支付參數應該是Json對象而不是Json字元串,這樣也會應付引起“get_brand_wcpay_request:fail_invalid appid”這個大家都知道的異常,呵呵,解決方案網上說是“授權目錄“,事實上,還有一種原因,那就是你的WeixinJSBridge.invoke方法里的參數應該是Json對象而不是字元串,這才是最重要的。

代碼我們需要寫成下麵的格式

    //調用微信JS api 支付
        function jsApiCall() {
            var price = 1.0;
            var no = '@Request.QueryString["orderNumber"]';
            var action = '@Url.Action("Get")';
            var openID = '@openID';
            $.get(action, { price: price, orderNumber: no, openID: openID }, function (data) {
                WeixinJSBridge.invoke('getBrandWCPayRequest', JSON.parse(data), function (res) {
                    WeixinJSBridge.log(res.err_msg);
                    alert(res.err_code + res.err_desc + res.err_msg);
                });
            });
        }

對於我們封裝成MVC後,由於MVC的路由將擴展名去除了,所以我們的授權目錄也發生了變化,如Order/Pay這個頁面,在收取時應該是http://功能變數名稱/Order/Pay/,而之前的http://功能變數名稱/Order/這個級別就不被認可了,這點也要註意一下。

還有一點要註冊,如果你添加了測試授權目錄,那必須要添加測試用的白名單,否則你的微信也測試不了。

大叔封裝的MVC版的微信JSAPI支付

    /// <summary>
    /// 構建支付處理類
    /// </summary>
    public class JsApiImplement
    {
        public static string wxJsApiParam { get; set; } //H5調起JS API參數

       /// <summary>
       /// 返回當前微信客戶端的OpenId,每個客戶端在每個公眾號里的OpenId是唯一的
       /// </summary>
       /// <returns></returns>
        public static string GetOpenId()
        {
            JsApiPay jsApiPay = new JsApiPay(System.Web.HttpContext.Current);
            jsApiPay.GetOpenidAndAccessToken();
            Log.Debug("GetOpenId", "openid : " + jsApiPay.openid);
            return jsApiPay.openid;
        }


        /// <summary>
        /// JsApi返回微信支付的連接參數,這個方法需要前臺UI頁面調用,通常可以使用AJAX進行調用它
        /// </summary>
        /// <param name="total_fee">訂單金額</param>
        /// <param name="orderId">業務的訂單編號</param>
        /// <returns></returns>
        public static string Send(int total_fee, string orderId, string openId)
        {
            try
            {
                //調用【網頁授權獲取用戶信息】介面獲取用戶的openid和access_token
                //jsApiPay.GetOpenidAndAccessToken();
                JsApiPay jsApiPay = new JsApiPay(System.Web.HttpContext.Current);
                jsApiPay.openid = openId;
                Log.Debug("Send", "openid : " + jsApiPay.openid);
                //若傳遞了相關參數,則調統一下單介面,獲得後續相關介面的入口參數,微信的價格是分
                jsApiPay.total_fee = total_fee;
                WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(orderId);
                wxJsApiParam = jsApiPay.GetJsApiParameters();//獲取H5調起JS API參數                    
                Log.Debug("Send", "wxJsApiParam : " + wxJsApiParam);
            }
            catch (Exception ex)
            {
                Log.Error("Error", ex.Message);
            }
            return wxJsApiParam;
        }

        /// <summary>
        /// JsApi微信回調
        /// </summary>
        public static void Notify(Action<NotifyModel> action)
        {
            var context = System.Web.HttpContext.Current;
            ResultNotify resultNotify = new ResultNotify(context);
            resultNotify.ProcessNotify(action);
        }
    }

對於使用者來說,也很簡單,在頁面上拿OpenId,之後把OpenId傳到後臺方法,拿到微信支付的參數對象(JSON對象),之後完成支付

<script type="text/javascript">

    //調用微信JS api 支付
    function jsApiCall() {
        $.get("/weixin/get", new { money: 1, order: '001', openId: 'test' }, function (data) {
            WeixinJSBridge.invoke('getBrandWCPayRequest', JSON.parse(data), function (res) {
                WeixinJSBridge.log(res.err_msg);
                alert(res.err_code + res.err_desc + res.err_msg);
            });
        });
    }

    function callpay() {
        if (typeof (WeixinJSBridge) == "undefined") {
            if (document.addEventListener) {
                document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
            }
            else if (document.attachEvent) {
                document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
            }
        }
        else {
            jsApiCall();
        }
    }

</script>

<body>
    <a href="javascript:void(0)" onclick="callpay();return false;">立即支付</a>
</body>

希望大家一起來找各種坑,然後把坑填上,分享給大家!

微信JSApi支付~坑和如何填坑


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因為之前一直有人給我推薦gulp,說他這裡好哪裡好的。實際上對我來說夠用就行。grunt熟悉以後實際上他的配置也不難,說到效率的話如果真是要完整打包上線也不在乎那麼幾秒時間,對於項目來說線上效率關鍵,但是線下效率只要不是讓人無法忍受頁沒有太多問題。不過不管怎麼說,需要親自用過gulp之後才能品評他和 ...
  • jquery deferred對象就是jQuery的回調函數解決方案,它解決瞭如何處理耗時操作的問題,對那些操作提供了更好的控制,以及統一的編程介面,本文章向碼農們介紹jQuery deferred對象。 一、什麼是deferred對象? 開髮網站的過程中,我們經常遇到某些耗時很長的javascri ...
  • 這是用戶利用do_Gridview和do_ListView及其它組件繪製的日曆和任務,基本實現一個完整的線上日程管理功能 先看圖,android和ios上的效果圖如下: 我們可以看到通過deviceone平臺可以實現跨平臺的複雜ui,我們在IDE里可以看到用戶拖拽了很多組件到設計區,通過設置屬性,綁 ...
  • 回到目錄 為何要寫 之所以寫這篇文章,完全是因為學生們在實際開發中遇到的問題,一個對象占用的記憶體空間總不被釋放,導致系統記憶體不斷攀升,其最主要原因是我們對“對象的生與死”不清楚,或者從來沒有認真去考慮過這件事,確實一個對象在被聲音,初始化,使用或者最後被系統回收,整個的過程與我們關係確實不大,我們開 ...
  • 工廠方法模式是對簡單工廠模式的改進,它為每個對象增加了一個工廠類,專門用於生成該對象。 工廠方法實現加減乘除例子如下: 1 操作類 2 為每一個操作類添加一個工廠對象 3 在客戶端使用工廠生產需要使用的對象 運行結果為:3 工廠方法模式把判斷移到了客戶端,並沒有解決判斷實例化哪個對象的問題,但這種模 ...
  • gets()函數存在於#include<stdio.h>或#include<cstdio>頭文件中,而不是#include<string>或#include<cstring>中 C++中,#include<string>和##include<cstring>是兩個不同的頭文件。 你可能弄混的不是兩個 ...
  • * KVO: key(鍵)-value(值)-observer(觀察者) 通過對一個對象、屬性或者變數值的觀察來做出對應的動作 只要key對應的值發生改變 就會告訴觀察者新舊值的變化 通過key來判斷是哪一個KVO 要實現KVO需要的條件: * 1.有觀察者、被觀察的對象 添加觀察者方法: 用誰去調 ...
  • “架構的視角每個人都不一樣,這位在eBay、攜程、唯品會等平臺型互聯網公司都工作過的老司機就以平臺架構視角和大家分享架構心得體會。一家之言,歡迎討論。 本文首發於InfoQ垂直公眾號「聊聊架構」,ID:archtime。 我對架構定義的理解 大概在7~8年前,我曾經有一個美國對口的架構師導師,他對我 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...