徐勤民 před 4 měsíci
revize
6cdc89f070
61 změnil soubory, kde provedl 8851 přidání a 0 odebrání
  1. +6
    -0
      .gitignore
  2. +5
    -0
      BuildProfile.ets
  3. +11
    -0
      Index.ets
  4. +148
    -0
      README.md
  5. +28
    -0
      build-profile.json5
  6. +19
    -0
      consumer-rules.txt
  7. +6
    -0
      hvigorfile.ts
  8. +224
    -0
      obfuscation-rules.txt
  9. +17
    -0
      oh-package-lock.json5
  10. +12
    -0
      oh-package.json5
  11. +3
    -0
      src/main/ets/ConstantValue.ets
  12. +12
    -0
      src/main/ets/bean/data/AutoData.ets
  13. +13
    -0
      src/main/ets/bean/data/AutoStopData.ets
  14. +9
    -0
      src/main/ets/bean/data/CertInfoData.ets
  15. +8
    -0
      src/main/ets/bean/data/CheckStateData.ets
  16. +11
    -0
      src/main/ets/bean/data/GetUserInfoData.ets
  17. +8
    -0
      src/main/ets/bean/data/PinData.ets
  18. +17
    -0
      src/main/ets/bean/data/SignData.ets
  19. +8
    -0
      src/main/ets/bean/model/AgreementModel.ets
  20. +6
    -0
      src/main/ets/bean/model/CertDownModel.ets
  21. +18
    -0
      src/main/ets/bean/model/CertInfoModel.ets
  22. +13
    -0
      src/main/ets/bean/model/CheckStateModel.ets
  23. +3
    -0
      src/main/ets/bean/model/VerifyCodeModel.ets
  24. +8
    -0
      src/main/ets/common/EnvUrl.ets
  25. +181
    -0
      src/main/ets/common/GlobalValue.ets
  26. +24
    -0
      src/main/ets/common/StorageKeys.ets
  27. +16
    -0
      src/main/ets/components/mainpage/MainPage.ets
  28. +10
    -0
      src/main/ets/enum/CertEnvType.ets
  29. +27
    -0
      src/main/ets/enum/EnvEnum.ets
  30. +141
    -0
      src/main/ets/http/ApiConfig.ets
  31. +85
    -0
      src/main/ets/http/ApiUtils.ets
  32. +45
    -0
      src/main/ets/manager/BackManager.ets
  33. +245
    -0
      src/main/ets/manager/CaManagerReal.ets
  34. +69
    -0
      src/main/ets/manager/EnvCheck.ets
  35. +138
    -0
      src/main/ets/manager/SettingManagerReal.ets
  36. +242
    -0
      src/main/ets/manager/SignManagerReal.ets
  37. +162
    -0
      src/main/ets/pages/CertDetails.ets
  38. +283
    -0
      src/main/ets/pages/CertDown.ets
  39. +14
    -0
      src/main/ets/pages/PinView.ets
  40. +48
    -0
      src/main/ets/public/BJCASDK.ets
  41. +83
    -0
      src/main/ets/public/CaManager.ets
  42. +77
    -0
      src/main/ets/public/SettingManager.ets
  43. +73
    -0
      src/main/ets/public/SignManager.ets
  44. +3
    -0
      src/main/ets/public/bean/SignModel.ets
  45. +14
    -0
      src/main/ets/public/bean/UserInfoModel.ets
  46. +82
    -0
      src/main/ets/public/callBack/BJCACallMsg.ets
  47. +263
    -0
      src/main/ets/public/sign/PinDialog.ets
  48. +170
    -0
      src/main/ets/util/base64Util.js
  49. +9
    -0
      src/main/ets/util/encodeUtil.js
  50. +5385
    -0
      src/main/ets/util/jsencryp.js
  51. +257
    -0
      src/main/ets/util/md5.js
  52. +12
    -0
      src/main/module.json5
  53. +12
    -0
      src/main/resources/base/element/string.json
  54. binární
      src/main/resources/base/media/mo_ywx_icon_title.png
  55. binární
      src/main/resources/base/media/mo_ywx_module_bg_cert.png
  56. binární
      src/main/resources/base/media/mo_ywx_module_icon_stamp.png
  57. +6
    -0
      src/main/resources/base/profile/main_pages.json
  58. +12
    -0
      src/main/resources/en_US/element/string.json
  59. +12
    -0
      src/main/resources/zh_CN/element/string.json
  60. +5
    -0
      src/test/List.test.ets
  61. +33
    -0
      src/test/LocalUnit.test.ets

+ 6
- 0
.gitignore Zobrazit soubor

@@ -0,0 +1,6 @@
/node_modules
/oh_modules
/.preview
/build
/.cxx
/.test

+ 5
- 0
BuildProfile.ets Zobrazit soubor

@@ -0,0 +1,5 @@
export default class BuildProfile {
static readonly HAR_VERSION = '1.0.4';
static readonly BUILD_MODE_NAME = 'debug';
static readonly DEBUG = true;
}

+ 11
- 0
Index.ets Zobrazit soubor

@@ -0,0 +1,11 @@

//sdk入口
export { BJCASDK } from './src/main/ets/public/BJCASDK'

// 环境枚举
export { EnvEnum } from './src/main/ets/enum/EnvEnum'
export { CertEnvType } from './src/main/ets/enum/CertEnvType'

// dialog
export { PinDialog } from './src/main/ets/public/sign/PinDialog'


+ 148
- 0
README.md Zobrazit soubor

@@ -0,0 +1,148 @@
# 鸿蒙医网信SDK

## 1. 初始化配置相关
> 相关方法Manager为`BJCASDK.settingManager()`
### 1.1 获取sdk版本号
```typescript
BJCASDK.settingManager().getVersion()
```
### 1.2 运行环境相关
> [环境码表](./src/main/ets/enum/EnvEnum.ets)

```typescript
// 设置环境
BJCASDK.settingManager().setServerEnvType(this.envType)
```
```typescript
// 获取当前运行环境
BJCASDK.settingManager().getServerEnvType()
```
### 1.3 厂商id
```typescript
// 设置厂商id
BJCASDK.settingManager().setClientId('51313546135')
```
```typescript
// 获取当前厂商id
BJCASDK.settingManager().getClientId()
```
## 2. 证书相关
> 相关方法Manager为`BJCASDK.certManager()`
### 2.1 证书是否存在

```typescript
BJCASDK.certManager().existsCert(this.phone)
```

### 2.2 显示证书页面

```typescript
BJCASDK.certManager().showCertPage(this.phone, (result) => {
ToolsHelper.showMessage(result.msg)
})
```



### 2.3 下证

```typescript
BJCASDK.certManager().certDown(this.phone, null, (result) => {
ToolsHelper.showMessage(result.msg)
})
```



### 2.4 更新证书

```typescript

BJCASDK.certManager().certUpdate(this.phone, undefined, res => {
if (res !== BJCACallMsg.SUCCESS) {
ToolsHelper.showMessage(JSON.stringify(res))
}
})
```



### 2.5 密码重置

```typescript
BJCASDK.certManager().certResetPin(this.phone, res => {
if (res !== BJCACallMsg.SUCCESS) {
ToolsHelper.showMessage(JSON.stringify(res))
}
})
```



### 2.6 清除本地证书

```typescript
BJCASDK.certManager().certClear()
```



### 2.7 获取签章图片

```typescript
BJCASDK.certManager().drawStamp(this.phone, res => {
if (res.code === BJCACallMsg.SUCCESS.code && res.data) {
this.draw = res.data
} else {
ToolsHelper.showMessage("未设置签名图片")
}
})
```

```typescript
Image(`data:image/png;base64,${this.draw}`)
.width(300)
.height(200)
.margin({ top: 15 })
.objectFit(ImageFit.Contain)
.visibility(this.draw ? Visibility.Visible : Visibility.None)
```



### 2.8 获取用户信息

```typescript
BJCASDK.certManager().getUserInfo(this.phone, res => {
ToolsHelper.showMessage(JSON.stringify(res))
})
```





## [常见错误码](src/main/ets/public/callBack/BJCACallMsg.ets)
























+ 28
- 0
build-profile.json5 Zobrazit soubor

@@ -0,0 +1,28 @@
{
"apiType": "stageMode",
"buildOption": {
},
"buildOptionSet": [
{
"name": "release",
"arkOptions": {
"obfuscation": {
"ruleOptions": {
"enable": true,
"files": [
"obfuscation-rules.txt"
]
},
"consumerFiles": [
"./consumer-rules.txt"
]
}
},
},
],
"targets": [
{
"name": "default"
}
]
}

+ 19
- 0
consumer-rules.txt Zobrazit soubor

@@ -0,0 +1,19 @@
# 开启属性混淆
-enable-property-obfuscation
# 开启顶层作用域名称混淆
-enable-toplevel-obfuscation
# 开启直接导入或导出的类或对象的名称和属性名混淆
-enable-export-obfuscation
# 混淆字符串字面量属性名
-enable-string-property-obfuscation
# 开启文件/文件夹名称混淆
-enable-filename-obfuscation
# -compact
-remove-log

-keep-file-name
./Index.ets





+ 6
- 0
hvigorfile.ts Zobrazit soubor

@@ -0,0 +1,6 @@
import { harTasks } from '@ohos/hvigor-ohos-plugin';

export default {
system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
plugins:[] /* Custom plugin to extend the functionality of Hvigor. */
}

+ 224
- 0
obfuscation-rules.txt Zobrazit soubor

@@ -0,0 +1,224 @@
# 开启属性混淆
-enable-property-obfuscation
# 开启顶层作用域名称混淆
-enable-toplevel-obfuscation
# 开启直接导入或导出的类或对象的名称和属性名混淆
-enable-export-obfuscation
# 混淆字符串字面量属性名
# -enable-string-property-obfuscation
# 开启文件/文件夹名称混淆
-enable-filename-obfuscation
# -compact
-remove-log

-keep-file-name
./Index
./src/main/ets/public
./src/main/ets/public/BJCASDK
./src/main/ets/public/CaManager
./src/main/ets/public/SignManager
./src/main/ets/public/SettingManager
./src/main/ets/public/sign/PinDialog
./src/main/ets/public/callBack/BJCACallMsg
./src/main/ets/public/bean/SignModel
./src/main/ets/public/bean/UserInfoModel
./src/main/ets/enum
./src/main/ets/enum/EnvEnum
./src/main/ets/enum/CertEnvType
# ./src/main/ets/bean/data/AutoData
# ./src/main/ets/bean/data/AutoStopData
# ./src/main/ets/bean/data/CertInfoData
# ./src/main/ets/bean/data/CheckStateData
# ./src/main/ets/bean/data/GetUserInfoData
# ./src/main/ets/bean/data/PinData
# ./src/main/ets/bean/data/SignData
# ./src/main/ets/bean/model/AgreementModel
# ./src/main/ets/bean/model/CertDownModel
# ./src/main/ets/bean/model/CertInfoModel
# ./src/main/ets/bean/model/CheckStateModel
# ./src/main/ets/bean/model/UserInfoModel
# ./src/main/ets/bean/model/VerifyCodeModel

-keep-global-name
BJCASDK
CaManager
SignManager
SettingManager
PinDialog
CallBackForData
CallBackMsg
BJCACallMsg
EnvEnum
CertEnvType
# AutoData
# AutoStopData
# CertInfoData
# CheckStateData
# GetUserInfoData
# PinData
# SignData
# AgreementItem
# AgreementModel
# CertDownModel
# CertInfoModel
# CheckStateModel
# CertList
SignModel
UserInfoModel
# VerifyCodeModel

