dotwallet
Version:
A DotWallet helper library
270 lines (269 loc) • 10.2 kB
JavaScript
"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;