微信JSApi支付~訂單號和微信交易號

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

談談transactionId和out_trade_no 前一篇微信JSApi支付~坑和如何填坑文章反映不錯,所以又寫了個後篇,呵呵。 每個第三方線上支付系統中都會有至少兩類訂單號,其一為支付系統的訂單號,我們稱為transactionId,其二為商戶平臺的訂單號,我們通常稱為out_trade_n ...


談談transactionId和out_trade_no

前一篇微信JSApi支付~坑和如何填坑文章反映不錯,所以又寫了個後篇,呵呵。

每個第三方線上支付系統中都會有至少兩類訂單號,其一為支付系統的訂單號,我們稱為transactionId,其二為商戶平臺的訂單號,我們通常稱為out_trade_no,這兩個號一般用來對賬,在第三方支付平臺你可以通過這兩個訂單號來查詢訂單的狀態,而在商戶自己的網站後臺,也可以查詢它的狀態,一般地,transactionId由支付系統生成,併在回調時轉回給商戶;而out_trade_no一般在商戶平臺生成,自己可以設計自己的規則,然後把這個ID轉到第三方支付平臺,在支付成功後,第三方同樣把這個號轉回來,我們通過這個號進行商戶系統的其它操作。

看一下第三方支付的流程圖

對第三方支付的封裝

封裝要求通用,對任何一個項目都可以靈活的使用它,這是最重要的,要想實現松耦合,需要記住委托的概念,我們在訂單回調時,定義一個訂單所要數據的實體,然後以這個實體做為參數,定義一個委托,當然你完全可以使用.net為我們提供的Action,Func等通用的委托對象,這在大叔框架里通常被看到,也是大叔的常客!

下麵是微信支付的封裝,可以看到業務代碼只寫自己業務,而不處理任務微信API相關的東西

        /// <summary>
        /// 返回鏈接串
        /// </summary>
        /// <returns></returns>
        public string Get()
        {
            int money = 10;
            string orderID = "Lind0001";
            Logger.LoggerFactory.Instance.Logger_Info("發送訂單號" + orderID);

            return JsApiImplement.Send(money, orderID);
        }

        //微信回調
        public void Notify()
        {
            JsApiImplement.Notify((model) =>
            {
                Logger.LoggerFactory.Instance.Logger_Info("回調訂單號" + model.Out_Trade_No);

                //更新領域訂單狀態,用戶賬戶數據,流水等
            });
        }

微信回調實體是大叔自己定義的,應該可以滿足大部分業務的需要了,主要用於回調業務層的方法

    /// <summary>
    /// 微信回調數據模型
    /// </summary>
    public class NotifyModel
    {
        /// <summary>
        /// 當次交易存儲到微信平臺的訂單號
        /// </summary>
        public string Transaction_Id { get; set; }
        /// <summary>
        /// 系統本身生成的訂單號
        /// </summary>
        public string Out_Trade_No { get; set; }
        /// <summary>
        /// 對應當前公眾號的用戶OpenId
        /// </summary>
        public string OpenId { get; set; }
        /// <summary>
        /// 微信用戶唯一標識
        /// </summary>
        public string UniqueId { get; set; }
    }

而對於方法回調JsApiImplement.Notify方法,我們在底層進行了封裝,對外公開一個委托,這個委托實現了方法的回調,當執行到微信核心業務時,回調業務層的方法即可。

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

其實,我在看微信API時,也發現了不少問題,感覺他們的.net開發人員功力不夠,或者說代碼不是很嚴謹,但一些公用基類,應該聲明為abstract,一般必須要子類實現的方法,應該聲明為abstract,但它們都沒有這樣做,感覺很奇怪,哈哈,下麵是我對微信Notify