# 指定你想保留的属性名
-keep-property-name
controller
# BJCASDK
settingManager
signManager
CaManager
certManager
# SettingManager
setServerEnvType
envType
clientId
url
init
getVersion
getServerEnvType
getServerEnvUrl
setClientId
getClientId
getEnvTypeByUrl
getUrlByEnvType
# PinDialog
controller
# BJCACallMsg
SUCCESS
CANCEL
FAILED
UNKOWN
ROUTER
ILLEGALITY
NOT_CLIENT
NOT_PHONE
CERT_NOT_EXISTS
CERT_EXISTS
SUCCESS_CERT_INFO
ERROR_CERT_INFO
CERT_NOT_UPDATE
SIGN_CANCEL
SIGN_SUCCESS
SIGN_SUCCESS_REST
# CaManager
existsCert
phone
mFirmId
certDown
certUpdate
certResetPin
certClear
drawStamp
showCertPage
getUserInfo
# SignManager
dialogController
signWithFirmId
uniqueIdList
listener
keepDay
sysTag
keepPin
isPinExempt
clearPin
signForSignAuto
stopSignAuto
getSignAutoInfo
# CertEnvType
DOCTOR
MASS
# EnvEnum
PUBLIC
INTEGRATE
TEST
DEV
TEST_DOMAIN
DEV_DOMAIN
# AutoData
sysTag
pin
firmId
# AutoStopData
clientId
userId
sysTag
# CertInfoData
userId
clientId
# CheckStateData
firmId
# GetUserInfoData
userId
openId
clientId
# PinData
pin
# SignData
clientId
signDataIdList
userId
pin
orderFirmId
# AgreementModel
agreementName
agreementUrl
list
# CertDownModel
userId
endDate
# CertInfoModel
caChannel
caOrgName
caSealBase64
credenceAppend
credenceStatus
deviceId
deviceType
deviceVersion
endDate
idCardNum
idType
idTypeDes
sex
startDate
userName
unit
# CheckStateModel
certList
deviceId
enableCertUpdate
phone
userName
firmId
endTime
startTime
# SignModel
fileUniqueId
# UserInfoModel
certUpdateTipDay
deviceId
enableCert
endDate
idCardNum
idCardType
nowDate
openId
phoneNum
picUrl
startDate
userName
# VerifyCodeModel
userId







+ 17
- 0
oh-package-lock.json5 Zobrazit soubor

@@ -0,0 +1,17 @@
{
"meta": {
"stableOrder": false
},
"lockfileVersion": 3,
"ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
"specifiers": {
"@szyx/sdk_base@../basic": "@szyx/sdk_base@../basic"
},
"packages": {
"@szyx/sdk_base@../basic": {
"name": "@szyx/sdk_base",
"resolved": "../basic",
"registryType": "local"
}
}
}

+ 12
- 0
oh-package.json5 Zobrazit soubor

@@ -0,0 +1,12 @@
{
"name": "@szyx/sdk_ywx",
"version": "1.0.4",
"description": "医网信,签名sdk。",
"main": "Index.ets",
"author": "xuqm",
"license": "Apache-2.0",
"dependencies": {
"@szyx/sdk_base": "file:../basic"
// "@szyx/sdk_base": "^1.0.2"
}
}

+ 3
- 0
src/main/ets/ConstantValue.ets Zobrazit soubor

@@ -0,0 +1,3 @@
export class ConstantValue {
public static VERSION = '1.0.0'
}

+ 12
- 0
src/main/ets/bean/data/AutoData.ets Zobrazit soubor

@@ -0,0 +1,12 @@
export class AutoData {
sysTag: string
pin: string
firmId: string

constructor(sysTag: string, firmId: string, pin: string) {
this.sysTag = sysTag
this.pin = pin
this.firmId = firmId
}

}

+ 13
- 0
src/main/ets/bean/data/AutoStopData.ets Zobrazit soubor

@@ -0,0 +1,13 @@
export class AutoStopData {
clientId: string
userId: string
sysTag?: string

constructor(clientId: string, userId: string, sysTag?: string) {
this.clientId = clientId
this.userId = userId
this.sysTag = sysTag
}


}

+ 9
- 0
src/main/ets/bean/data/CertInfoData.ets Zobrazit soubor

@@ -0,0 +1,9 @@
export class CertInfoData {
userId: string
clientId: string

constructor(userId: string, clientId: string) {
this.userId = userId
this.clientId = clientId
}
}

+ 8
- 0
src/main/ets/bean/data/CheckStateData.ets Zobrazit soubor

@@ -0,0 +1,8 @@
export class CheckStateData {
firmId?: string

constructor(firmId?: string) {
this.firmId = firmId
}

}

+ 11
- 0
src/main/ets/bean/data/GetUserInfoData.ets Zobrazit soubor

@@ -0,0 +1,11 @@
export class GetUserInfoData{
userId:string
openId:string
clientId:string

constructor(userId: string, openId: string, clientId: string) {
this.userId = userId
this.openId = openId
this.clientId = clientId
}
}

+ 8
- 0
src/main/ets/bean/data/PinData.ets Zobrazit soubor

@@ -0,0 +1,8 @@
export class PinData {
pin: string

constructor(pin: string) {
this.pin = pin
}

}

+ 17
- 0
src/main/ets/bean/data/SignData.ets Zobrazit soubor

@@ -0,0 +1,17 @@
import { List } from '@kit.ArkTS';

export class SignData {
clientId: string
signDataIdList: List<string> | Array<string>
userId: string
pin: string
orderFirmId?: string

constructor(clientId: string, signDataIdList: List<string> | Array<string>, userId: string, pin: string, orderFirmId?: string) {
this.clientId = clientId;
this.signDataIdList = signDataIdList;
this.userId = userId;
this.pin = pin;
this.orderFirmId = orderFirmId;
}
}

+ 8
- 0
src/main/ets/bean/model/AgreementModel.ets Zobrazit soubor

@@ -0,0 +1,8 @@
export interface AgreementItem {
agreementName: string
agreementUrl: string
}

export interface AgreementModel {
list: Array<AgreementItem>
}

+ 6
- 0
src/main/ets/bean/model/CertDownModel.ets Zobrazit soubor

@@ -0,0 +1,6 @@
export interface CertDownModel{
userId:string
endDate:string
stamp?:string
startDate:string
}

+ 18
- 0
src/main/ets/bean/model/CertInfoModel.ets Zobrazit soubor

@@ -0,0 +1,18 @@
export interface CertInfoModel {
caChannel: number
caOrgName: string
caSealBase64: string
credenceAppend: string
credenceStatus: number
deviceId: string
deviceType: string
deviceVersion: string
endDate: string
idCardNum: string
idType: string
idTypeDes: string
sex: string
startDate: string
userName: string
unit?: string
}

+ 13
- 0
src/main/ets/bean/model/CheckStateModel.ets Zobrazit soubor

@@ -0,0 +1,13 @@
export interface CertList {
endTime: string;
firmId: string;
startTime: string;
}

export interface CheckStateModel {
certList: CertList[];
deviceId: string;
enableCertUpdate: boolean;
phone: string;
userName: string;
}

+ 3
- 0
src/main/ets/bean/model/VerifyCodeModel.ets Zobrazit soubor

@@ -0,0 +1,3 @@
export interface VerifyCodeModel{
userId:string
}

+ 8
- 0
src/main/ets/common/EnvUrl.ets Zobrazit soubor

@@ -0,0 +1,8 @@
export class EnvUrl {
public static DEV = "http://dev.51trust.com/";
public static DEV_DOMAIN = "http://dev.51trust.com/";
public static TEST = "http://beta.51trust.com/";
public static TEST_DOMAIN = "http://beta.51trust.com/";
public static INTEGRATE = "http://test.51trust.com/";
public static PUBLIC = "https://www.51trust.com/";
}

+ 181
- 0
src/main/ets/common/GlobalValue.ets Zobrazit soubor

@@ -0,0 +1,181 @@
import { AppStorageHelper, PreferencesHelper } from '@szyx/sdk_base/Index'
import { EnvEnum } from '../enum/EnvEnum'
import { EnvCheck } from '../manager/EnvCheck'
import { EnvUrl } from './EnvUrl'
import { StorageKeys } from './StorageKeys'
import util from '@ohos.util'
import { CertEnvType } from '../enum/CertEnvType'

export class GlobalValue {
// 是否实例的标志
private static instance: GlobalValue | null = null

// 单例模式
static getInstance() {
// 判断系统是否已经有单例了
if (GlobalValue.instance === null) {
GlobalValue.instance = new GlobalValue()
}
return GlobalValue.instance
}

private constructor() {
}

private _envType: EnvEnum = EnvEnum.PUBLIC
private _certEnvType: CertEnvType = CertEnvType.DOCTOR
private _envUrl: string = EnvUrl.PUBLIC
private _clientId: string | null = null
private _userId: string | null = null
private _deviceId: string | null = null
private _stampPic: string | null = null
private _certClientId: string | null = null
private _certPhone: string | null = null
private _certEnvUrl: string | null = null
private _signAutoPin: string | null = null
private _signAutoDay: string | null = null

public set signAutoPin(value: string | null) {
this._signAutoPin = value
AppStorageHelper.save(StorageKeys.SIGN_AUTO_PIN, value ?? undefined)
PreferencesHelper.put(StorageKeys.SIGN_AUTO_PIN, value ?? undefined)
}

public get signAutoPin(): string | null {
return this._signAutoPin ?? AppStorageHelper.get(StorageKeys.SIGN_AUTO_PIN) ?? null
}

public set signAutoDay(value: string | null) {
this._signAutoDay = value
AppStorageHelper.save(StorageKeys.SIGN_AUTO_DAY, value ?? undefined)
PreferencesHelper.put(StorageKeys.SIGN_AUTO_DAY, value ?? undefined)
}

public get signAutoDay(): string | null {
return this._signAutoDay ?? AppStorageHelper.get(StorageKeys.SIGN_AUTO_DAY) ?? null
}

public set certEnvUrl(value: string | null) {
this._certEnvUrl = value
if (value) {
AppStorageHelper.save(StorageKeys.CERT_ENV_URL, value)
PreferencesHelper.put(StorageKeys.CERT_ENV_URL, value)
}
}

public get certEnvUrl(): string | null {
return this._certEnvUrl ?? AppStorageHelper.get(StorageKeys.CERT_ENV_URL) ?? null
}

public set stampPic(value: string | null) {
this._stampPic = value
AppStorageHelper.save(StorageKeys.STAMP_PIC, value ?? undefined)
PreferencesHelper.put(StorageKeys.STAMP_PIC, value ?? undefined)
}

public get stampPic(): string | null {
return this._stampPic ?? AppStorageHelper.get(StorageKeys.STAMP_PIC) ?? null
}


public set certClientId(value: string | null) {
this._certClientId = value
AppStorageHelper.save(StorageKeys.NOT_CLIENT_ID, value ?? undefined)
PreferencesHelper.put(StorageKeys.NOT_CLIENT_ID, value ?? undefined)
}

public get certClientId(): string | null {
return this._certClientId ?? AppStorageHelper.get(StorageKeys.NOT_CLIENT_ID) ?? null
}


public set certPhone(value: string | null) {
this._certPhone = value
AppStorageHelper.save(StorageKeys.NOT_PHONE, value ?? undefined)
PreferencesHelper.put(StorageKeys.NOT_PHONE, value ?? undefined)
}

public get certPhone(): string | null {
return this._certPhone ?? AppStorageHelper.get(StorageKeys.NOT_PHONE) ?? null
}

public set deviceId(value: string) {
this._deviceId = value
PreferencesHelper.put(StorageKeys.DEVICE_ID, value)
}

public get deviceId(): string {

if (!this._deviceId) {
this.deviceId = util.generateRandomUUID()
}

return this._deviceId!
}

public set userId(value: string | null) {
this._userId = value
if (value) {
AppStorageHelper.save(StorageKeys.USER_ID, value)
PreferencesHelper.put(StorageKeys.USER_ID, value)
}
}

public get userId(): string | null {
return this._userId ?? AppStorageHelper.get(StorageKeys.USER_ID) ?? null
}

public set envType(value: EnvEnum) {
this._envType = value
this._envUrl = EnvCheck.getUrlByEnvType(value)
AppStorageHelper.save(StorageKeys.ENV_URL, this._envUrl)
PreferencesHelper.put(StorageKeys.ENV_URL, this._envUrl)
}

public get envType(): EnvEnum {
return this._envType
}

public set certEnvType(value: CertEnvType) {
this._certEnvType = value
AppStorageHelper.save(StorageKeys.CERT_ENV_TYPE, value === CertEnvType.DOCTOR ? "101" : "102")
PreferencesHelper.put(StorageKeys.CERT_ENV_TYPE, value === CertEnvType.DOCTOR ? "101" : "102")
}

public get certEnvType(): CertEnvType {
return this._certEnvType
}

public get envUrl(): string {
return this._envUrl
}


public setClientId(value: string) {
this._clientId = value
AppStorageHelper.save(StorageKeys.CLIENT_ID, value)
PreferencesHelper.put(StorageKeys.CLIENT_ID, value)
}

public getClientId(): string | undefined {
return this._clientId ?? AppStorageHelper.get(StorageKeys.CLIENT_ID)
}

public getOpenId(): string | undefined {
if (this.userId) {

/**
* salt一旦定下来不能变更,userId运算成openId需要的参数
*/
let OPENID_SALT = ['y', 'w', 'q']

let array = this.userId.split('')
array.splice(8, 0, OPENID_SALT[0])
array.splice(13, 0, OPENID_SALT[1])
array.splice(18, 0, OPENID_SALT[2])
array.reverse()
return array.join('')
}
return undefined
}
}

