Commit d4b4a6f4 authored by yinjiacheng's avatar yinjiacheng

update 企业认证流程

parent f0e967b0
package com.yidian.shenghuoquan.newscontent.bean
/**
* author: yinjiacheng
* date: 6/4/21 5:26 PM
* description: 生活号企业认证数据集
*/
class LifeAccountMerchantAuthData {
var merchantType: Int = 0
var isBusinessLicenseUpload: Boolean = false
var businessLicenseObjectKey: String = ""
var registrationName: String = ""
var registrationCode: String = ""
var type: String? = null
var addr: String? = null
var pers: String? = null
var scope: String? = null
var time: String? = null
var regi: String? = null
var organizer: String? = null
var date: String? = null
var comp: String? = null
var num: String? = null
var form: String? = null
var funding: String? = null
var date_issue: String? = null
}
\ No newline at end of file
......@@ -26,4 +26,5 @@ class LifeAccountPersonalAuthData {
var isFaceAuthPass: Boolean = false
var isIDCardPortraitFaceUpload: Boolean = false
var isIDCardNationalEmblemFaceUpload: Boolean = false
var phoneNUm: String = ""
}
......@@ -9,9 +9,17 @@ object Constant {
const val LIFE_ACCOUNT_AUTH_TAG = "LifeAccountAuth"
// 认证类型
const val TYPE_AUTH = "auth_type"
const val TYPE_AUTH_PERSONAL = 0 // 个人
const val TYPE_AUTH_INDIVIDUAL_BUSINESS = 1 // 个体工商户
const val TYPE_AUTH_COMMON_ENTERPRISE = 2 // 普通企业
// 商户类型
const val ITEM_INDIVIDUAL_BUSINESSES = "个体工商户"
const val ITEM_COMMON_ENTERPRISE = "普通企业"
const val TYPE_INDIVIDUAL_BUSINESS = 1
const val TYPE_COMMON_ENTERPRISE = 2
// 身份证、营业执照上传方式
const val ITEM_TAKE_PHOTO = "拍照"
......@@ -44,4 +52,9 @@ object Constant {
// 服务端error message
const val ERROR_MESSAGE_ID_CARD_NUMBER = "身份证号码有误"
const val ERROR_MESSAGE_REAL_NAME = "姓名缺失"
// 数据来源
const val DATA_FROM_C = 1 // C端
const val DATA_FROM_B = 2 // B端
const val DATA_FROM_OP = 3 // OP后台
}
\ No newline at end of file
......@@ -6,7 +6,7 @@ package com.yidian.shenghuoquan.newscontent.http.httpbean
* description: 营业执照OCR
*/
class BusinessLicenseOCRBean {
data class Request(val business_image_objectid: String?)
data class Request(val business_image_objectid: String, val business_image_bucket: String)
data class Response(
val addr: String,
......
......@@ -9,8 +9,7 @@ class GetIDCardOCRBean(val request: Request, val response: Response) {
data class Request(
val posit_image_objectid: String,
val back_image_objectid: String,
val posit_bucket: String?,
val back_bucket: String?
val bucket: String
)
data class Response(
......
......@@ -115,7 +115,8 @@ class LifeAccountEnterpriseCertificationActivity :
}
override fun onTaskSuccess(bucket: String?, objectKey: String?) {
val request = BusinessLicenseOCRBean.Request(objectKey)
if (bucket == null || objectKey == null) return
val request = BusinessLicenseOCRBean.Request(objectKey, bucket)
ApiService.businessLicenseOCR(object : IBusinessLicenseOCRCallback {
override fun businessLicenseOCRSuccess(result: BusinessLicenseOCRBean.Response?) {
Log.d(TAG, "name: ${result?.name}, code: ${result?.code}")
......
package com.yidian.shenghuoquan.newscontent.ui.auth
import com.yidian.shenghuoquan.newscontent.bean.LifeAccountMerchantAuthData
import com.yidian.shenghuoquan.newscontent.bean.LifeAccountPersonalAuthData
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthPersonalCheckBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.GetIDCardOCRBean
import com.yidian.shenghuoquan.newscontent.constant.Constant
import com.yidian.shenghuoquan.newscontent.http.httpbean.*
/**
* author: yinjiacheng
......@@ -12,6 +13,7 @@ import com.yidian.shenghuoquan.newscontent.http.httpbean.GetIDCardOCRBean
object LifeAccountAuthDataManager {
val personalAuthData by lazy { LifeAccountPersonalAuthData() }
val merchantAuthData by lazy { LifeAccountMerchantAuthData() }
/**
* 将身份证OCR结果填入
......@@ -30,7 +32,7 @@ object LifeAccountAuthDataManager {
}
/**
* 使用个人认证数据生成身份信息校验接口请求体
* 生成身份信息校验接口请求体
*/
fun generateAuthPersonalCheckRequest(): AuthPersonalCheckBean.Request {
return AuthPersonalCheckBean.Request(
......@@ -49,4 +51,108 @@ object LifeAccountAuthDataManager {
personalAuthData.issuedBy
)
}
/**
* 将营业执照OCR结果填入
*/
fun generateMerchantAuthData(data: BusinessLicenseOCRBean.Response) {
merchantAuthData.registrationName = data.name
merchantAuthData.registrationCode = data.code
merchantAuthData.type = data.type
merchantAuthData.addr = data.addr
merchantAuthData.pers = data.pers
merchantAuthData.scope = data.scope
merchantAuthData.time = data.time
merchantAuthData.regi = data.regi
merchantAuthData.organizer = data.organizer
merchantAuthData.date = data.date
merchantAuthData.comp = data.comp
merchantAuthData.num = data.num
merchantAuthData.form = data.form
merchantAuthData.funding = data.funding
merchantAuthData.date_issue = data.date_issue
}
/**
* 生成营业执照上传接口请求体
*/
fun generateAuthBusinessLicenseCommitRequest(
userId: Long,
dataType: Int,
lifeAccountId: Long?
): AuthBusinessLicenseCommitBean.Request {
return AuthBusinessLicenseCommitBean.Request(
userId,
merchantAuthData.registrationCode,
merchantAuthData.registrationName,
merchantAuthData.type,
merchantAuthData.addr,
merchantAuthData.pers,
merchantAuthData.scope,
merchantAuthData.time,
merchantAuthData.regi,
merchantAuthData.organizer,
merchantAuthData.date,
merchantAuthData.comp,
merchantAuthData.num,
merchantAuthData.form,
merchantAuthData.funding,
merchantAuthData.date_issue,
merchantAuthData.businessLicenseObjectKey,
Constant.DATA_FROM_B, dataType, lifeAccountId, null, null, null
)
}
/**
* 生成个体工商户身份上传接口请求体
*/
fun generateAuthIndividualBusinessIdentityCommitRequest(
dataType: Int
): AuthIndividualBusinessIdentityCommitBean.Request {
return AuthIndividualBusinessIdentityCommitBean.Request(
merchantAuthData.registrationCode,
dataType,
personalAuthData.idCardPortraitFaceObjectKey,
personalAuthData.idCardNationalEmblemFaceObjectKey,
personalAuthData.idCardPortraitFaceCompleteness,
personalAuthData.idCardNationalEmblemFaceCompleteness,
personalAuthData.idCardNum,
personalAuthData.gender,
personalAuthData.realName,
personalAuthData.address,
personalAuthData.nationality,
personalAuthData.validDateStart,
personalAuthData.validDateEnd,
personalAuthData.issuedBy,
null, null, null
)
}
/**
* 生成普通企业法人身份信息上传接口请求体
*/
fun generateAuthEnterpriseLegalIdentityCommitRequest(
authRecordId: Long,
lifeAccountId: Long?
): AuthEnterpriseLegalIdentityCommitBean.Request {
return AuthEnterpriseLegalIdentityCommitBean.Request(
authRecordId,
personalAuthData.idCardPortraitFaceObjectKey,
personalAuthData.idCardNationalEmblemFaceObjectKey,
personalAuthData.idCardPortraitFaceCompleteness,
personalAuthData.idCardNationalEmblemFaceCompleteness,
personalAuthData.idCardNum,
personalAuthData.gender,
personalAuthData.realName,
personalAuthData.address,
personalAuthData.nationality,
personalAuthData.validDateStart,
personalAuthData.validDateEnd,
personalAuthData.issuedBy,
lifeAccountId,
null,
personalAuthData.phoneNUm,
null
)
}
}
\ No newline at end of file
......@@ -11,6 +11,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.FileProvider
import androidx.core.view.isVisible
import com.yidian.common.base.BaseFragment
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.BottomSelectAdapter
......@@ -24,6 +25,7 @@ import com.yidian.shenghuoquan.newscontent.ui.dialog.BottomSelectDialog
import com.yidian.shenghuoquan.newscontent.utils.BitmapUtil
import com.yidian.shenghuoquan.newscontent.utils.FileUtil
import com.yidian.shenghuoquan.newscontent.utils.KS3Core
import com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthBusinessInfoEditView
import java.io.File
/**
......@@ -34,7 +36,8 @@ import java.io.File
class LifeAccountBusinessLicenseAuthFragment :
BaseFragment<FragmentLifeAccountBusinessLicenseAuthBinding>(), View.OnClickListener,
BottomSelectAdapter.OnItemClickListener<BottomSelectBean>, KS3Core.OnKS3TaskListener,
IBusinessLicenseOCRCallback {
IBusinessLicenseOCRCallback,
LifeAccountAuthBusinessInfoEditView.OnLifeAccountAuthBusinessInfoEditViewCallback {
/**
* sdcard/Android/data/package/cache
......@@ -67,6 +70,8 @@ class LifeAccountBusinessLicenseAuthFragment :
private fun initListener() {
viewBinding.clBusinessLicenseUpload.setOnClickListener(this)
viewBinding.ivClear.setOnClickListener(this)
viewBinding.evRegistrationName.setOnLifeAccountAuthBusinessInfoEditViewCallback(this)
viewBinding.evRegistrationCode.setOnLifeAccountAuthBusinessInfoEditViewCallback(this)
}
override fun onClick(v: View?) {
......@@ -87,13 +92,18 @@ class LifeAccountBusinessLicenseAuthFragment :
R.id.iv_clear -> {
// 清除已上传的营业执照
viewBinding.ivBusinessLicense.setImageDrawable(null)
LifeAccountAuthDataManager.merchantAuthData.isBusinessLicenseUpload = false
// 清除OCR或用户输入内容
viewBinding.evRegistrationName.clearEditContent()
viewBinding.evRegistrationCode.clearEditContent()
LifeAccountAuthDataManager.merchantAuthData.registrationName = ""
LifeAccountAuthDataManager.merchantAuthData.registrationCode = ""
// 设置上传区域可点击
viewBinding.clBusinessLicenseUpload.isEnabled = true
// 隐藏清除按钮
viewBinding.ivClear.visibility = View.GONE
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
}
}
}
......@@ -179,11 +189,33 @@ class LifeAccountBusinessLicenseAuthFragment :
/**
* 执行营业执照OCR
*/
private fun startBusinessLicenseOCR(objectKey: String?) {
val request = BusinessLicenseOCRBean.Request(objectKey)
private fun startBusinessLicenseOCR(objectKey: String?, bucket: String?) {
if (objectKey == null || bucket == null) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"business license objectKey or bucket is null, ocr suspend!"
)
return
}
val request = BusinessLicenseOCRBean.Request(objectKey, bucket)
ApiService.businessLicenseOCR(this, request)
}
/**
* 清除已输入的营业执照相关信息
* 用户更换商户类型操作
*/
fun clearBusinessLicenseInfo() {
// 清除已上传的营业执照
viewBinding.ivBusinessLicense.setImageDrawable(null)
viewBinding.ivClear.isVisible = false
// 清除OCR或用户输入内容
viewBinding.evRegistrationName.clearEditContent()
viewBinding.evRegistrationCode.clearEditContent()
// 设置上传区域可点击
viewBinding.clBusinessLicenseUpload.isEnabled = true
}
override fun onTaskStart() {
}
......@@ -201,8 +233,10 @@ class LifeAccountBusinessLicenseAuthFragment :
}
override fun onTaskSuccess(bucket: String?, objectKey: String?) {
LifeAccountAuthDataManager.merchantAuthData.isBusinessLicenseUpload = true
objectKey?.let { LifeAccountAuthDataManager.merchantAuthData.businessLicenseObjectKey = it }
// 执行营业执照OCR
startBusinessLicenseOCR(objectKey)
startBusinessLicenseOCR(objectKey, bucket)
}
override fun onTaskFailure(statesCode: Int, message: String?) {
......@@ -210,11 +244,14 @@ class LifeAccountBusinessLicenseAuthFragment :
}
override fun businessLicenseOCRSuccess(result: BusinessLicenseOCRBean.Response?) {
result?.let { LifeAccountAuthDataManager.generateMerchantAuthData(it) }
// 回显OCR结果
viewBinding.evRegistrationName.fillEditContent(result?.name)
viewBinding.evRegistrationCode.fillEditContent(result?.code)
// 此时营业执照已上传并OCR识别完成 删除本地临时存储文件
File(commonPath + Constant.FILE_PATH_BUSINESS_LICENSE).delete()
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
}
override fun businessLicenseOCRFailure(message: String?) {
......@@ -223,4 +260,22 @@ class LifeAccountBusinessLicenseAuthFragment :
"request business license ocr failure, message: $message"
)
}
override fun onTextClear(from: LifeAccountAuthBusinessInfoEditView) {
if (from == viewBinding.evRegistrationName) {
LifeAccountAuthDataManager.merchantAuthData.registrationName = ""
} else {
LifeAccountAuthDataManager.merchantAuthData.registrationCode = ""
}
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
}
override fun onTextChange(from: LifeAccountAuthBusinessInfoEditView, text: String) {
if (from == viewBinding.evRegistrationName) {
LifeAccountAuthDataManager.merchantAuthData.registrationName = text
} else {
LifeAccountAuthDataManager.merchantAuthData.registrationCode = text
}
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui.auth
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.fragment.app.Fragment
import com.orhanobut.hawk.Hawk
import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
......@@ -10,6 +13,12 @@ import com.yidian.shenghuoquan.newscontent.adapter.BottomSelectAdapter
import com.yidian.shenghuoquan.newscontent.bean.BottomSelectBean
import com.yidian.shenghuoquan.newscontent.constant.Constant
import com.yidian.shenghuoquan.newscontent.databinding.ActivityLifeAccountEnterpriseAuthBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthBusinessLicenseCommitCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthEnterpriseCompleteCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthEnterpriseLegalIdentityCommitCallback
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthBusinessLicenseCommitBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthEnterpriseCompleteBean
import com.yidian.shenghuoquan.newscontent.ui.dialog.BottomSelectDialog
import com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthProcessView
import com.yidian.xpage.XPageManager
......@@ -20,7 +29,9 @@ import com.yidian.xpage.XPageManager
* description: 生活号企业认证
*/
class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterpriseAuthBinding>(),
View.OnClickListener, BottomSelectAdapter.OnItemClickListener<BottomSelectBean> {
View.OnClickListener, BottomSelectAdapter.OnItemClickListener<BottomSelectBean>,
IAuthBusinessLicenseCommitCallback, IAuthEnterpriseLegalIdentityCommitCallback,
IAuthEnterpriseCompleteCallback {
private val fragmentList: ArrayList<Fragment> by lazy {
arrayListOf<Fragment>(
......@@ -57,6 +68,40 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
viewBind.btnNext.setOnClickListener(this)
}
/**
* 检查是否可以进行下一步
*/
fun checkNextCondition() {
if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_QUALIFICATION
&& LifeAccountAuthDataManager.merchantAuthData.merchantType != 0
&& LifeAccountAuthDataManager.merchantAuthData.isBusinessLicenseUpload
&& LifeAccountAuthDataManager.merchantAuthData.registrationName.isNotEmpty()
&& LifeAccountAuthDataManager.merchantAuthData.registrationCode.isNotEmpty()
) {
viewBind.btnNext.alpha = 1f
viewBind.btnNext.isEnabled = true
} else if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_MANAGER
&& LifeAccountAuthDataManager.merchantAuthData.merchantType == Constant.TYPE_INDIVIDUAL_BUSINESS
&& LifeAccountAuthDataManager.personalAuthData.isFaceAuthPass
) {
viewBind.btnNext.alpha = 1f
viewBind.btnNext.isEnabled = true
} else if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_MANAGER
&& LifeAccountAuthDataManager.merchantAuthData.merchantType == Constant.TYPE_COMMON_ENTERPRISE
&& LifeAccountAuthDataManager.personalAuthData.isIDCardPortraitFaceUpload
&& LifeAccountAuthDataManager.personalAuthData.isIDCardNationalEmblemFaceUpload
&& LifeAccountAuthDataManager.personalAuthData.realName.isNotEmpty()
&& LifeAccountAuthDataManager.personalAuthData.idCardNum.isNotEmpty()
&& LifeAccountAuthDataManager.personalAuthData.phoneNUm.isNotEmpty()
) {
viewBind.btnNext.alpha = 1f
viewBind.btnNext.isEnabled = true
} else {
viewBind.btnNext.alpha = 0.32f
viewBind.btnNext.isEnabled = false
}
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.iv_back -> {
......@@ -87,22 +132,101 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
).show()
}
R.id.btn_next -> {
// TODO: 5/29/21 请求接口401 402
viewBind.pvAuthProcess.setProcess(++viewBind.pvAuthProcess.curProcess)
viewBind.svMerchantType.enableSelect(false)
supportFragmentManager.beginTransaction()
.replace(
R.id.fragment_container,
fragmentList[viewBind.pvAuthProcess.curProcess]
).commit()
if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_QUALIFICATION) {
// TODO: 6/4/21 判断是否为个人生活号升级
ApiService.authBusinessLicenseCommit(
this,
LifeAccountAuthDataManager.generateAuthBusinessLicenseCommitRequest(
Hawk.get<Long>(HawkConfig.UserId),
LifeAccountAuthDataManager.merchantAuthData.merchantType,
null
)
)
} else if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_MANAGER) {
if (LifeAccountAuthDataManager.merchantAuthData.merchantType == Constant.TYPE_INDIVIDUAL_BUSINESS) {
val params = HashMap<String, String>()
params["code"] =
LifeAccountAuthDataManager.merchantAuthData.registrationCode
ApiService.authEnterpriseComplete(this, params)
} else if (LifeAccountAuthDataManager.merchantAuthData.merchantType == Constant.TYPE_COMMON_ENTERPRISE) {
ApiService.authEnterpriseLegalIdentityCommit(
this,
LifeAccountAuthDataManager.generateAuthEnterpriseLegalIdentityCommitRequest(
123, null
)
)
}
}
}
}
}
override fun onItemClick(view: View, position: Int, data: BottomSelectBean) {
if (viewBind.svMerchantType.getCurSelectItem().isNotEmpty()) {
// 更换商户类型,清空营业执照图片、清空注册名称和注册码
(fragmentList[0] as LifeAccountBusinessLicenseAuthFragment).clearBusinessLicenseInfo()
}
// 回显选择的商户类型
viewBind.svMerchantType.setContentResult(data.item)
// TODO: 5/29/21 清空营业执照图片、清空注册名称和注册码
// 保存选择的商户类型
LifeAccountAuthDataManager.merchantAuthData.merchantType =
if (data.item == Constant.ITEM_INDIVIDUAL_BUSINESSES) Constant.TYPE_INDIVIDUAL_BUSINESS else Constant.TYPE_COMMON_ENTERPRISE
// 检查下一步条件
checkNextCondition()
}
override fun authBusinessLicenseCommitSuccess(result: AuthBusinessLicenseCommitBean.Response?) {
// 营业执照提交成功
viewBind.pvAuthProcess.setProcess(++viewBind.pvAuthProcess.curProcess)
viewBind.svMerchantType.enableSelect(false)
// 向身份信息fragment传参
val fragment = fragmentList[viewBind.pvAuthProcess.curProcess]
val bundle = Bundle()
bundle.putInt(
Constant.TYPE_AUTH,
LifeAccountAuthDataManager.merchantAuthData.merchantType
)
fragment.arguments = bundle
supportFragmentManager.beginTransaction()
.replace(
R.id.fragment_container, fragment
).commit()
checkNextCondition()
}
override fun authBusinessLicenseCommitFailure(message: String?) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"request auth business license commit failure, message: $message"
)
}
override fun authEnterpriseLegalIdentityCommitSuccess() {
// 普通企业法人身份信息提交成功 请求企业认证完成接口
// TODO: 6/6/21 跳转提交成功页面
val params = HashMap<String, String>()
params["code"] =
LifeAccountAuthDataManager.merchantAuthData.registrationCode
ApiService.authEnterpriseComplete(this, params)
}
override fun authEnterpriseLegalIdentityCommitFailure(message: String?) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"request auth enterprise legal identity commit failure, message: $message"
)
}
override fun authEnterpriseCompleteSuccess(result: AuthEnterpriseCompleteBean.Response?) {
// 企业认证完成
// TODO: 6/6/21 跳转提交成功页面
}
override fun authEnterpriseCompleteFailure(message: String?) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"request auth enterprise complete failure, message: $message"
)
}
}
\ No newline at end of file
......@@ -14,6 +14,7 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.megvii.demo.activity.IDCardDetectActivity
import com.megvii.demo.utils.Configuration
import com.megvii.idcardquality.IDCardQualityLicenseManager
......@@ -30,6 +31,8 @@ import com.yidian.shenghuoquan.newscontent.bean.BottomSelectBean
import com.yidian.shenghuoquan.newscontent.constant.Constant
import com.yidian.shenghuoquan.newscontent.databinding.FragmentLifeAccountIdCardAuthBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthEnterpriseLiveIdentityCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthIndividualBusinessIdentityCommitCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthLiveIdentityCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthPersonalCheckCallback
import com.yidian.shenghuoquan.newscontent.http.httpbean.*
......@@ -53,7 +56,8 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
IGetIDCardOCRCallback, AuthPersonalGetTokenCallback, IdentifyIdOcrVerifyCallback, PreCallback,
DetectCallback, KS3Core.OnKS3TaskListener, IAuthPersonalCheckCallback,
IAuthLiveIdentityCallback, LifeAccountAuthImageView.OnLifeAccountAuthImageViewCallback,
LifeAccountAuthIdentityInfoEditView.OnLifeAccountAuthIdentityInfoEditViewCallback {
LifeAccountAuthIdentityInfoEditView.OnLifeAccountAuthIdentityInfoEditViewCallback,
IAuthIndividualBusinessIdentityCommitCallback, IAuthEnterpriseLiveIdentityCallback {
companion object {
// 身份证采集页面回传数据
......@@ -89,6 +93,11 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
*/
private val megLiveManager by lazy { MegLiveManager.getInstance() }
/**
* 当前认证类型
*/
private var authType: Int? = 0
override fun createViewBinding(
inflater: LayoutInflater,
container: ViewGroup?
......@@ -104,7 +113,20 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
}
private fun initView() {
authType = arguments?.getInt(Constant.TYPE_AUTH, 0)
when (authType) {
Constant.TYPE_AUTH_PERSONAL -> {
viewBinding.evRealName.setTitleContent(resources.getString(R.string.real_name))
}
Constant.TYPE_AUTH_INDIVIDUAL_BUSINESS -> {
viewBinding.evRealName.setTitleContent(resources.getString(R.string.individual_business_manager_name))
}
Constant.TYPE_AUTH_COMMON_ENTERPRISE -> {
viewBinding.evRealName.setTitleContent(resources.getString(R.string.enterprise_legal_name))
}
}
viewBinding.evMobile.isVisible = authType == Constant.TYPE_AUTH_COMMON_ENTERPRISE
viewBinding.clFaceAuth.isVisible = authType == Constant.TYPE_AUTH_INDIVIDUAL_BUSINESS
}
private fun initListener() {
......@@ -115,6 +137,7 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
viewBinding.ivIdCardNationalEmblemFace.setOnLifeAccountAuthImageViewCallback(this)
viewBinding.evRealName.setOnLifeAccountAuthIdentityInfoEditViewCallback(this)
viewBinding.evIdCardNumber.setOnLifeAccountAuthIdentityInfoEditViewCallback(this)
viewBinding.evMobile.setOnLifeAccountAuthIdentityInfoEditViewCallback(this)
}
/**
......@@ -196,10 +219,22 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
R.id.iv_face_auth_start -> {
// 判断是否满足条件进行活体检测
if (!checkFaceAuthCondition()) return
ApiService.authPersonalCheck(
this,
LifeAccountAuthDataManager.generateAuthPersonalCheckRequest()
)
when (authType) {
Constant.TYPE_AUTH_PERSONAL -> {
ApiService.authPersonalCheck(
this,
LifeAccountAuthDataManager.generateAuthPersonalCheckRequest()
)
}
Constant.TYPE_AUTH_INDIVIDUAL_BUSINESS -> {
ApiService.authIndividualBusinessIdentityCommit(
this,
LifeAccountAuthDataManager.generateAuthIndividualBusinessIdentityCommitRequest(
Constant.TYPE_INDIVIDUAL_BUSINESS
)
)
}
}
}
}
}
......@@ -413,8 +448,7 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
GetIDCardOCRBean.Request(
LifeAccountAuthDataManager.personalAuthData.idCardPortraitFaceObjectKey,
LifeAccountAuthDataManager.personalAuthData.idCardNationalEmblemFaceObjectKey,
LifeAccountAuthDataManager.personalAuthData.idCardPortraitFaceBucket,
LifeAccountAuthDataManager.personalAuthData.idCardNationalEmblemFaceBucket
LifeAccountAuthDataManager.personalAuthData.idCardPortraitFaceBucket
)
)
}
......@@ -459,15 +493,24 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
changeFaceAuthUI(true)
// 删除活体检测数据
File(cachePath + Constant.FILE_PATH_ALIVE_DETECT_VERIFY_DATA).delete()
// 回调server 保存活体识别认证状态
ApiService.authLiveIdentity(this)
// 检查下一步条件
(activity as LifeAccountPersonalAuthActivity).checkNextCondition()
// 锁定当前输入状态 即完成人脸验证后无法修改身份证照片、姓名、身份证号
viewBinding.ivIdCardPortraitFace.disableModify()
viewBinding.ivIdCardNationalEmblemFace.disableModify()
viewBinding.evRealName.disableModify()
viewBinding.evIdCardNumber.disableModify()
// 回调server 保存活体识别认证状态
if (authType == Constant.TYPE_AUTH_PERSONAL) {
ApiService.authLiveIdentity(this)
// 检查下一步条件
(activity as LifeAccountPersonalAuthActivity).checkNextCondition()
} else {
val params = HashMap<String, String>(2)
params["code"] = LifeAccountAuthDataManager.merchantAuthData.registrationCode
params["idcard_number"] = LifeAccountAuthDataManager.personalAuthData.idCardNum
ApiService.authEnterpriseLiveIdentity(this, params)
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
}
}
}
......@@ -614,21 +657,65 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
}
override fun onTextClear(from: LifeAccountAuthIdentityInfoEditView) {
if (from == viewBinding.evRealName) {
LifeAccountAuthDataManager.personalAuthData.realName = ""
} else {
LifeAccountAuthDataManager.personalAuthData.idCardNum = ""
when (from) {
viewBinding.evRealName -> {
LifeAccountAuthDataManager.personalAuthData.realName = ""
}
viewBinding.evIdCardNumber -> {
LifeAccountAuthDataManager.personalAuthData.idCardNum = ""
}
viewBinding.evMobile -> {
LifeAccountAuthDataManager.personalAuthData.phoneNUm = ""
}
}
}
override fun onTextChange(from: LifeAccountAuthIdentityInfoEditView, text: String) {
if (from == viewBinding.evRealName) {
LifeAccountAuthDataManager.personalAuthData.realName = text
} else {
LifeAccountAuthDataManager.personalAuthData.idCardNum = text
when (from) {
viewBinding.evRealName -> {
LifeAccountAuthDataManager.personalAuthData.realName = text
}
viewBinding.evIdCardNumber -> {
LifeAccountAuthDataManager.personalAuthData.idCardNum = text
}
viewBinding.evMobile -> {
LifeAccountAuthDataManager.personalAuthData.phoneNUm = text
}
}
}
override fun authIndividualBusinessIdentityCommitSuccess() {
// 身份信息校验成功后才允许进行人脸验证
// 若存在上一次活体检测数据则删除 处理活体检测失败 再次进入
File(cachePath + Constant.FILE_PATH_ALIVE_DETECT_VERIFY_DATA).delete()
// 跳转人脸认证
ApiService.authPersonalGetToken(
this, AuthPersonalGetTokenBean.Request(
LifeAccountAuthDataManager.personalAuthData.idCardNum,
LifeAccountAuthDataManager.personalAuthData.realName,
Constant.TYPE_MEG_LIVE
)
)
}
override fun authIndividualBusinessIdentityCommitFailure(message: String?) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"request auth individual business identity commit failure, message: $message"
)
}
override fun authEnterpriseLiveIdentitySuccess() {
}
override fun authEnterpriseLiveIdentityFailure(message: String?) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"request auth enterprise live identity failure: message: $message"
)
}
/**
* 人脸验证结果UI
* @param result true为验证通过 false为验证未通过
......
......@@ -130,9 +130,7 @@ class IDCardTestActivity : BaseActivity<ActivityIdcardBinding>() {
GetIDCardOCRBean.Request(
idCardFrontObjectKey,
idCardBackObjectKey,
idCardFrontBucket,
idCardBackBucket
)
idCardFrontBucket)
ApiService.getIDCardOCR(object : IGetIDCardOCRCallback {
override fun getIDCardOCRSuccess(result: GetIDCardOCRBean.Response?) {
Log.d(KS3Core.TAG, "name: ${result?.posit?.name}, id num: ${result?.posit?.idcard_number}")
......
......@@ -19,6 +19,10 @@ object FileUtil {
*/
fun generateFileFromUri(context: Context?, uri: Uri?, path: String) {
if (uri != null) {
val file = File(path)
if (file.exists()) file.delete()
file.parentFile?.mkdirs()
file.createNewFile()
context?.contentResolver?.openInputStream(uri)?.copyTo(FileOutputStream(path))
}
}
......
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.graphics.Color
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
......@@ -31,6 +32,13 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
)
)
private var callback: OnLifeAccountAuthBusinessInfoEditViewCallback? = null
/**
* 是否输入错误标识位
*/
private var isInputError = false
init {
val typedArray =
context.obtainStyledAttributes(attrs, R.styleable.LifeAccountAuthBusinessInfoEditView)
......@@ -47,18 +55,28 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
* 展示错误提示
*/
fun showErrorTips(tips: String) {
viewBinding.tvErrorTips.visibility = View.VISIBLE
viewBinding.tvErrorTips.isVisible = true
viewBinding.tvErrorTips.text = tips
}
/**
* 隐藏错误提示
*/
private fun dismissErrorTips() {
viewBinding.tvErrorTips.isVisible = false
viewBinding.tvErrorTips.text = ""
}
/**
* 清除输入的文字
*/
fun clearEditContent() {
viewBinding.etContent.setText("")
if (viewBinding.tvErrorTips.visibility == View.VISIBLE) {
viewBinding.tvErrorTips.visibility = View.GONE
if (isInputError) {
dismissErrorTips()
cancelHighLightEditContent()
}
callback?.onTextClear(this)
}
/**
......@@ -79,6 +97,22 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
isEnabled = false
}
/**
* 高亮显示输入文本
*/
fun highLightEditContent() {
isInputError = true
viewBinding.etContent.setTextColor(Color.parseColor("#FFFF3A3A"))
}
/**
* 取消高亮显示输入文本
*/
private fun cancelHighLightEditContent() {
isInputError = false
viewBinding.etContent.setTextColor(Color.parseColor("#FF333333"))
}
override fun onClick(v: View?) {
if (v?.id == R.id.iv_clear) {
// 清除输入框中的内容
......@@ -96,6 +130,27 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
override fun afterTextChanged(s: Editable?) {
// 处理一键清除按钮
viewBinding.ivClear.visibility = if (TextUtils.isEmpty(s)) View.GONE else View.VISIBLE
viewBinding.ivClear.isVisible = !TextUtils.isEmpty(s)
callback?.onTextChange(this, s.toString())
if (isInputError) {
dismissErrorTips()
cancelHighLightEditContent()
}
}
fun setOnLifeAccountAuthBusinessInfoEditViewCallback(callback: OnLifeAccountAuthBusinessInfoEditViewCallback) {
this.callback = callback
}
interface OnLifeAccountAuthBusinessInfoEditViewCallback {
/**
* 清除内容
*/
fun onTextClear(from: LifeAccountAuthBusinessInfoEditView)
/**
* 内容修改
*/
fun onTextChange(from: LifeAccountAuthBusinessInfoEditView, text: String)
}
}
\ No newline at end of file
......@@ -7,7 +7,6 @@ import android.text.TextUtils
import android.text.TextWatcher
import android.util.AttributeSet
import android.view.View
import androidx.core.view.isVisible
import com.yidian.nightmode.widget.YdConstraintLayout
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ViewLifeAccountAuthIdentityInfoEditBinding
......@@ -51,6 +50,13 @@ class LifeAccountAuthIdentityInfoEditView @JvmOverloads constructor(
viewBinding.etContent.addTextChangedListener(this)
}
/**
* 设置标题
*/
fun setTitleContent(content: String) {
viewBinding.tvContent.text = content
}
/**
* 展示错误提示
*/
......@@ -62,7 +68,7 @@ class LifeAccountAuthIdentityInfoEditView @JvmOverloads constructor(
/**
* 隐藏错误提示
*/
fun dismissErrorTips() {
private fun dismissErrorTips() {
viewBinding.tvErrorTips.visibility = View.GONE
viewBinding.tvErrorTips.text = ""
}
......@@ -93,7 +99,7 @@ class LifeAccountAuthIdentityInfoEditView @JvmOverloads constructor(
* 禁止修改
*/
fun disableModify() {
viewBinding.ivClear.isVisible = false
viewBinding.ivClear.visibility = View.GONE
isEnabled = false
}
......
......@@ -79,6 +79,15 @@
app:LifeAccountAuthIdentityInfoEditView_hint_text="@string/input_id_card_number"
app:layout_constraintTop_toBottomOf="@id/ev_real_name" />
<com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthIdentityInfoEditView
android:id="@+id/ev_mobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:LifeAccountAuthIdentityInfoEditView_content_text="@string/enterprise_legal_mobile"
app:LifeAccountAuthIdentityInfoEditView_hint_text="@string/input_id_card_number"
app:layout_constraintTop_toBottomOf="@id/ev_id_card_number" />
<com.yidian.nightmode.widget.YdConstraintLayout
android:id="@+id/cl_face_auth"
android:layout_width="match_parent"
......@@ -87,6 +96,7 @@
android:paddingTop="17dp"
android:paddingEnd="12dp"
android:paddingBottom="6dp"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/ev_id_card_number">
<com.yidian.nightmode.widget.YdTextView
......
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools ="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="app_name">Yac</string>
<string name="action_settings">Settings</string>
<!-- Strings used for fragments for navigation -->
......@@ -121,5 +121,8 @@
<string name="registration_code_description">统一社会信用代码(注册号)将作为生活号唯一企业身份标识,请仔细核对,确认无误。</string>
<string name="next_step">下一步</string>
<string name="cancel">取消</string>
<string name="enterprise_legal_name">法人姓名</string>
<string name="enterprise_legal_mobile">法人手机号</string>
<string name="individual_business_manager_name">经营者姓名</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment