這是一個可以用來開發電子發票應用的SDK,實做了 電子發票應用API規格 1.7 版,提供實體發票/載具發票查詢,一維條碼/QR Code 資料解析功能。
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 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 欄位看看是什麼錯誤。