+ 24
- 0
src/main/ets/common/StorageKeys.ets Zobrazit soubor

@@ -0,0 +1,24 @@
export class StorageKeys{
// 厂商id
public static CLIENT_ID = 'szyxSdkClientId'
// userId用户唯一标识
public static USER_ID = 'szyxSdkUserId'
// 环境地址
public static ENV_URL = 'szyxSdkEnvUrl'
// 证书用户的环境类型
public static CERT_ENV_TYPE = 'szyxSdkCertEnvType'
// 设备唯一码
public static DEVICE_ID = 'szyxSdkDeviceId'
// 签名图片
public static STAMP_PIC = 'szyxSdkStampPic'
// 证书id,存储的是下证的clientId
public static NOT_CLIENT_ID = 'szyxSdkCertClientId'
// 下证的手机号
public static NOT_PHONE = 'szyxSdkCertPhone'
// 下证时的环境地址
public static CERT_ENV_URL = 'szyxSdkCertEnvUrl'
// 免密签名用到的pin码
public static SIGN_AUTO_PIN = 'signAutoPin'
// 免密签名到期时间
public static SIGN_AUTO_DAY = 'signAutoDay'
}

+ 16
- 0
src/main/ets/components/mainpage/MainPage.ets Zobrazit soubor

@@ -0,0 +1,16 @@
@Component
export struct MainPage {
@State message: string = 'Hello World';

build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.height('100%')
}
}

+ 10
- 0
src/main/ets/enum/CertEnvType.ets Zobrazit soubor

@@ -0,0 +1,10 @@
export enum CertEnvType {
/**
* 医师用户
*/
DOCTOR = '医师用户',
/**
* 公众用户
*/
MASS = '公众用户',
}

+ 27
- 0
src/main/ets/enum/EnvEnum.ets Zobrazit soubor

@@ -0,0 +1,27 @@
export enum EnvEnum {
/**
* 运营环境
*/
PUBLIC = '运营环境',
/**
* 集成环境
*/
INTEGRATE = '集成环境',
/**
* 测试环境
*/
TEST = '测试环境',
/**
* 开发环境
*/
DEV = '开发环境',
/**
* 测试环境-域名
*/
TEST_DOMAIN = '测试环境-域名',
/**
* 开发环境-域名
*/
DEV_DOMAIN = '开发环境-域名'

}

+ 141
- 0
src/main/ets/http/ApiConfig.ets Zobrazit soubor

@@ -0,0 +1,141 @@
import { CertEnvType } from '../../../../Index'
import { GlobalValue } from '../common/GlobalValue'

export interface ApiElem {
url: string
apiNo?: string
}

/**
* 获取验证码
*/
export const verifyCodeUrl: ApiElem = {
apiNo: 'VerifyCode',
url: 'am/v3/userCenter/account/getSMSVerifyCode'
}

/**
* 下载证书
*/
export const certDown: ApiElem = {
apiNo: 'updateAuthorizeCert',
url: 'am/v3/doctor/cert/updateAuthorizeCert'
}

/**
* 获取协议列表信息
*/
export const getAgreement: ApiElem = {
apiNo: 'agreementList',
url: 'am/v3/common/agreementList'
}

const getUserInfoForDoctor: ApiElem = {
apiNo: 'getUserInfoForDoctor',
url: 'am/v3/doctor/getDoctorBaseInfo'
}

const getUserInfoForMass: ApiElem = {
apiNo: 'getUserInfoForMass',
url: 'am/v3/userCenter/user/getUserInfo'
}

/**
* 获取用户信息
*/
export const getUserInfo = (): ApiElem => {
return GlobalValue.getInstance().certEnvType === CertEnvType.MASS ? getUserInfoForMass : getUserInfoForDoctor
}

const getCertInfoForDoctor: ApiElem = {
apiNo: 'getCertInfoForDoctor',
url: 'am/v3/doctor/cert/viewMyCert'
}

const getCertInfoForMass: ApiElem = {
apiNo: 'getCertInfoForMass',
url: 'am/v3/userCenter/user/getCert'
}

/**
* 获取证书信息
*/
export const getCertInfo = (): ApiElem => {
return GlobalValue.getInstance().certEnvType === CertEnvType.MASS ? getCertInfoForMass : getCertInfoForDoctor
}

/**
* 获取证书状态
*/
export const checkState: ApiElem = {
apiNo: 'checkState',
url: 'am/v3/doctor/checkState'
}


/**
* 签名
*/
export const signWithServer: ApiElem = {
apiNo: 'signWithServer',
url: 'am/v3/recipe/authorizeSign'
}

/**
* 校验托管证书pin码
*/
export const verifyPin: ApiElem = {
apiNo: 'signWithServer',
url: 'am/v3/doctor/cert/verifyPin'
}

/**
* 授权签名操作-确认授权
*/
export const sureStartForGrant: ApiElem = {
apiNo: 'sureStartForGrant',
url: 'am/v3/grant/sure'
}

/**
* 开启自动签名(托管证书方式)
*/
export const sureSignForSignAuto: ApiElem = {
apiNo: 'sureSignForSignAuto',
url: 'am/v3/selfSign/authorize/sure'
}
/**
* 停止自动签名(托管证书方式)
*/
export const getSignAutoQuit: ApiElem = {
apiNo: 'getSignAutoQuit',
url: 'am/v3/selfSign/quit'
}
/**
* 获取自动签信息
*/
export const getSignAutoInfo: ApiElem = {
apiNo: 'getSignAutoInfo',
url: 'am/v3/selfSign/getSelfSignInfo'
}






















+ 85
- 0
src/main/ets/http/ApiUtils.ets Zobrazit soubor

@@ -0,0 +1,85 @@
import { HttpHelper } from '@szyx/sdk_base/src/main/ets/http/HttpHelper';
import { GlobalValue } from '../common/GlobalValue';
import { ConstantValue } from '../ConstantValue';
import { ApiElem } from '../http/ApiConfig';
import { md5_hex } from '../util/md5';

interface HttpResult<T> {
status: string
data?: T
message?: string
}

export class ApiUtils {
public static post<T>(url: ApiElem, data?: Object): Promise<T> {

return new Promise((resolve, reject) => {

let MD5_KEY = 'YWQ!@#'
let timeStamp = Date.now()
let signOrigin = `timeStamp=${timeStamp}#${MD5_KEY}`
let sign = md5_hex(signOrigin)

HttpHelper.get()
.post<HttpResult<T>>(url.url.startsWith('http') ? url.url : GlobalValue.getInstance().envUrl + url.url,
data ? JSON.stringify(data) : undefined, {
userId: GlobalValue.getInstance().userId,
clientId: GlobalValue.getInstance().getClientId(),
version: ConstantValue.VERSION,
deviceType: '01',
deviceId: GlobalValue.getInstance().deviceId,
timeStamp: timeStamp + '',
sign: sign,
phoneModel: 'sign',
phoneVersion: 'sign',
phoneBrand: 'HarmonyOS'
}, url.apiNo)
.then((res: HttpResult<T>) => {
if (res.status === '0') {
resolve(res.data as T)
} else {
reject(new Error(res.message))
}

})
.catch((error: Error) => {
reject(error)
})
})
}
public static get<T>(url: ApiElem, data?: Object): Promise<T> {

return new Promise((resolve, reject) => {

let MD5_KEY = 'YWQ!@#'
let timeStamp = Date.now()
let signOrigin = `timeStamp=${timeStamp}#${MD5_KEY}`
let sign = md5_hex(signOrigin)

HttpHelper.get()
.get<HttpResult<T>>(url.url.startsWith('http') ? url.url : GlobalValue.getInstance().envUrl + url.url,
data ? JSON.stringify(data) : undefined, {
userId: GlobalValue.getInstance().userId,
clientId: GlobalValue.getInstance().getClientId(),
version: ConstantValue.VERSION,
deviceType: '01',
timeStamp: timeStamp + '',
sign: sign,
phoneModel: 'sign',
phoneVersion: 'sign',
phoneBrand: 'HarmonyOS'
}, url.apiNo)
.then((res: HttpResult<T>) => {
if (res.status === '0') {
resolve(res.data as T)
} else {
reject(new Error(res.message))
}

})
.catch((error: Error) => {
reject(error)
})
})
}
}

+ 45
- 0
src/main/ets/manager/BackManager.ets Zobrazit soubor

@@ -0,0 +1,45 @@
import { ValidatorHelper } from '@szyx/sdk_base/Index'
import { BJCACallMsg, CallBackForData, CallBackMsg } from '../public/callBack/BJCACallMsg'
import { GlobalValue } from '../common/GlobalValue'

export class BackManager {
// 是否实例的标志
private static instance: BackManager | null = null

static get() {
// 判断系统是否已经有单例了
if (BackManager.instance === null) {
BackManager.instance = new BackManager()
}
return BackManager.instance
}

private constructor() {
}

private _listener: ((result: CallBackMsg) => void) | null = null

private setListener(listener: (result: CallBackMsg) => void) {
this._listener = listener
}

public call(result: CallBackMsg) {
if (this._listener) {
this._listener(result)
this._listener = null
}
}

public checkParams(phone: string, listener: (result: CallBackMsg) => void): boolean {
this.setListener(listener)
if (!GlobalValue.getInstance().getClientId()) {
BackManager.get().call(BJCACallMsg.NOT_CLIENT)
return false
}
if (!ValidatorHelper.isPhone(phone)) {
BackManager.get().call(BJCACallMsg.NOT_PHONE)
return false
}
return true
}
}

+ 245
- 0
src/main/ets/manager/CaManagerReal.ets Zobrazit soubor

@@ -0,0 +1,245 @@
import { ValidatorHelper } from '@szyx/sdk_base/Index';
import { BJCACallMsg, CallBackForData, CallBackMsg } from '../public/callBack/BJCACallMsg';
import { GlobalValue } from '../common/GlobalValue';
import router from '@ohos.router';
import { BusinessError } from '@kit.BasicServicesKit';
import { BackManager } from '../manager/BackManager';
import { ApiUtils } from '../http/ApiUtils';
import { checkState, getUserInfo } from '../http/ApiConfig';
import { GetUserInfoData } from '../bean/data/GetUserInfoData';
import { UserInfoModel } from '../public/bean/UserInfoModel';
import { CheckStateData } from '../bean/data/CheckStateData';
import { CheckStateModel } from '../bean/model/CheckStateModel';

const CertDown = import('../pages/CertDown');
const CertDetails = import('../pages/CertDetails');