類的修改,加了一些應該加的,去了一些應該去的,感覺舒服多了!

   /// <summary>
    /// 回調處理基類
    /// 主要負責接收微信支付後臺發送過來的數據,對數據進行簽名驗證
    /// 子類在此類基礎上進行派生並重寫自己的回調處理過程
    /// </summary>
    public abstract class Notify
    {
        public HttpContext page { get; set; }
        public Notify(HttpContext page)
        {
            this.page = page;
        }

        /// <summary>
        /// 接收從微信支付後臺發送過來的數據並驗證簽名
        /// </summary>
        /// <returns>微信支付後臺返回的數據</returns>
        public WxPayData GetNotifyData()
        {
            //接收從微信後臺POST過來的數據
            System.IO.Stream s = page.Request.InputStream;
            int count = 0;
            byte[] buffer = new byte[1024];
            StringBuilder builder = new StringBuilder();
            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();

            Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString());

            //轉換數據格式並驗證簽名
            WxPayData data = new WxPayData();
            try
            {
                data.FromXml(builder.ToString());
            }
            catch (WxPayException ex)
            {
                //若簽名錯誤,則立即返回結果給微信支付後臺
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);
                Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            Log.Info(this.GetType().ToString(), "Check sign success");
            return data;
        }

        //派生類自已必須重寫這個方法
        public abstract void ProcessNotify(Action<NotifyModel> action);

    }

對於第三方支付就說到這樣,希望大家自己也對一些東西進行封裝,方便其它項目中直接使用它們!

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

 


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

-Advertisement-
Play Games
更多相關文章
  • 平時用$_post[''],$_get['']獲取表單中參數時會出現Notice: Undefined index: ; 雖然可以通過設置錯誤顯示方式來隱藏這個提示,但是這樣也有隱患,就是在伺服器的日誌中會記錄這些提示,導致日誌文件異常龐大。 通過在網上搜索和自己自身的實戰總結幾種解決方法; 方法1 ...
  • 上回寫了[使用Redis實現關註關係][1],這次說說使用Redis實現Timeline。 Timeline的實現一般有推模式、拉模式、推拉結合這幾種。 推模式:某人發佈內容之後推送給所有粉絲,空間換時間,瓶頸在寫入; 拉模式:粉絲從自己的關註列表中讀取內容,時間換空間,瓶頸在讀取; 推拉結合:某人 ...
  • 項目中經常會遇到單例的情況。大部分的單例代碼都差不多像這樣定義: internal class SingletonOne { private static SingletonOne _singleton; private SingletonOne() { } public static Single... ...
  • 在前段時間呢陸陸續續的更新了一系列關於重構的文章。在重構我們既有的代碼時,往往會用到設計模式。在之前重構系列的博客中,我們在重構時用到了“工廠模式”、“策略模式”、“狀態模式”等。當然在重構時,有的地方沒有點明使用的是那種設計模式。從今天開始,我們就圍繞著設計模式這個主題來討論一下我們常用的設計模式 ...
  • 一、應用背景 隨著計算技術的進步,記憶體、CPU、磁碟等資源不再是稀缺的,電腦作為應用程式的載體從單伺服器轉變為多伺服器,集中計算演化為分散式計算。原有的“巨石”應用難以適應業務的發展速度,可擴展、自適應的能力不足,程式員面對著數以萬計的源代碼文件抓耳撓腮(O M G!),越來越多的工程師渴望小而美 ...
  • 在面向對象的概念中,抽象類和介面都是一種特殊的類,它們具有一些共性,也有一些區別。 二者的相同點: 都屬於引用類型的數據,是一種特殊的類; 都不能實例化; 都可以包含未實現的方法聲明和屬性聲明; 兩者的派生類都必須實現它們的聲明,派生類實現抽象類的抽象屬性和抽象方法,而介面則要實現它的所有成員 二者 ...
  • atitit.atiHtmlUi web組件化方案與規範v1 1. 如何在現有html 標簽基礎上定義自己的組件1 2. 組件的構成與定義1 3. 組件的載入1 4. 組件css的載入2 5. 操作組件getVal,SetVal2 6. 組件化的本質目的並不一定是要為了可復用,而是提升可維護性。 不 ...
  • Atitit.設計模式 觸發器模式 trigger 詳解 1. 觸發器概念1 1.1. 觸發器位置 after|before|instead of1 2. 資料庫裡面的觸發器1 2.1. old和:new1 2.2. INSTEAD OF 觸發器 after|before|instead of2 3 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...