UNPKG

dotwallet

Version:
270 lines (269 loc) 10.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const dwUser_1 = require("./dwUser"); const web_request_1 = __importDefault(require("web-request")); const dwCom_1 = require("./dwCom"); var DomainOption; (function (DomainOption) { DomainOption["CN"] = "https://www.ddpurse.com"; DomainOption["HK"] = "https://overseas.ddpurse.com"; })(DomainOption = exports.DomainOption || (exports.DomainOption = {})); class DWMerchant { constructor(appID, secret, opts) { this.m_users = []; this.m_mapUsers = new Map(); this.m_depositCoinType = dwCom_1.SupportCoinType.BSV; this.m_depositAddress = ''; this.m_appID = appID; this.m_secret = secret; const defaultOpts = { redirectURI: '', noticeURI: '', checkOrderURI: '', receiveAddress: '', merchantName: '', timeOut: 5000, isMobile: false, domain: DomainOption.CN }; opts = opts || defaultOpts; this.m_redirectURI = opts.redirectURI || ''; this.m_noticeURI = opts.noticeURI || ''; this.m_checkOrderURI = opts.checkOrderURI || ''; this.m_merchantName = opts.merchantName || "unkown"; this.m_receiveAddr = opts.receiveAddress || ''; this.m_timeout = opts.timeOut || 5000; DWMerchant.DotWalletOpenURL = opts.domain || defaultOpts.domain; this.m_opts = opts; this.initInerval(); } async initInerval() { let userMap = this.m_mapUsers; setInterval(async function () { for (let value of userMap) { let user = value[1]; await user.RefreshAccessToken(); } }, 7200 * 1000); } GetAuthURL() { const getAuthURL = new URL("openapi/get_code", DWMerchant.DotWalletOpenURL); getAuthURL.searchParams.append('app_id', this.m_appID); getAuthURL.searchParams.append('redirect_uri', this.m_redirectURI); return getAuthURL.href; } GetMircoPaymentURL() { const getURL = new URL("openapi/set_pay_config", DWMerchant.DotWalletOpenURL); getURL.searchParams.append('app_id', this.m_appID); getURL.searchParams.append('redirect_uri', this.m_redirectURI); return getURL.href; } GetUserPayURL(orderSN) { let getURL; if (this.m_opts.isMobile) { getURL = new URL("wallet/open/pay", DWMerchant.DotWalletOpenURL); } else { getURL = new URL("desktop/open/order", DWMerchant.DotWalletOpenURL); } getURL.searchParams.append('order_sn', orderSN); return getURL.href; } async mpiFeeQuote() { const orderURL = new URL("openapi/mapi/feeQuote", DWMerchant.DotWalletOpenURL); const rsp = await web_request_1.default.get(orderURL.href, { timeout: this.m_timeout, headers: { token: DWMerchant.feeToken } }); return JSON.parse(rsp.content); } async mpiTxQuery(txid) { const orderURL = new URL(`openapi/mapi/tx/${txid}`, DWMerchant.DotWalletOpenURL); const rsp = await web_request_1.default.get(orderURL.href, { timeout: this.m_timeout, headers: { token: DWMerchant.feeToken } }); return JSON.parse(rsp.content); } async mpiSendTx(rawtx) { const orderURL = new URL(`openapi/mapi/tx`, DWMerchant.DotWalletOpenURL); const rsp = await web_request_1.default.post(orderURL.href, { timeout: this.m_timeout, headers: { token: DWMerchant.feeToken, 'Content-Type': 'application/json', } }, JSON.stringify({ rawtx: rawtx })); return JSON.parse(rsp.content); } /** * 创建订单号,并返回用户授权URL * @param orderSN * @param itemName * @param payAmount * @param opreturnHex * @param receiveAddress * @returns redirect url * <a href="https://www.ddpurse.com/desktop/open/order?order_sn=948a19d6b779b2abcfd21c0fa0a9a615">https://www.ddpurse.com/desktop/open/order?order_sn=948a19d6b779b2abcfd21c0fa0a9a615</a> */ async CreateOrder(orderSN, itemName, payAmount, opreturnHex, receiveAddress) { //todo, check payAmount >= dust , //todo,check receiveAddress. //todo, add money type support. let recvMuti = [{ address: receiveAddress || this.m_receiveAddr, amount: payAmount }]; return await this.CreateOrderMuti(orderSN, itemName, payAmount, recvMuti, opreturnHex); } async CreateOrderMuti(orderSN, itemName, payAmount, receiveMuti, opreturnHex) { let order = { app_id: this.m_appID, merchant_order_sn: orderSN, item_name: itemName, order_amount: payAmount, nonce_str: new Date().getTime().toString(), sign: '', notice_uri: this.m_noticeURI, redirect_uri: this.m_redirectURI, check_order_uri: this.m_checkOrderURI, opreturn: opreturnHex, receive_address: JSON.stringify(receiveMuti), }; order.sign = dwCom_1.CreateSignature(order, this.m_secret); const orderURL = new URL("openapi/order", DWMerchant.DotWalletOpenURL); const rsp = await web_request_1.default.post(orderURL.href, { timeout: this.m_timeout, headers: { 'Content-Type': 'application/json', } }, JSON.stringify(order)); const result = JSON.parse(rsp.content); return result; } //please call this function when user redirect from dotwallet async AddUser(code, userName) { let newUser = new dwUser_1.DWUser(this, userName); await newUser.GetAccessCode(code); await newUser.GetUserInfo(); this.m_mapUsers.set(userName, newUser); } GetUser(userName) { return this.m_mapUsers.get(userName); } //---------------------mirco payment 小额支付相关----------------------------------- /** * 小额支持订单接口 * @param userName * @param orderSN * @param payAmount * @param opreturnHex * @param receiveAddress */ async CreateMircoOrder(userName, orderSN, payAmount, opreturnHex, receiveAddress) { let user = this.m_mapUsers.get(userName); return await user.CreateMircoOrder(orderSN, payAmount, opreturnHex, receiveAddress); } /** * 根据订单号查询小额支付订单详情 * @param orderSN */ async QueryMircoOrder(orderSN) { const orderURL = new URL("openapi/search_order", DWMerchant.DotWalletOpenURL); const rsp = await web_request_1.default.create(orderURL.href, { timeout: this.m_timeout, method: 'POST' }, { app_id: this.m_appID, secret: this.m_secret, merchant_order_sn: orderSN, }).response; const result = rsp.content; let rst = result.data; return rst; } //----------------------push chain data,托管账户数据上链接口--------------------------------------------- async pushChainCommon(url, req) { var rsp = await web_request_1.default.post(url, { timeout: this.m_timeout, method: 'POST', headers: { 'Content-Type': 'application/json', appid: this.m_appID, appsecret: this.m_secret, } }, JSON.stringify(req)); const result = JSON.parse(rsp.content); if (result.code < 0) { throw new dwCom_1.DWError(result.code, result.msg); } return result.data; } /** * 查询托管账户余额接口 */ async DepositBalance() { const durl = new URL("openapi/getDepositBalance", DWMerchant.DotWalletOpenURL); let result = await this.pushChainCommon(durl.href, { coinType: dwCom_1.SupportCoinType.BSV, }); return result; } /** * 获取托管账户信息,主要是托管账户地址,用户需要往该地址充值,数据上链的手续费从该地址扣除 */ async DepositAddress() { const durl = new URL("openapi/newDepositAccount", DWMerchant.DotWalletOpenURL); let result = await this.pushChainCommon(durl.href, { coinType: dwCom_1.SupportCoinType.BSV, }); this.m_depositAddress = result.address; return this.m_depositAddress; } /** * 数据上链接口 * @param opreturn */ async PushChainData(opreturn) { const durl = new URL("openapi/pushChainData", DWMerchant.DotWalletOpenURL); let result = await this.pushChainCommon(durl.href, { coinType: dwCom_1.SupportCoinType.BSV, opreturn: opreturn, }); return result; } } exports.DWMerchant = DWMerchant; DWMerchant.DotWalletOpenURL = DomainOption.CN; DWMerchant.feeToken = "561b756d12572020ea9a104c3441b71790acbbce95a6ddbf7e0630971af9424b"; /** * 非托管账户的数据上链服务 * @param email 打点钱包用户的email * @param signCallback 回调签名服务器 * @param opreturn 要上链的Opreturn */ async function PushChainData(email, signCallback, opreturn) { const durl = new URL("/api/pushChainData", DWMerchant.DotWalletOpenURL); var rsp = await web_request_1.default.post(durl.href, { method: 'POST', headers: { 'Content-Type': 'application/json', } }, JSON.stringify({ coinType: dwCom_1.SupportCoinType.BSV, email: email, opreturn: opreturn, signCallback: signCallback, })); const result = JSON.parse(rsp.content); if (result.code < 0) { throw new dwCom_1.DWError(result.code, result.msg); } return result.data; } exports.PushChainData = PushChainData;