增加网页版内置钱包扫码登录的功能

This commit is contained in:
zhl 2023-03-02 17:01:01 +08:00
parent 6f6fdd52b9
commit 47c1c81ccb
6 changed files with 64 additions and 1 deletions

5
src/JCWallet.d.ts vendored
View File

@ -25,6 +25,11 @@ declare namespace jsb {
export function scanQRCode(id: number, title: string);
export function restoreKey(id: number, oid: string);
export function generateWallet(idHash: string, seedHash: string);
export function hexDeflate(str: string): string;
export function hexInflate(str: string): string;
export function encryptedLocalKey(pk: string): string;
export function walletEncrypt(str: string): string;
export function walletDecrypt(str: string): string;
export function prepareWallet(
idHash: string,
seedHash: string,

View File

@ -32,7 +32,6 @@ export function getWalletInfo() {
}
export function uploadWalletInfo(data) {
console.log("uploadWalletInfo: " + data);
const url = `${WALLET_API_HOST}/wallet/info`;
return POST_JSON(url, data);
}
@ -46,3 +45,8 @@ export function uploadUserCollection(data) {
const url = `${WALLET_API_HOST}/wallet/collection`;
return POST_JSON(url, data);
}
export function uploadInfoForWebLogin(data) {
const url = `${WALLET_API_HOST}/bridge/upload`;
return POST_JSON(url, data);
}

View File

@ -23,6 +23,7 @@ import { AllChains } from "./data/allchain";
import { IAccount, INFT, initAccount, initNFT } from "./data/DataModel";
import { singleton } from "./decorator/singleton.decorator";
import { saveData } from "./manage/DataManage";
import { parseUrl } from "./manage/SchemeManage";
import {
loadInternalWallet,
restoreWalletByMnemonic,
@ -42,6 +43,7 @@ import {
} from "./util/chain.util";
import { fromTokenMinimalUnit } from "./util/number.util";
import { buildLoginSignMsg, signLogin } from "./util/sign.util";
import { findUrlScheme } from "./util/string.util";
var global =
(typeof globalThis !== "undefined" && globalThis) ||
@ -661,6 +663,15 @@ export default class JCWallet {
}
return this.feeAddressMap.get(typeName);
}
public async scanQr(title: string) {
let result = (await this.nativeSvr.scanQRCode(title)) + "";
console.log("scan qr code: " + result);
if (result && result.indexOf("://") >= 0) {
await parseUrl(result);
}
return result;
}
}
// window.jc = window.jc || {wallet: new JCWallet()};

View File

@ -0,0 +1,17 @@
import { findUrlScheme } from "../util/string.util";
import { parseWebLogin } from "./WalletManage";
export function parseUrl(str: string) {
let scheme = findUrlScheme(str);
if (!scheme) {
return;
}
const dataStr = str.replace(scheme + "://", "");
switch (scheme) {
case "weblogin":
parseWebLogin(dataStr);
break;
default:
break;
}
}

View File

@ -9,6 +9,7 @@ import {
googleAuth,
tikTokAuth,
twitterAuth,
uploadInfoForWebLogin,
uploadWalletInfo,
} from "../api/WalletApi";
import { WalletEnv } from "../config/WalletEnv";
@ -140,3 +141,19 @@ export function walletSign(str: string) {
let result = jsb.walletSign(str);
return result;
}
export async function parseWebLogin(dataStr: string) {
console.log("found web login scheme, begin login");
if (dataStr.indexOf("|") < 0) {
return;
}
let datas = dataStr.split("|");
let webtoken = datas[0];
let pk64 = datas[1];
let pk = jsb.hexInflate(pk64);
let keyEncrypt = jsb.encryptedLocalKey(pk);
console.log("webtoken: " + webtoken);
console.log("local key: " + keyEncrypt);
let result = await uploadInfoForWebLogin({ key: keyEncrypt, webtoken });
console.log("login result: " + result);
}

9
src/util/string.util.ts Normal file
View File

@ -0,0 +1,9 @@
export const RE_URL_SCHEME = /^(.+?):\/\/.+?$/;
export function findUrlScheme(url: string) {
let result = url.match(RE_URL_SCHEME);
if (!result) {
return "";
}
return result[1];
}