export class CaManagerReal {
/**
* 证书是否存在
* @param phone
* @returns
*/
public static existsCert(phone?: string): boolean {

if (!GlobalValue.getInstance().getClientId()) {
return false
}
if (phone && !ValidatorHelper.isPhone(phone)) {
return false
}

if (GlobalValue.getInstance().certEnvUrl === GlobalValue.getInstance().envUrl &&
GlobalValue.getInstance().certClientId === GlobalValue.getInstance().getClientId() &&
GlobalValue.getInstance().certPhone &&
(!phone || GlobalValue.getInstance().certPhone === phone)) {
return true
} else {
return false
}

}

/**
* 下证
* @param phone
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL)
*/
public static certDown(phone: string, mFirmId: string | undefined, listener: (result: CallBackMsg) => void) {

if (!BackManager.get().checkParams(phone, listener)) {
return
}

router.pushNamedRoute({
name: 'CertDown',
params: {
phone: phone,
mFirmId: mFirmId,
certDownType: 0,
}
}, router.RouterMode.Single).then(() => {
console.info('Succeeded in jumping to the CertDown page.')

}).catch((err: BusinessError) => {
BackManager.get().call(BJCACallMsg.ROUTER)
console.error(`Failed to jump to the second page.Code is ${err.code}, message is ${err.message}`)
})
}

/**
* 更新证书
* @param phone
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_UPDATE|CERT_NOT_EXISTS)
*/
public static certUpdate(phone: string, mFirmId: string | undefined, listener: (result: CallBackMsg) => void) {

if (!BackManager.get().checkParams(phone, listener)) {
return
}

// 获取证书状态
ApiUtils.post<CheckStateModel>(checkState, new CheckStateData(mFirmId))
.then((res: CheckStateModel) => {
if (res.enableCertUpdate) {
router.pushNamedRoute({
name: 'CertDown',
params: {
phone: phone,
mFirmId: mFirmId,
certDownType: 1,
}
}, router.RouterMode.Single).then(() => {
console.info('Succeeded in jumping to the CertDown page.')

}).catch((err: BusinessError) => {
BackManager.get().call(BJCACallMsg.ROUTER)
console.error(`Failed to jump to the second page.Code is ${err.code}, message is ${err.message}`)
})
} else {
BackManager.get().call(BJCACallMsg.CERT_NOT_UPDATE)
}
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
BackManager.get().call(BJCACallMsg.CERT_NOT_EXISTS)
})

}

/**
* 重置pin码
* @param mFirmId
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_EXISTS)
*/
public static certResetPin(mFirmId: string | undefined, listener: (result: CallBackMsg) => void) {
const phone = GlobalValue.getInstance().certPhone
if (!phone) {
listener(BJCACallMsg.CERT_NOT_EXISTS)
return
}

if (!BackManager.get().checkParams(phone, listener)) {
return
}

// 获取证书状态
ApiUtils.post<CheckStateModel>(checkState, new CheckStateData(mFirmId))
.then((res: CheckStateModel) => {
router.pushNamedRoute({
name: 'CertDown',
params: {
phone: phone,
mFirmId: mFirmId,
certDownType: 2,
}
}, router.RouterMode.Single).then(() => {
console.info('Succeeded in jumping to the CertDown page.')

}).catch((err: BusinessError) => {
BackManager.get().call(BJCACallMsg.ROUTER)
console.error(`Failed to jump to the second page.Code is ${err.code}, message is ${err.message}`)
})
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
BackManager.get().call(BJCACallMsg.CERT_NOT_EXISTS)
})

}

/**
* 清除本地证书
* @param phone
* @param listener 操作完成
*/
public static certClear(listener?: () => void) {

GlobalValue.getInstance().stampPic = null
GlobalValue.getInstance().certClientId = null
GlobalValue.getInstance().certPhone = null
listener && listener()

}

/**
* 获取签章图片
* @param listener BJCACallMsg.SUCCESS.code & base64 || BJCACallMsg.FAILED.code
*/
public static drawStamp(phone: string, listener: (result: CallBackForData<string>) => void) {

if (CaManagerReal.existsCert(phone) && GlobalValue.getInstance().stampPic) {
listener({
code: BJCACallMsg.SUCCESS.code,
msg: "获取签名信息成功",
data: GlobalValue.getInstance().stampPic!!
})
} else {
listener({
code: BJCACallMsg.FAILED.code,
msg: "获取签名信息失败",
})
}

}

/**
* 显示证书页面
* @param phone
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_EXISTS|ERROR_CERT_INFO)
*/
public static showCertPage(phone: string, listener: (result: CallBackMsg) => void) {

if (!BackManager.get().checkParams(phone, listener)) {
return
}

if (CaManagerReal.existsCert(phone)) {
router.pushNamedRoute({
name: 'ShowCertPage'
}, router.RouterMode.Single).then(() => {
console.info('Succeeded in jumping to the CertDown page.')

}).catch((err: BusinessError) => {
BackManager.get().call(BJCACallMsg.ROUTER)
console.error(`Failed to jump to the second page.Code is ${err.code}, message is ${err.message}`)
})
} else {
BackManager.get().call(BJCACallMsg.CERT_NOT_EXISTS)
}

}

/**
* 获取用户信息
* @param phone
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|CERT_NOT_EXISTS)||BJCACallMsg.SUCCESS.code & base64 || BJCACallMsg.FAILED.code
*/
public static getUserInfo(phone: string, listener: (result: CallBackForData<UserInfoModel>) => void) {

if (!BackManager.get().checkParams(phone, listener)) {
return
}

if (CaManagerReal.existsCert(phone)) {
ApiUtils.get<UserInfoModel>(getUserInfo(), new GetUserInfoData(GlobalValue.getInstance()
.userId!!, GlobalValue.getInstance().getOpenId()!!, GlobalValue.getInstance().getClientId()!!))
.then((res: UserInfoModel) => {
console.log('------------->', JSON.stringify(res))
listener({
code: BJCACallMsg.SUCCESS.code,
msg: "获取证书信息成功",
data: res
})
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
listener({
code: BJCACallMsg.FAILED.code,
msg: "获取证书信息失败",
})
})
} else {
BackManager.get().call(BJCACallMsg.CERT_NOT_EXISTS)
}

}
}

+ 69
- 0
src/main/ets/manager/EnvCheck.ets Zobrazit soubor

@@ -0,0 +1,69 @@
import { EnvUrl } from '../common/EnvUrl';
import { EnvEnum } from '../enum/EnvEnum';

export class EnvCheck {
/**
* 根据url,获取对应环境信息
* @param rul
*/
public static getEnvTypeByUrl(url: string) {

let envType = EnvEnum.PUBLIC

switch (url) {
case EnvUrl.DEV:
envType = EnvEnum.DEV;
break;
case EnvUrl.TEST:
envType = EnvEnum.TEST;
break;
case EnvUrl.INTEGRATE:
envType = EnvEnum.INTEGRATE;
break;
case EnvUrl.PUBLIC:
envType = EnvEnum.PUBLIC;
break;
case EnvUrl.TEST_DOMAIN:
envType = EnvEnum.TEST_DOMAIN;
break;
case EnvUrl.DEV_DOMAIN:
envType = EnvEnum.DEV_DOMAIN;
break;
}
return envType;
}

/**
* 根据环境信息,获取url
* @param envType
*/
public static getUrlByEnvType(envType: EnvEnum) {
let url = EnvUrl.PUBLIC;
switch (envType) {
case EnvEnum.PUBLIC:
url = EnvUrl.PUBLIC;
break;
case EnvEnum.INTEGRATE:
url = EnvUrl.INTEGRATE;
break;
case EnvEnum.TEST:
url = EnvUrl.TEST;
break;
case EnvEnum.DEV:
url = EnvUrl.DEV;
break;
case EnvEnum.TEST_DOMAIN:
url = EnvUrl.TEST_DOMAIN;
break;
case EnvEnum.DEV_DOMAIN:
url = EnvUrl.DEV_DOMAIN;
break;
default:
break;
}
return url;

}


}

+ 138
- 0
src/main/ets/manager/SettingManagerReal.ets Zobrazit soubor

@@ -0,0 +1,138 @@
import { PreferencesHelper } from '@szyx/sdk_base/Index'
import { GlobalValue } from '../common/GlobalValue'
import { StorageKeys } from '../common/StorageKeys'
import { ConstantValue } from '../ConstantValue'
import { CertEnvType } from '../enum/CertEnvType'
import { EnvEnum } from '../enum/EnvEnum'
import { EnvCheck } from './EnvCheck'


export class SettingManagerReal {
/**
* 初始化方法,不调用的话,无法获取本地clientId
*
*/
public static init() {

PreferencesHelper.get(StorageKeys.CLIENT_ID).then((res) => {
if (res) {
GlobalValue.getInstance().setClientId(res.toString())
}
})
PreferencesHelper.get(StorageKeys.USER_ID).then((res) => {
if (res) {
GlobalValue.getInstance().userId = res.toString()
}
})
PreferencesHelper.get(StorageKeys.ENV_URL).then((res) => {
if (res) {
GlobalValue.getInstance().envType = EnvCheck.getEnvTypeByUrl(res.toString())
}
})
PreferencesHelper.get(StorageKeys.DEVICE_ID).then((res) => {
if (res) {
GlobalValue.getInstance().deviceId = res.toString()
}
})
PreferencesHelper.get(StorageKeys.STAMP_PIC).then((res) => {
if (res) {
GlobalValue.getInstance().stampPic = res.toString()
}
})
PreferencesHelper.get(StorageKeys.NOT_CLIENT_ID).then((res) => {
if (res) {
GlobalValue.getInstance().certClientId = res.toString()
}
})
PreferencesHelper.get(StorageKeys.NOT_PHONE).then((res) => {
if (res) {
GlobalValue.getInstance().certPhone = res.toString()
}
})
PreferencesHelper.get(StorageKeys.CERT_ENV_URL).then((res) => {
if (res) {
GlobalValue.getInstance().certEnvUrl = res.toString()
}
})
PreferencesHelper.get(StorageKeys.SIGN_AUTO_PIN).then((res) => {
if (res) {
GlobalValue.getInstance().signAutoPin = res.toString()
}
})
PreferencesHelper.get(StorageKeys.SIGN_AUTO_DAY).then((res) => {
if (res) {
GlobalValue.getInstance().signAutoDay = res.toString()
}
})
PreferencesHelper.get(StorageKeys.CERT_ENV_TYPE).then((res) => {
if (res) {
GlobalValue.getInstance().certEnvType = res.toString() === "101" ? CertEnvType.DOCTOR : CertEnvType.MASS
}
})

}

/**
* 获取当前sdk版本号,独立维护
* @returns
*/
public static getVersion() {
return ConstantValue.VERSION
}

/**
* 设置运行环境
* @param envType
*/
public static setServerEnvType(envType: EnvEnum) {
GlobalValue.getInstance().envType = envType
}

/**
* 获取当前运行环境
* @returns
*/
public static getServerEnvType(): EnvEnum {
return GlobalValue.getInstance().envType
}

/**
* 获取当前运行环境的url
* @returns
*/
public static getServerEnvUrl(): string {
return GlobalValue.getInstance().envUrl
}

/**
* 设置厂商id
* @param clientId
*/
public static setClientId(clientId: string) {
GlobalValue.getInstance().setClientId(clientId)
}

/**
* 获取当前厂商id
* @returns
*/
public static getClientId() {
return GlobalValue.getInstance().getClientId()
}

/**
* 根据url,获取对应环境信息
* @param rul
*/
public static getEnvTypeByUrl(url: string): EnvEnum {
return EnvCheck.getEnvTypeByUrl(url)
}

/**
* 根据环境信息,获取url
* @param envType
*/
public static getUrlByEnvType(envType: EnvEnum): string {
return EnvCheck.getUrlByEnvType(envType)
}
}

+ 242
- 0
src/main/ets/manager/SignManagerReal.ets Zobrazit soubor

