iT邦幫忙

9

快速使用財政部電子發票API 使用 C#

小弟最近在串接使用財政部的API

看完文件後發現他的API其實蠻單純,每個API的簽章和參數排序方式都一樣,唯一不同地方是呼叫API所帶的參數

所以我做一個小框架可方便日後擴展 "電子發票相關的API"

原始碼放到 Github

財政部電子發票API文件連結

電子發票API申請連結

使用這個API框架很簡單 只須完成以下幾個步驟

  1. Config輸入 財政部申請的appId和appKey
  2. 創建兩個Model
    • 一個是財政部所需參數的Model
    • 一個是財政部回應參數的Model
  3. 創建一個要實作的Api物件並繼承ApiBase抽象類,並在泛型那邊指定所需 Model的類型
  4. 在外部使用 MoblieInvoiceApiFactroy.GetInstace 方法將 傳入所需Model,工廠會反射回應相對應的Api物件
  5. 使用Api物件.ExcuteApi方法 傳入所需Model
    下面詳細說明使用方法已 "QryWinningList" 查詢中獎發票號碼清單 為例子

打開webConfig輸入你的appKey和appId

<!--在這裡填入跟財政部申請的AppId-->
<add key="GovAppId" value="" />
<!--在這裡填入跟財政部申請的AppKey-->
<add key="GovAPIKey" value=""/>

在Model資料夾中創建2個Class

public class QryWinningListModel
{
    public string invTerm { get; set; }
}

public class QryWinningListViewModel
{
    public string code { get; set; }
    public string msg { get; set; }
    public string invoYm { get; set; }
    public string superPrizeNo { get; set; }
    public string spcPrizeNo { get; set; }
    public string spcPrizeNo2 { get; set; }
    public string spcPrizeNo3 { get; set; }
    public string firstPrizeNo1 { get; set; }
    public string firstPrizeNo2 { get; set; }
    public string firstPrizeNo3 { get; set; }
    public string firstPrizeNo4 { get; set; }
    public string firstPrizeNo5 { get; set; }
    public string firstPrizeNo6 { get; set; }
    public string firstPrizeNo7 { get; set; }
    public string firstPrizeNo8 { get; set; }
    public string firstPrizeNo9 { get; set; }
    public string firstPrizeNo10 { get; set; }
    public string sixthPrizeNo1 { get; set; }
    public string sixthPrizeNo2 { get; set; }
    public string sixthPrizeNo3 { get; set; }
    public string superPrizeAmt { get; set; }
    public string spcPrizeAmt { get; set; }
    public string firstPrizeAmt { get; set; }
    public string secondPrizeAmt { get; set; }
    public string thirdPrizeAmt { get; set; }
    public string fourthPrizeAmt { get; set; }
    public string fifthPrizeAmt { get; set; }
    public string sixthPrizeAmt { get; set; }
    public string sixthPrizeNo4 { get; set; }
    public string sixthPrizeNo5 { get; set; }
    public string sixthPrizeNo6 { get; set; }
}

Service資料夾創建 qryInvDetailApi 類別 並繼承 ApiBase 在泛型上提供 財政部所需參數Model的型別

public class qryInvDetailApi : ApiBase<qryInvDetailModel>
{
    protected override string SetParamter(qryInvDetailModel model)
    {
        SortedDictionary<string, string> paramter = new SortedDictionary<string, string>();
        paramter["version"] = "0.3";
        paramter["action"] = "qryInvDetail";
        paramter["invTerm"] = model.invTerm;
        paramter["UUID"] = UUID;
        paramter["type"] = model.type;
        paramter["invNum"] = model.invNum;
        paramter["generation"] = model.generation;
        paramter["invTerm"] = model.invTerm;
        paramter["invDate"] = model.invDate;
        paramter["encrypt"] = model.encrypt;
        paramter["sellerID"] = model.sellerID;
        paramter["randomNumber"] = model.randomNumber;
        paramter["appID"] = GovAppId;
        return PraramterHelper.DictionaryToParamter(paramter);
    }
}

在上面實現父類的 SetParamter 方法提供Paramter參數,而可以使用 SortedDictionary 因為參數要按升冪排列

在InvoiceController 使用工廠創建Api物件將所需參數Model傳入

使用回傳物件的ExcuteApi方法將所需參數Model傳入

最後財政部就會回傳執行結果Json


0
海綿寶寶
iT邦超人 1 級 ‧ 2017-07-11 08:53:57

我看不懂
不過我覺得這是個很有用的API
感謝您把他分享出來
/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif

dog830228 iT邦新手 1 級 ‧ 2017-07-11 17:59:51 檢舉

謝謝海綿大大的抬愛
小弟第一次發文有些地方寫的不好再請見諒
剛剛才發現我忘記附上api文件的連結了XD
現在已經補上了

0
chommy
iT邦新手 2 級 ‧ 2017-07-11 10:53:59

感謝D大無私的分享

dog830228 iT邦新手 1 級 ‧ 2017-07-11 18:00:26 檢舉

不會^^
大家可以互相交流想法!!

2
yuanshang
iT邦新手 4 級 ‧ 2017-07-11 12:19:35

非常有用的示範程式,尤其是 ApiBase、reflection and factory,易於使用與擴展,感謝!

dog830228 iT邦新手 1 級 ‧ 2017-07-11 18:03:24 檢舉

您真內行!!
我使用工廠來製造一系列的API
而後面的人只需繼承ApiBase 只需填寫參數即可撰寫完成api

0
小魚
iT邦新手 2 級 ‧ 2017-07-11 12:38:28

感謝大大的分享
/images/emoticon/emoticon41.gif

dog830228 iT邦新手 1 級 ‧ 2017-07-11 18:01:10 檢舉

不會^^
大家可以互相交流想法!!

0
mamalovei
iT邦新手 5 級 ‧ 2017-07-15 21:18:45

謝謝分享!

我要留言

立即登入留言