Skip to content

kevinchung0921/einvoice_sdk

Repository files navigation

License: MIT

電子發票 SDK

這是一個可以用來開發電子發票應用的SDK,實做了 電子發票應用API規格 1.7 版,提供實體發票/載具發票查詢,一維條碼/QR Code 資料解析功能。

Demo App screen 1

Demo App screen 2

使用方法:

添加dependency到build.gradle:

dependencies {
    implementation 'com.github.kevinchung0921:einvoice_sdk:v1.3'
}

初始化

初始化物件時,需帶入電子發票 API key,如果沒有的話可以到這裡申請。

  val invSdk = EInvoice("API_KEY")

查詢載具發票表頭

查詢時間區間內的載具發票表頭CarrierHeader ,需要設定要查詢的載具條碼以及認證碼,同時可以指定是否只顯示中獎發票

  val now = Date()
  // 查詢本月載具發票
  val monthStart = Date(now.year, now.month, 1).time
  val monthEnd = Date(now.year, now.month+1, 1).time -1
  // 回傳 List<CarrierHeader>,或是 null 如果發生錯誤
  val headers = invSdk.getCarrierHeader(monthStart, monthEnd, USER_BARCODE, USER_PASS, false)
  for(header in headers)
    Log.d(TAG,header.toString())

查詢載具發票內容

使用載具表頭物件來查詢載具發票的詳細內容 InvoiceDetail

  // 回傳 InvoiceDetail 物件,或是 null 如果發生錯誤
  val detail = invSdk.getCarrierDetail(header, USER_BARCODE, USER_PASS)

解析紙本發票條碼

取得紙本發票條碼內容 Invoice

  // 指定條碼格式,可以是QR Code(FORMAT_QR_CODE)或是一維條碼(FORMAT_CODE_39)
  // 成功的話回傳 Invoice 物件
  val invoice = Invoice(Const.FORMAT_QR_CODE, QRCODE_CONTENTS)

查詢紙本發票內容

  // 使用 Invoice 物件查詢內容
  val detail = invSdk.getInvDetail(invoice!!)

整合 zxing barcode scanner 來取得發票條碼

透過整合 zxing library,再加上幾行程式就可以輕鬆的取得紙本發票的條碼。 將 zxing 加入 depenencies 區塊

  dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:3.4.0'
  }

呼叫 zxing 範例

  fun startScan() {
    val integrator = IntentIntegrator(this)
    integrator.captureActivity = CaptureActivity::class.java
    val supportList: Collection<String> = listOf("QR_CODE", "CODE_39")
    integrator.setDesiredBarcodeFormats(supportList)
    integrator.setPrompt("請掃描電子發票左方的QR Code")
    integrator.setOrientationLocked(false)
    integrator.setBeepEnabled(true)
    integrator.initiateScan()
  }

覆寫 onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    when(requestCode) {
        IntentIntegrator.REQUEST_CODE -> {
            // 先呼叫 zxing 的 parseActivityResult 來取得 IntentResult 物件
            val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
            if(result.contents == null)
                return
            // 先解析條碼內容取得 Invoice 物件    
            val invoice = Invoice(result.formatName, result.contents)
            // 取得發票內容
            einvSdk?.run {
                Thread {
                    Looper.prepare()
                    val detail = getInvDetail(invoice!!)
                    Log.d(TAG,detail.toString())

                }.start()
            }

        }
        else -> super.onActivityResult(requestCode, resultCode, data)
    }
}

注意事項

  • 查詢發票內容以及載具發票表頭時,會使用 HTTP function,所以要注意不要在 UI thread 中直接呼叫,或是使用非同步版本 functioni
  • CarrierHeader/InvoiceDetail 物件內有 code 欄位,需要檢查是否為成功(200),如果不是的話就是有錯誤,可以檢查 msg 欄位看看是什麼錯誤。