@@ -0,0 +1,242 @@
import { List } from '@kit.ArkTS';
import { CaManagerReal } from './CaManagerReal';
import { BJCASDK } from '../public/BJCASDK';
import { BJCACallMsg, CallBackForData } from '../public/callBack/BJCACallMsg';
import { ApiUtils } from '../http/ApiUtils';
import { getSignAutoInfo, getSignAutoQuit, signWithServer, sureSignForSignAuto, verifyPin } from '../http/ApiConfig';
import { SignData } from '../bean/data/SignData';
import { GlobalValue } from '../common/GlobalValue';
import { encodeByRsa } from '../util/encodeUtil';
import { SignModel } from '../public/bean/SignModel';
import { PinData } from '../bean/data/PinData';
import { AutoData } from '../bean/data/AutoData';
import { AutoStopData } from '../bean/data/AutoStopData';


export class SignManagerReal {
private static SIGN_BATCH_MAX_NUM = 100
public static listener: ((result: CallBackForData<string>) => void) | null = null

public static signWithFirmId(uniqueIdList: List<string> | Array<string>, listener: (result: CallBackForData<Array<SignModel>>) => void) {

if (uniqueIdList.length === 0) {
listener(BJCACallMsg.ILLEGALITY)
return
}
if (uniqueIdList.length > SignManagerReal.SIGN_BATCH_MAX_NUM) {
listener(BJCACallMsg.ILLEGALITY)
return
}
if (!CaManagerReal.existsCert()) {
listener && listener(BJCACallMsg.CERT_NOT_EXISTS)
return
}
if (SignManagerReal.isPinExempt()) {

if (!GlobalValue.getInstance().certClientId) {
listener && listener(BJCACallMsg.CERT_NOT_EXISTS)
return
}

console.log('-------->', JSON.stringify(uniqueIdList))
// 开始签名
ApiUtils.post<Array<SignModel>>(signWithServer, new SignData(
GlobalValue.getInstance().certClientId!,
uniqueIdList,
GlobalValue.getInstance().userId!,
GlobalValue.getInstance().signAutoPin!,
undefined
))
.then((res: Array<SignModel>) => {
listener && listener({
code: 1001,
msg: '操作完成',
data: res
})
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
listener && listener({
code: 1003,
msg: `用户操作失败:${error.message}`
})
})
} else {
SignManagerReal.listener = (result: CallBackForData<string>) => {
if (result.code === BJCACallMsg.SUCCESS.code) {

console.log('-------->', JSON.stringify(uniqueIdList))
// 开始签名
ApiUtils.post<Array<SignModel>>(signWithServer, new SignData(
GlobalValue.getInstance().certClientId!,
uniqueIdList,
GlobalValue.getInstance().userId!,
encodeByRsa(result.data),
undefined
))
.then((res: Array<SignModel>) => {
listener && listener({
code: 1001,
msg: '操作完成',
data: res
})
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
listener && listener({
code: 1003,
msg: `用户操作失败:${error.message}`
})
})
} else {
listener && listener({
code: 1003,
msg: `用户操作失败:${result.data}`
})
}
}
BJCASDK.signManager().dialogController.open()
}
}

public static keepPin(keepDay: number, listener: (result: CallBackForData<string>) => void) {

if (keepDay < 1 || keepDay > 60 || !Number.isInteger(keepDay)) {
listener(BJCACallMsg.ILLEGALITY)
return
}
if (!CaManagerReal.existsCert()) {
listener && listener(BJCACallMsg.CERT_NOT_EXISTS)
return
}

SignManagerReal.listener = (result: CallBackForData<string>) => {
if (result.code === BJCACallMsg.SUCCESS.code) {

// 请求免密
ApiUtils.post<string>(verifyPin, new PinData(
encodeByRsa(result.data),
))
.then(() => {
GlobalValue.getInstance().signAutoPin = encodeByRsa(result.data)
const curDate = new Date().getTime()
const keep = keepDay * 24 * 60 * 60 * 1000
GlobalValue.getInstance().signAutoDay = (curDate + keep).toString()

listener && listener(BJCACallMsg.SIGN_SUCCESS)
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
listener && listener({
code: 1003,
msg: `用户操作失败:${error.message}`
})
})
} else {
listener && listener(result)
}
}
BJCASDK.signManager().dialogController.open()
}

public static isPinExempt(): boolean {

if (!CaManagerReal.existsCert()) {
return false
}
const day = GlobalValue.getInstance().signAutoDay
if (!day) {
return false
}
if (!GlobalValue.getInstance().signAutoPin) {
return false
}

const curTime = new Date().getTime()
if (Number.parseInt(day) - curTime < 0) {
SignManagerReal.clearPin(() => {
})
return false
}
return true
}

public static clearPin(listener: () => void) {
GlobalValue.getInstance().signAutoPin = null
GlobalValue.getInstance().signAutoDay = null
listener()
}

public static signForSignAuto(sysTag: string, listener: (result: CallBackForData<string>) => void) {
if (!CaManagerReal.existsCert()) {
listener && listener(BJCACallMsg.CERT_NOT_EXISTS)
return
}

SignManagerReal.listener = (result: CallBackForData<string>) => {
if (result.code === BJCACallMsg.SUCCESS.code) {
// 请求自动签
ApiUtils.post<string>(sureSignForSignAuto, new AutoData(
sysTag,
GlobalValue.getInstance().certClientId!,
encodeByRsa(result.data),
))
.then(() => {
listener && listener(BJCACallMsg.SIGN_SUCCESS)
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
listener && listener({
code: 1003,
msg: `用户操作失败:${error.message}`
})
})
} else {
listener && listener(result)
}
}
BJCASDK.signManager().dialogController.open()
}

public static stopSignAuto(sysTag: string|undefined, listener: (result: CallBackForData<string>) => void) {
if (!CaManagerReal.existsCert()) {
listener && listener(BJCACallMsg.CERT_NOT_EXISTS)
return
}

// 停止自动签
ApiUtils.post<string>(getSignAutoQuit, new AutoStopData(
GlobalValue.getInstance().certClientId!,
GlobalValue.getInstance().userId!,
sysTag,
))
.then(() => {
listener && listener(BJCACallMsg.SIGN_SUCCESS)
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
listener && listener({
code: 1003,
msg: `用户操作失败:${error.message}`
})
})
}

public static getSignAutoInfo(listener: (result: CallBackForData<string>) => void) {
if (!CaManagerReal.existsCert()) {
listener && listener(BJCACallMsg.CERT_NOT_EXISTS)
return
}

// 停止自动签
ApiUtils.post<string>(getSignAutoInfo, new AutoStopData(
GlobalValue.getInstance().certClientId!,
GlobalValue.getInstance().userId!,
undefined,
))
.then(() => {
listener && listener(BJCACallMsg.SIGN_SUCCESS)
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
listener && listener({
code: 1003,
msg: `用户操作失败:${error.message}`
})
})
}
}

+ 162
- 0
src/main/ets/pages/CertDetails.ets Zobrazit soubor

@@ -0,0 +1,162 @@
import { GlobalValue } from '../common/GlobalValue'
import { getCertInfo } from '../http/ApiConfig'
import { ApiUtils } from '../http/ApiUtils'
import { CertInfoModel } from '../bean/model/CertInfoModel'
import { AlertDialog } from '@ohos.arkui.advanced.Dialog'
import { BackManager } from '../manager/BackManager'
import { BJCACallMsg } from '../public/callBack/BJCACallMsg'
import { ComposeTitleBar, router, SwipeRefresher } from '@kit.ArkUI'
import { CertInfoData } from '../bean/data/CertInfoData'


@Entry({ routeName: 'ShowCertPage' })
@Preview
@Component
export struct CertDetails {
// 证书信息
@State certInfo: CertInfoModel | null = null
@State isLoading: boolean = false
dialogControllerConfirm: CustomDialogController = new CustomDialogController({
builder: AlertDialog({
content: '获取证书信息失败',
secondaryButton: {
value: '确认',
fontColor: $r('sys.color.ohos_id_color_warning'),
action: () => {
// BackManager.get().call(BJCACallMsg.ERROR_CERT_INFO)
router.back()
}
},
}),
autoCancel: false,
customStyle: true,
alignment: DialogAlignment.Center
})

aboutToDisappear(): void {
BackManager.get()
.call(this.isLoading ? BJCACallMsg.CANCEL : this.certInfo ? BJCACallMsg.SUCCESS : BJCACallMsg.ERROR_CERT_INFO)
}

aboutToAppear(): void {
// 获取证书信息
ApiUtils.post<CertInfoModel>(getCertInfo(), new CertInfoData(GlobalValue.getInstance()
.userId!!, GlobalValue.getInstance().getClientId()!!))
.then((res: CertInfoModel) => {
console.log('------------->', JSON.stringify(res))
this.certInfo = res
}).catch((error: Error) => {
this.dialogControllerConfirm.open()
console.log('>>>>>', JSON.stringify(error))
// ToolsHelper.showMessage(error.message)
})
}

build() {
Column() {
Column() {
ComposeTitleBar({
title: "证书详情",
}).width('100%')
Column() {
Image($r("app.media.mo_ywx_icon_title"))
.width(50)
.height(50)
.margin({ top: 10 })
Text($r("app.string.mo_ywx_module_cert_title"))
.fontSize(17)
.fontColor("#073152")
Text(`姓名:${this.certInfo?.userName ?? ""}`)
.fontSize(14)
.fontColor("#073152")
.width("100%")
.margin({ top: 15 })
.padding({ left: 30, right: 30 })
Text(`性别:${this.certInfo?.sex ?? ""}`)
.fontSize(14)
.fontColor("#073152")
.width("100%")
.margin({ top: 5 })
.padding({ left: 30, right: 30 })
Text(`单位:${this.certInfo?.unit ?? ""}`)
.fontSize(14)
.fontColor("#073152")
.width("100%")
.margin({ top: 5 })
.padding({ left: 30, right: 30 })
Text(`资格证书类型:${this.certInfo?.idTypeDes ?? ""}`)
.fontSize(14)
.fontColor("#073152")
.width("100%")
.margin({ top: 5 })
.padding({ left: 30, right: 30 })
Text(`该人员已通过${this.certInfo?.caOrgName ?? ""}线下资格审定及真实身份真实性验证,该人员身份及信息真实可靠,特此认证。`)
.fontSize(14)
.fontColor("#073152")
.width("100%")
.margin({ top: 80 })
.lineHeight(20)
.padding({ left: 30, right: 30 })
Stack() {
Image($r("app.media.mo_ywx_module_icon_stamp"))
.width(50)
.height(50)
.margin({ top: 10 })
Column() {
Text(`颁发机构:${this.certInfo?.caOrgName ?? ""}`)
.fontSize(12)
.fontColor("#073152")
.padding({ left: 30, right: 70 })
Text(`颁发时间:${this.certInfo?.startDate ?? ""}`)
.fontSize(12)
.fontColor("#073152")
.margin({ top: 5 })
.padding({ left: 30, right: 70 })
Text(`有效时间:${this.certInfo?.endDate ?? ""}`)
.fontSize(12)
.fontColor("#073152")
.margin({ top: 5 })
.padding({ left: 30, right: 70 })
}
}.margin({ top: 90 })

Column() {
Text("一一证书说明一一")
.fontSize(12)
.fontColor("#666666")
.margin({ top: 5 })
.fontWeight(FontWeight.Bold)
Text(`本授权证书为有效文本、不得影印、涂改、转让。\n ${this.certInfo?.caOrgName ?? ""}拥有此授权书的最终解释权。`)
.fontSize(12)
.lineHeight(16)
.fontColor("#666666")
.margin({ top: 5 })
.fontWeight(FontWeight.Bold)
}
.justifyContent(FlexAlign.End)
.margin({ top: 90 })

}
.backgroundImage($r("app.media.mo_ywx_module_bg_cert"))
.backgroundImageSize(ImageSize.Contain)
.padding(20)
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
.visibility(this.isLoading ? Visibility.None : Visibility.Visible)

Column() {
SwipeRefresher({
content: '',
isLoading: true
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
.visibility(this.isLoading ? Visibility.Visible : Visibility.None)
}.width('100%').height('100%')
}
}

+ 283
- 0
src/main/ets/pages/CertDown.ets Zobrazit soubor

@@ -0,0 +1,283 @@
import { ComposeTitleBar, router } from '@kit.ArkUI';
import { GlobalValue } from '../common/GlobalValue';
import { certDown, getAgreement, verifyCodeUrl } from '../http/ApiConfig';
import { ApiUtils } from '../http/ApiUtils';
import { VerifyCodeModel } from '../bean/model/VerifyCodeModel';
import { ToolsHelper, XWebHelper } from '@szyx/sdk_base/Index';
import { BJCACallMsg } from '../public/callBack/BJCACallMsg';
import { BackManager } from '../manager/BackManager';
import { AgreementItem, AgreementModel } from '../bean/model/AgreementModel';
import { encodeByRsa } from '../util/encodeUtil';
import { CertDownModel } from '../bean/model/CertDownModel';


class routerParams {
phone: string
mFirmId?: string
// 0-下证;1-更新;2-重置
certDownType: number

constructor(phone: string, certDownType: number, mFirmId?: string) {
this.phone = phone
this.mFirmId = mFirmId
this.certDownType = certDownType
}
}

class data {
phoneNum: string
type: number

constructor(phone: string, type: number) {
this.phoneNum = phone;
this.type = type;
}
}

class AgreementData {
phone: string
type: string
firmId?: string

constructor(phone: string, type: string, firmId?: string) {
this.phone = phone;
this.type = type;
this.firmId = firmId;
}
}

class DownBean {
verifyCode: string
userId: string
pin: string
clientId?: string

constructor(verifyCode: string, userId: string, pin: string, clientId?: string) {
this.verifyCode = verifyCode;
this.userId = userId;
this.pin = pin;
this.clientId = clientId;
}
}

@Entry({ routeName: 'CertDown' })
@Preview
@Component
export struct CertDown {
// 手机号
@State phone: string = (router.getParams() as routerParams).phone
@State mFirmId?: string = (router.getParams() as routerParams).mFirmId
// @State phone: string = '13691543886'
//验证码
@State verifyCode: string | null = null
@State userId: string | null = null
// 签名密码设置
@State pwd: string | null = null
// 签名密码确认
@State pwd2: string | null = null
// 验证码倒计时
@State verifyCodeCountDown: number = 60
// 是否正在倒计时
@State isCountDown: boolean = false
// 退出页面时,是否用户主动取消
@State isCancel: boolean = true
// 是否需要显示协议
@State showAgreement: boolean = false
// 导航栏title
@State title: string = '证书下载'
// 下证类型
@State certDownType: number = (router.getParams() as routerParams).certDownType
// 协议列表
@State agreementModel: AgreementModel | null = null
// 是否勾选协议
@State checkAgreement: boolean = false

aboutToAppear(): void {

switch (this.certDownType) {
case 0:
this.showAgreement = true
this.title = '证书下载'
// 只有下证需要获取协议列表
ApiUtils.get<AgreementModel>(getAgreement, new AgreementData(this.phone, 'certDown', this.mFirmId))
.then((res: AgreementModel) => {
this.agreementModel = res
console.log('------------->', JSON.stringify(res.list))
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
ToolsHelper.showMessage(error.message)
})
break
case 1:
this.showAgreement = false
this.title = '证书更新'
break
case 2:
this.showAgreement = false
this.title = '签名密码重置'
break
}
ApiUtils.post<VerifyCodeModel>(verifyCodeUrl, new data(this.phone, 0))
.then((res: VerifyCodeModel) => {
GlobalValue.getInstance().userId = res.userId
this.userId = res.userId
this.verifyCodeCountDown = 60
this.isCountDown = true
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
ToolsHelper.showMessage(error.message)
})

setInterval(() => {
if (this.isCountDown) {
this.verifyCodeCountDown -= 1
}
if (this.verifyCodeCountDown <= 0) {
this.isCountDown = false
}
}, 1000)
}

aboutToDisappear(): void {
// 退出页面时候,判断操作状态
BackManager.get().call(this.isCancel ? BJCACallMsg.CANCEL : BJCACallMsg.SUCCESS)
}

build() {
Column() {
ComposeTitleBar({
title: this.title,
}).width('100%')
Column() {
Text(`下证手机号${this.phone}`).margin({ top: 30 })
Flex({ wrap: FlexWrap.NoWrap, alignItems: ItemAlign.Center }) {
Text('验证码').width('17%')
TextInput({
placeholder: '请输入验证码',
text: $$this.verifyCode,
}).width('50%')
.maxLength(6)
.type(InputType.PhoneNumber)
Button(this.isCountDown ? `${this.verifyCodeCountDown}s` : '获取验证码', {
stateEffect: true,
type: ButtonType.Capsule,
buttonStyle: ButtonStyleMode.EMPHASIZED
})
.fontColor('#ffffff')
.height(40)
.flexGrow(1)
.enabled(!this.isCountDown)
.onClick(() => {
ApiUtils.post<VerifyCodeModel>(verifyCodeUrl, new data(this.phone, 0))
.then((res: VerifyCodeModel) => {
GlobalValue.getInstance().userId = res.userId
this.userId = res.userId
this.verifyCodeCountDown = 60
this.isCountDown = true
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error))
ToolsHelper.showMessage(error.message)
})
})
.width('30%')
}.margin({ top: 30 })

Flex({ wrap: FlexWrap.NoWrap, alignItems: ItemAlign.Center }) {
Text('签名密码').width('22%')
TextInput({
placeholder: '请创建签名密码',
text: $$this.pwd,
}).width('70%')
.maxLength(6)
.type(InputType.NUMBER_PASSWORD)
}.margin({ top: 20 })

Flex({ wrap: FlexWrap.NoWrap, alignItems: ItemAlign.Center }) {
Text('确认密码').width('22%')
TextInput({
placeholder: '请再次输入签名密码',
text: $$this.pwd2,
}).width('70%')
.maxLength(6)
.type(InputType.NUMBER_PASSWORD)
}.margin({ top: 20 })

Flex({ alignItems: ItemAlign.Center }) {
Checkbox({ name: 'checkbox1', group: 'checkboxGroup' })
.shape(CheckBoxShape.ROUNDED_SQUARE)
.selectedColor(0x39a2db)
.onChange((value: boolean) => {
console.info('Checkbox1 change is' + value)
this.checkAgreement = value
})
.mark({
strokeColor: Color.Black,
size: 50,
strokeWidth: 5
})
.width(30)
.height(30)
ForEach(this.agreementModel?.list, (item: AgreementItem, index) => {
Text(`${index === 0 ? '' : '、'}《${item.agreementName}》`)
.fontSize(13)
.fontColor('#0089FF')
.onClick(() => {
XWebHelper.openWeb({
url: item.agreementUrl,
title: item.agreementName,
})
})
})
}.margin({ top: 20 })
.visibility(this.showAgreement ? Visibility.Visible : Visibility.None)

Button('确定', { stateEffect: true, type: ButtonType.Capsule, buttonStyle: ButtonStyleMode.EMPHASIZED })
.width('40%')
.fontColor('#ffffff')
.height(40)
.onClick(() => {
if (!this.userId) {
ToolsHelper.showMessage('验证码获取可能存在异常,请重新获取后再试。')
return
}
if (!this.verifyCode) {
ToolsHelper.showMessage('请输入验证码')
return
}
if (!GlobalValue.getInstance().userId) {
ToolsHelper.showMessage('请先获取验证码')
return
}
if (!this.pwd || !this.pwd2 || this.pwd !== this.pwd2) {
ToolsHelper.showMessage('请输入签名密码')
return
}
if (!this.checkAgreement && this.showAgreement) {
ToolsHelper.showMessage('请阅读并同意相关协议')
return
}
ApiUtils.post<CertDownModel>(certDown, new DownBean(this.verifyCode, GlobalValue.getInstance()
.userId!, encodeByRsa(this.pwd)))
.then((res: CertDownModel) => {
console.log('>>>>>', JSON.stringify(res))
this.isCancel = false
if (res.stamp) {
GlobalValue.getInstance().stampPic = res.stamp
} else {
GlobalValue.getInstance().stampPic = null
}
GlobalValue.getInstance().userId = res.userId
GlobalValue.getInstance().certClientId = GlobalValue.getInstance().getClientId()!!
GlobalValue.getInstance().certPhone = this.phone
GlobalValue.getInstance().certEnvUrl = GlobalValue.getInstance().envUrl
router.back()
}).catch((error: Error) => {
console.log('>>>>>', JSON.stringify(error.message))
ToolsHelper.showMessage(error.message)
})
})
.margin({ top: 30 })
}.padding({ left: 15, right: 15 }).width('100%').height('100%')
}.width('100%').height('100%')
}
}

+ 14
- 0
src/main/ets/pages/PinView.ets Zobrazit soubor

@@ -0,0 +1,14 @@
import { WindowHelper } from '@szyx/sdk_base/Index'

@Entry
@Component
export struct PinView {
build() {
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
})
}
}

+ 48
- 0
src/main/ets/public/BJCASDK.ets Zobrazit soubor

@@ -0,0 +1,48 @@
import { CaManager } from './CaManager'
import { SettingManager } from './SettingManager'
import { SignManager } from './SignManager'

/**
* 数字医信签名sdk,入口
*/
export class BJCASDK {
// 是否实例的标志
private static instance1: SettingManager | null = null
private static instance2: CaManager | null = null
private static instance3: SignManager | null = null

/**
* 设置管理
* @returns
*/
static settingManager() {
// 判断系统是否已经有单例了
if (BJCASDK.instance1 === null) {
BJCASDK.instance1 = new SettingManager()
}
return BJCASDK.instance1
}

/**
* 证书管理
* @returns
*/
static certManager() {
// 判断系统是否已经有单例了
if (BJCASDK.instance2 === null) {
BJCASDK.instance2 = new CaManager()
}
return BJCASDK.instance2
}
/**
* 签名管理
* @returns
*/
static signManager() {
// 判断系统是否已经有单例了
if (BJCASDK.instance3 === null) {
BJCASDK.instance3 = new SignManager()
}
return BJCASDK.instance3
}
}

+ 83
- 0
src/main/ets/public/CaManager.ets Zobrazit soubor

@@ -0,0 +1,83 @@
import { CallBackForData, CallBackMsg } from './callBack/BJCACallMsg';
import { BackManager } from '../manager/BackManager';
import { UserInfoModel } from './bean/UserInfoModel';
import { CaManagerReal } from '../manager/CaManagerReal';

export class CaManager {
/**
* 证书是否存在
* @param phone
* @returns
*/
public existsCert(phone?: string): boolean {

return CaManagerReal.existsCert(phone)
}

/**
* 下证
* @param phone
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL)
*/
public certDown(phone: string, mFirmId: string | undefined, listener: (result: CallBackMsg) => void) {
CaManagerReal.certDown(phone, mFirmId, listener)
}

/**
* 更新证书
* @param phone
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_UPDATE|CERT_NOT_EXISTS)
*/
public certUpdate(phone: string, mFirmId: string | undefined, listener: (result: CallBackMsg) => void) {
CaManagerReal.certUpdate(phone, mFirmId, listener)
}

/**
* 重置pin码
* @param mFirmId
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_EXISTS)
*/
public certResetPin(mFirmId: string | undefined, listener: (result: CallBackMsg) => void) {
CaManagerReal.certResetPin(mFirmId, listener)
}

/**
* 清除本地证书
* @param phone
* @param listener 操作完成
*/
public certClear(listener?: () => void) {
CaManagerReal.certClear(listener)
}

/**
* 获取签章图片
* @param listener BJCACallMsg.SUCCESS.code & base64 || BJCACallMsg.FAILED.code
*/
public drawStamp(phone: string, listener: (result: CallBackForData<string>) => void) {
CaManagerReal.drawStamp(phone, listener)
}

/**
* 显示证书页面
* @param phone
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|ROUTER|SUCCESS|CANCEL|CERT_NOT_EXISTS|ERROR_CERT_INFO)
*/
public showCertPage(phone: string, listener: (result: CallBackMsg) => void) {
CaManagerReal.showCertPage(phone, listener)
}

/**
* 获取用户信息
* @param phone
* @param listener BJCACallMsg.(NOT_CLIENT|NOT_PHONE|CERT_NOT_EXISTS)||BJCACallMsg.SUCCESS.code & base64 || BJCACallMsg.FAILED.code
*/
public getUserInfo(phone: string, listener: (result: CallBackForData<UserInfoModel>) => void) {
CaManagerReal.getUserInfo(phone, listener)

if (!BackManager.get().checkParams(phone, listener)) {
return
}

}
}

+ 77
- 0
src/main/ets/public/SettingManager.ets Zobrazit soubor

@@ -0,0 +1,77 @@
import { EnvEnum } from '../enum/EnvEnum'
import { SettingManagerReal } from '../manager/SettingManagerReal'


export class SettingManager {
/**
* 初始化方法,不调用的话,无法获取本地clientId
*
*/
public init() {
SettingManagerReal.init()
}

/**
* 获取当前sdk版本号,独立维护
* @returns
*/
public getVersion(): string {
return SettingManagerReal.getVersion()
}

/**
* 设置运行环境
* @param envType
*/
public setServerEnvType(envType: EnvEnum) {
SettingManagerReal.setServerEnvType(envType)
}

/**
* 获取当前运行环境
* @returns
*/
public getServerEnvType(): EnvEnum {
return SettingManagerReal.getServerEnvType()
}

/**
* 获取当前运行环境的url
* @returns
*/
public getServerEnvUrl(): string {
return SettingManagerReal.getServerEnvUrl()
}

/**
* 设置厂商id
* @param clientId
*/
public setClientId(clientId: string) {
SettingManagerReal.setClientId(clientId)
}

/**
* 获取当前厂商id
* @returns
*/
public getClientId(): string | undefined {
return SettingManagerReal.getClientId()
}

/**
* 根据url,获取对应环境信息
* @param rul
*/
public getEnvTypeByUrl(url: string): EnvEnum {
return SettingManagerReal.getEnvTypeByUrl(url)
}

/**
* 根据环境信息,获取url
* @param envType
*/
public getUrlByEnvType(envType: EnvEnum): string {
return SettingManagerReal.getUrlByEnvType(envType)
}
}

+ 73
- 0
src/main/ets/public/SignManager.ets Zobrazit soubor

@@ -0,0 +1,73 @@
import { SignManagerReal } from '../manager/SignManagerReal';
import { List } from '@kit.ArkTS';
import { XDialogController } from '@szyx/sdk_base/Index';
import { CallBackForData } from './callBack/BJCACallMsg';
import { SignModel } from './bean/SignModel';

export class SignManager {
dialogController: XDialogController = {} as XDialogController

/**
* 开始签名
* @param uniqueIdList 待签数据
* @param listener
*/
public signWithFirmId(uniqueIdList: List<string> | Array<string>, listener: (result: CallBackForData<Array<SignModel>>) => void) {

SignManagerReal.signWithFirmId(uniqueIdList, listener)

}

/**
* 开启免密签名
* @param keepDay 开启天数,1-60
* @param listener
*/
public keepPin(keepDay: number, listener: (result: CallBackForData<string>) => void) {

SignManagerReal.keepPin(keepDay, listener)

}

/**
* 查询免密签名开启状态
* @returns 是否已开启
*/
public isPinExempt(): boolean {
return SignManagerReal.isPinExempt()
}

/**
* 关闭免密签名
*
*/
public clearPin(listener: () => void) {
SignManagerReal.clearPin(listener)
}

/**
* 开启自动签
* @param sysTag 开启系统标识
* @param listener
*/
public signForSignAuto(sysTag: string, listener: (result: CallBackForData<string>) => void) {
SignManagerReal.signForSignAuto(sysTag, listener)
}

/**
* 关闭自动签
* @param sysTag 开启系统标识
* @param listener
*/
public stopSignAuto(sysTag: string | undefined, listener: (result: CallBackForData<string>) => void) {
SignManagerReal.stopSignAuto(sysTag, listener)
}

/**
* 获取自动签信息
* @param listener
*/
public getSignAutoInfo(listener: (result: CallBackForData<string>) => void) {
SignManagerReal.getSignAutoInfo(listener)
}
}

+ 3
- 0
src/main/ets/public/bean/SignModel.ets Zobrazit soubor

@@ -0,0 +1,3 @@
export interface SignModel {
fileUniqueId: string
}

+ 14
- 0
src/main/ets/public/bean/UserInfoModel.ets Zobrazit soubor

@@ -0,0 +1,14 @@
export interface UserInfoModel {
certUpdateTipDay: number
deviceId: string
enableCert: boolean
endDate: string
idCardNum: string
idCardType: string
nowDate: string
openId: string
phoneNum: string
picUrl: string
startDate: string
userName: string
}

+ 82
- 0
src/main/ets/public/callBack/BJCACallMsg.ets Zobrazit soubor

@@ -0,0 +1,82 @@
import { UserInfoModel } from '../bean/UserInfoModel'

export interface CallBackMsg {
code: number
msg: string
}

export interface CallBackForData<T> {
code: number
msg: string
data?: T
}

export class BJCACallMsg {
//通用
public static SUCCESS: CallBackMsg = {
code: 1001,
msg: '操作完成'
}
public static CANCEL: CallBackMsg = {
code: 1002,
msg: '用户取消操作'
}
public static FAILED: CallBackMsg = {
code: 1003,
msg: '用户操作失败'
}
public static UNKOWN: CallBackMsg = {
code: 1004,
msg: '未知错误'
}
public static ROUTER: CallBackMsg = {
code: 1005,
msg: '路由错误'
}
public static ILLEGALITY: CallBackMsg = {
code: 1006,
msg: '参数不合法'
}
public static NOT_CLIENT: CallBackMsg = {
code: 10001,
msg: '厂商id不存在'
}
public static NOT_PHONE: CallBackMsg = {
code: 10002,
msg: '手机号格式错误'
}
// 证书相关
public static CERT_NOT_EXISTS: CallBackMsg = {
code: 10003,
msg: '证书不存在'
}
public static CERT_EXISTS: CallBackMsg = {
code: 1001,
msg: '证书存在'
}
public static SUCCESS_CERT_INFO: CallBackForData<UserInfoModel> = {
code: 1001,
msg: '获取证书信息成功'
}
public static ERROR_CERT_INFO: CallBackForData<UserInfoModel> = {
code: 10004,
msg: '获取证书信息失败'
}
public static CERT_NOT_UPDATE: CallBackForData<UserInfoModel> = {
code: 10005,
msg: '证书未到可更新时间'
}
// 签名相关
public static SIGN_CANCEL: CallBackForData<string> = {
code: 1002,
msg: '用户取消操作'
}
public static SIGN_SUCCESS: CallBackForData<string> = {
code: 1001,
msg: '操作完成'
}
public static SIGN_SUCCESS_REST: CallBackForData<string> = {
code: 10011,
msg: '重置密码'
}
}

+ 263
- 0
src/main/ets/public/sign/PinDialog.ets Zobrazit soubor

@@ -0,0 +1,263 @@
import { XDialogCommon, XDialogController } from '@szyx/sdk_base/Index'
import { SignManagerReal } from '../../manager/SignManagerReal'
import { BJCASDK } from '../BJCASDK'
import { BJCACallMsg, CallBackMsg } from '../callBack/BJCACallMsg'

@Preview
@Component
export struct PinDialog {
controller: XDialogController | null = null
private dialogController: CustomDialogController | null = null
@State list: Array<string> = new Array()

build() {
// this.buildContent()
}

aboutToAppear(): void {
this.list = []

this.dialogController = new CustomDialogController({
builder: XDialogCommon({
dialogContent: () => {
this.buildContent()
},
}),
alignment: DialogAlignment.Bottom,
autoCancel: true,
customStyle: true,
cancel: () => {
SignManagerReal.listener && SignManagerReal.listener(BJCACallMsg.SIGN_CANCEL)
}
})
if (this.controller) {
this.controller.open = () => {
this.list = []
this.dialogController?.open()
}
this.controller.close = () => {
this.list = []
this.dialogController?.close()
}
}
}

private addNum(num: string) {
this.list.push(num)
if (this.list.length === 6) {
SignManagerReal.listener && SignManagerReal.listener({
code: 1001,
msg: '操作完成',
data: this.list.join('')
})
this.dialogController?.close()
}
}

@Builder
buildContent() {
Column() {
Text('请输入6位数字密码')
.fontSize(16)
.textAlign(TextAlign.Center)
.width('100%')
.height(60)
Row() {
Column() {
Circle().width(13).height(13).visibility(this.list.length >= 1 ? Visibility.Visible : Visibility.Hidden)
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center)

Divider().strokeWidth(1).color('#DDDDDD').vertical(true)
Column() {
Circle().width(13).height(13).visibility(this.list.length >= 2 ? Visibility.Visible : Visibility.Hidden)
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center)

Divider().strokeWidth(1).color('#DDDDDD').vertical(true)
Column() {
Circle().width(13).height(13).visibility(this.list.length >= 3 ? Visibility.Visible : Visibility.Hidden)
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center)

Divider().strokeWidth(1).color('#DDDDDD').vertical(true)
Column() {
Circle().width(13).height(13).visibility(this.list.length >= 4 ? Visibility.Visible : Visibility.Hidden)
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center)

Divider().strokeWidth(1).color('#DDDDDD').vertical(true)
Column() {
Circle().width(13).height(13).visibility(this.list.length >= 5 ? Visibility.Visible : Visibility.Hidden)
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center)

Divider().strokeWidth(1).color('#DDDDDD').vertical(true)
Column() {
Circle().width(13).height(13).visibility(this.list.length >= 6 ? Visibility.Visible : Visibility.Hidden)
}.width('16.65%').height('100%').justifyContent(FlexAlign.Center)
}.height(48).border({
width: 1,
color: '#DDDDDD'
}).margin({
left: 10,
right: 10,
top: 30
})

Text('忘记密码?')
.width('100%')
.margin({ top: 12, right: 10 })
.textAlign(TextAlign.End)
.fontSize(10)
.fontColor('#18ABFB')
.onClick(() => {
BJCASDK.certManager().certResetPin(undefined, (result: CallBackMsg) => {
if (result.code === BJCACallMsg.SUCCESS.code) {
SignManagerReal.listener && SignManagerReal.listener(BJCACallMsg.SIGN_SUCCESS_REST)
} else {
SignManagerReal.listener && SignManagerReal.listener(result)
}
})
})


Divider().strokeWidth(0.5).color('#DDDDDD').margin({
top: 30
})
Row() {
Text('1')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('1')
})
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true)
Text('2')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('2')
})
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true)
Text('3')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('3')
})
}.height(55)

Divider().strokeWidth(0.5).color('#DDDDDD')
Row() {
Text('4')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('4')
})
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true)
Text('5')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('5')
})
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true)
Text('6')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('6')
})
}.height(55)

Divider().strokeWidth(0.5).color('#DDDDDD')
Row() {
Text('7')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('7')
})
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true)
Text('8')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('8')
})
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true)
Text('9')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('9')
})
}.height(55)

Divider().strokeWidth(0.5).color('#DDDDDD')
Row() {
Text()
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.backgroundColor('#E3E7EE')
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true)
Text('0')
.width('33.33%')
.height('100%')
.textAlign(TextAlign.Center)
.fontSize(30)
.fontColor('#333333')
.onClick(() => {
this.addNum('0')
})
Divider().strokeWidth(0.5).color('#DDDDDD').vertical(true)
Column() {
Text('X')
.width(24)
.height(24)
.textAlign(TextAlign.Center)
.fontSize(18)
.fontColor('#999999')
.backgroundColor('#FFFFFF')
}
.width('33.33%')
.height('100%')
.justifyContent(FlexAlign.Center)
.backgroundColor('#E3E7EE')
.onClick(() => {
this.list.pop()
})
}.height(55)

}
.width('100%')
.backgroundColor('#ffffff')
}
}

+ 170
- 0
src/main/ets/util/base64Util.js Zobrazit soubor

@@ -0,0 +1,170 @@
/* eslint-disable no-useless-escape */
/*************************************************************************************************
* <pre>
* @包路径:
* @版权所有: 北京数字医信科技有限公司 (C) 2019
*
* @类描述:
* @版本: V3.2.0
* @作者 daizhenhong
* @创建时间 2019/6/4 3:30 PM
*
* @修改记录:
-----------------------------------------------------------------------------------------------
----------- 时间 | 修改人 | 修改的方法 | 修改描述 ---------------
-----------------------------------------------------------------------------------------------
</pre>
************************************************************************************************/

/*
* base64编码(编码,配合encodeURIComponent使用)
* @parm : str 传入的字符串
* 使用:
1、引入util.js(路径更改) :const util = require('../../utils/util.js');
2、util.base64_encode(util.utf16to8('base64 编码'));
*/
function base64Encode (str) {
// 下面是64个基本的编码
let base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
let out, i, len
let c1, c2, c3
len = str.length
i = 0
out = ''
while (i < len) {
c1 = str.charCodeAt(i++) & 0xff
if (i === len) {
out += base64EncodeChars.charAt(c1 >> 2)
out += base64EncodeChars.charAt((c1 & 0x3) << 4)
out += '=='
break
}
c2 = str.charCodeAt(i++)
if (i === len) {
out += base64EncodeChars.charAt(c1 >> 2)
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4))
out += base64EncodeChars.charAt((c2 & 0xF) << 2)
out += '='
break
}
c3 = str.charCodeAt(i++)
out += base64EncodeChars.charAt(c1 >> 2)
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4))
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6))
out += base64EncodeChars.charAt(c3 & 0x3F)
}
return out
}

/*
* base64编码(编码,配合encodeURIComponent使用)
* @parm : str 传入的字符串
*/
function utf16to8 (str) {
let out, i, len, c
out = ''
len = str.length
for (i = 0; i < len; i++) {
c = str.charCodeAt(i)
if ((c >= 0x0001) && (c <= 0x007F)) {
out += str.charAt(i)
} else if (c > 0x07FF) {
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F))
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F))
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F))
} else {
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F))
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F))
}
}
return out
}

/*
* base64解码(配合decodeURIComponent使用)
* @parm : input 传入的字符串
* 使用:
1、引入util.js(路径更改) :const util = require('../../utils/util.js');
2、util.base64_decode('YmFzZTY0IOe8lueggQ==');
*/
function base64Decode (input) {
let base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
let output = ''
let chr1, chr2, chr3
let enc1, enc2, enc3, enc4
let i = 0
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '')
while (i < input.length) {
enc1 = base64EncodeChars.indexOf(input.charAt(i++))
enc2 = base64EncodeChars.indexOf(input.charAt(i++))
enc3 = base64EncodeChars.indexOf(input.charAt(i++))
enc4 = base64EncodeChars.indexOf(input.charAt(i++))
chr1 = (enc1 << 2) | (enc2 >> 4)
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2)
chr3 = ((enc3 & 3) << 6) | enc4
output = output + String.fromCharCode(chr1)
if (enc3 !== 64) {
output = output + String.fromCharCode(chr2)
}
if (enc4 !== 64) {
output = output + String.fromCharCode(chr3)
}
}
return utf8Decode(output)
}

/*
* utf-8解码
* @parm : utftext 传入的字符串
*/
function utf8Decode (utftext) {
let string = ''
let i = 0
let c = 0
let c1 = 0
let c2 = 0
while (i < utftext.length) {
c = utftext.charCodeAt(i)
if (c < 128) {
string += String.fromCharCode(c)
i++
} else if ((c > 191) && (c < 224)) {
c1 = utftext.charCodeAt(i + 1)
string += String.fromCharCode(((c & 31) << 6) | (c1 & 63))
i += 2
} else {
c1 = utftext.charCodeAt(i + 1)
c2 = utftext.charCodeAt(i + 2)
string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63))
i += 3
}
}
return string
}

/*
* base64编码函数封装
* @parm: str(传入要编成base64的内容)
* 使用:
1、引入util.js(路径更改) :const util = require('../../utils/util.js');
2、util.baseEncode('base64 编码');
*/
function baseEncode (str) {
return base64Encode(utf16to8(str))
}

/*
* base64解码函数封装
* @parm: str(传入要解为正常字体)
* 使用:
1、引入util.js(路径更改) :const util = require('../../utils/util.js');
2、util.baseDecode(util.baseEncode('base64 编码'))
*/
function baseDecode (str) {
return base64Decode(str)
}// 抛出函数使用

export {
baseEncode,
baseDecode
}

+ 9
- 0
src/main/ets/util/encodeUtil.js Zobrazit soubor

@@ -0,0 +1,9 @@
import {JSEncrypt} from './jsencryp.js'
// 医网信公钥,用于数据加密
const rsa_public_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsLnkJaVr5hdNlqPNhU+YW4LctrwuDCeUb+GHS\nPNd/g83nNGibYWqNmYgyVw2jZPTDNrZDw/piWhPsV9iWY0Ie6zuUbrKRQEWBEuQxXhEoRv92nw1B\nWzd7vvOk63Xss7iWqLn8PvE6a4OJC90mWPDQFfiLl49SYbK5QvfD5lY5TQIDAQAB'

export function encodeByRsa(origin) {
let jsEncrypt = new JSEncrypt();
jsEncrypt.setPublicKey(rsa_public_key)
return jsEncrypt.encrypt(origin)
}

+ 5385
- 0
src/main/ets/util/jsencryp.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 257
- 0
src/main/ets/util/md5.js Zobrazit soubor

@@ -0,0 +1,257 @@
/*
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*/

/*
* Configurable variables. You may need to tweak these to be compatible with
* the server-side, but the defaults work in most cases.
*/
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */

/*
* These are the functions you'll usually want to call
* They take string arguments and return either hex or base-64 encoded strings
*/
//32位小写
export function md5_hex(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
export function md5_b64(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
export function md5_str(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
export function md5_hex_hmac(key, data) { return binl2hex(core_hmac_md5(key, data)); }
export function md5_b64_hmac(key, data) { return binl2b64(core_hmac_md5(key, data)); }
export function md5_str_hmac(key, data) { return binl2str(core_hmac_md5(key, data)); }

/*
* Perform a simple self-test to see if the VM is working
*/
function md5_vm_test()
{
return md5_hex("abc") == "900150983cd24fb0d6963f7d28e17f72";
}

/*
* Calculate the MD5 of an array of little-endian words, and a bit length
*/
function core_md5(x, len)
{
/* append padding */
x[len >> 5] |= 0x80 << ((len) % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;

var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;

for(var i = 0; i < x.length; i += 16)
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;

a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);

a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

a = safe_add(a, olda);
b = safe_add(b, oldb);
c = safe_add(c, oldc);
d = safe_add(d, oldd);
}
return Array(a, b, c, d);

}

/*
* These functions implement the four basic operations the algorithm uses.
*/
function md5_cmn(q, a, b, x, s, t)
{
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
* Calculate the HMAC-MD5, of a key and some data
*/
function core_hmac_md5(key, data)
{
var bkey = str2binl(key);
if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);

var ipad = Array(16), opad = Array(16);
for(var i = 0; i < 16; i++)
{
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}

var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
return core_md5(opad.concat(hash), 512 + 128);
}

/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
function safe_add(x, y)
{
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}

/*
* Bitwise rotate a 32-bit number to the left.
*/
function bit_rol(num, cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}

/*
* Convert a string to an array of little-endian words
* If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
*/
function str2binl(str)
{
var bin = Array();
var mask = (1 << chrsz) - 1;
for(var i = 0; i < str.length * chrsz; i += chrsz)
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
return bin;
}

/*
* Convert an array of little-endian words to a string
*/
function binl2str(bin)
{
var str = "";
var mask = (1 << chrsz) - 1;
for(var i = 0; i < bin.length * 32; i += chrsz)
str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
return str;
}

/*
* Convert an array of little-endian words to a hex string.
*/
function binl2hex(binarray)
{
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var str = "";
for(var i = 0; i < binarray.length * 4; i++)
{
str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
}
return str;
}

/*
* Convert an array of little-endian words to a base-64 string
*/
function binl2b64(binarray)
{
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var str = "";
for(var i = 0; i < binarray.length * 4; i += 3)
{
var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
| (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
| ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
for(var j = 0; j < 4; j++)
{
if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
}
}
return str;
}

+ 12
- 0
src/main/module.json5 Zobrazit soubor

@@ -0,0 +1,12 @@
{
"module": {
"name": "sdk_ywx",
"type": "har",
"deviceTypes": [
"phone"
],
"description": "签名sdk",
"requestPermissions": [
]
}
}

+ 12
- 0
src/main/resources/base/element/string.json Zobrazit soubor

@@ -0,0 +1,12 @@
{
"string": [
{
"name": "page_show",
"value": "page from package"
},
{
"name": "mo_ywx_module_cert_title",
"value": "医网信数字证书"
}
]
}

binární
src/main/resources/base/media/mo_ywx_icon_title.png Zobrazit soubor

Před Za
Šířka: 100  |  Výška: 84  |  Velikost: 4.5KB

binární
src/main/resources/base/media/mo_ywx_module_bg_cert.png Zobrazit soubor

Před Za
Šířka: 675  |  Výška: 982  |  Velikost: 472KB

binární
src/main/resources/base/media/mo_ywx_module_icon_stamp.png Zobrazit soubor

Před Za
Šířka: 160  |  Výška: 160  |  Velikost: 15KB

+ 6
- 0
src/main/resources/base/profile/main_pages.json Zobrazit soubor

@@ -0,0 +1,6 @@
{
"src": [
"pages/PinView",
"pages/CertDetails"
]
}

+ 12
- 0
src/main/resources/en_US/element/string.json Zobrazit soubor

@@ -0,0 +1,12 @@
{
"string": [
{
"name": "page_show",
"value": "page from package"
},
{
"name": "mo_ywx_module_cert_title",
"value": "Digital certificate"
}
]
}

+ 12
- 0
src/main/resources/zh_CN/element/string.json Zobrazit soubor

@@ -0,0 +1,12 @@
{
"string": [
{
"name": "page_show",
"value": "page from package"
},
{
"name": "mo_ywx_module_cert_title",
"value": "医网信数字证书"
}
]
}

+ 5
- 0
src/test/List.test.ets Zobrazit soubor

@@ -0,0 +1,5 @@
import localUnitTest from './LocalUnit.test';

export default function testsuite() {
localUnitTest();
}

+ 33
- 0
src/test/LocalUnit.test.ets Zobrazit soubor

@@ -0,0 +1,33 @@
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium';

export default function localUnitTest() {
describe('localUnitTest',() => {
// Defines a test suite. Two parameters are supported: test suite name and test suite function.
beforeAll(() => {
// Presets an action, which is performed only once before all test cases of the test suite start.
// This API supports only one parameter: preset action function.
});
beforeEach(() => {
// Presets an action, which is performed before each unit test case starts.
// The number of execution times is the same as the number of test cases defined by **it**.
// This API supports only one parameter: preset action function.
});
afterEach(() => {
// Presets a clear action, which is performed after each unit test case ends.
// The number of execution times is the same as the number of test cases defined by **it**.
// This API supports only one parameter: clear action function.
});
afterAll(() => {
// Presets a clear action, which is performed after all test cases of the test suite end.
// This API supports only one parameter: clear action function.
});
it('assertContain', 0, () => {
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
let a = 'abc';
let b = 'b';
// Defines a variety of assertion methods, which are used to declare expected boolean conditions.
expect(a).assertContain(b);
expect(a).assertEqual(a);
});
});
}

Načítá se…
Zrušit
Uložit