Press on button "Edit Permissions" and add API Key Permissions:
Then on bot /setup command:
// Get your keys in https://www.coinpayments.net/index.php?cmd=acct_api_keysLibs.CoinPayments.setPrivateKey("YOUR KEY");Libs.CoinPayments.setPublicKey('YOUR KEY');// for Receiving Payments// Get your BB Api Key from Bots.Business App in ProfileLibs.CoinPayments.setBBApiKey('YOUR API KEY');
Yes, you can write it via Libs.CoinPayments.apiCallmethod too. But there is an easier way.
Command /pay
let amount =0.0001; // amount in BTCoptions = { fields: { amount: amount,// amount in BTC currency:"BTC",// currency1 = currency2 = BTC// currency1: "BTC", // The original currency of the transaction// currency2: "LTC" //The currency the buyer will be sending// buyer_email: "user@example.com",// you can use another fields also// except custom and ipn_url (it used by Lib)// See https://www.coinpayments.net/apidoc-create-transaction },// generated wallet, QR code, payment page// will be available in this command onSuccess:'/onCreatePayment',// on successful payment this command// will be executed onPaymentCompleted:"/onPaymentCompleted",// it is not necessary// onIPN: "/onIPN"// if you want customize error messages// onError: "/onError"}Libs.CoinPayments.createTransaction(options);
It is preferable to use method onPaymentCompleted and not method onIPN.
Since the method onPaymentCompleted completely covers the IPN and solves the problem with IPN Retries / Duplicate IPNs
Command /onCreatePayment
// You can inspect all options:// Bot.sendMessage(inspect(options));let result =options.result;let msg ="*Need pay:*\n `"+result.amount +"`"+"\n\n*to address:*\n"+"`"+result.address +"`"+"\n\n [Checkout]("+result.checkout_url +") | [Status]("+result.status_url +")"// you can uncomment this for manual status checking// + "\n\nCheck status manually: /check" + options.payment_index;Bot.sendMessage(msg);Api.sendPhoto({ photo:result.qrcode_url });
Command /onPaymentCompleted
This command will be executed on successful payment
Need install ResourcesLib
// you can inspect all options// Bot.sendMessage(inspect(options));if(!options){// for security we need to check that this command runned only by lib// user can not run command with optionsreturn}Bot.sendMessage("Payment completed");let amount =options.amount1;let res =Libs.ResourcesLib.userRes("balance");res.add(amount)Bot.sendMessage("added to balance, BTC: "+ amount);
Finished!
Now you can receive payments
Information about extra payments and refunds.
It is possible to define buyer email in fields for options (see code for command /pay )
Please note: CoinPayments do not send you extra payments. CoinPayments send just email to buyer (or you) about refund for that extra.
Also no any information about such extra in CP Panel or IPN. Be careful
Additional Information
You can check payment status
Libs.CoinPayments.getTxInfo({ payment_index: payment_index,// see /onCreatePayment command.// Need pass this payment_index to this command onSuccess:'/on_txn_id'})
command: /on_txn_id:
// You can inspect all options:// Bot.sendMessage(inspect(options));Bot.sendMessage(options.result.status_text);// Do not finish payment here.// Use /onPaymentCompleted for this
command /onIPN
You can get info from IPN. Really it is not needed in simple. Just use onPaymentCompleted option on createTransaction.
// You can inspect all fields:// Bot.sendMessage(inspect(options))// IPN is not needed// Use - onPaymentCompletedBot.sendMessage("IPN: Payment status: "+options.status_text );
command onError
// You can inspect all fields:Bot.sendMessage(inspect(options))
//Bot.sendMessage(inspect(options));let wallet =options.result.address;Bot.sendMessage("Your permanent wallet address is:\n`"+ wallet +"`")// You can save wallet//User.setProperty("wallet", wallet, "string");
Command /onIncome
// anybody can run /onIncome command!if(!options){// for security we need to check that this command runned only by lib// user can not run command with optionsreturn}let wallet =options.address;let currency =options.currency;let amount =options.amount;let fiat_amount =options.fiat_amount;let fiat_currency =options.fiat_coin;let fee =options.fee;let txn_id =options.txn_id// see another fields by// Bot.sendMessage(inspect(options));Bot.sendMessage("*Income to wallet:*"+"\n`"+ wallet +"`"+"\n\n*Amount*:\n"+amount +" "+ currency +" ("+ fiat_amount +" "+ fiat_currency +")"+"\n*Fee*: "+ fee +"\n\nTXN: `"+ txn_id +"`");
command onError
// You can inspect all fields:Bot.sendMessage(inspect(options))
Troubleshooting & Debuging
Do not use same CoinPayment account for receiving and transfering funds.
Go to page. This list must have history with completed income transaction(s)
Also it is possible make test callTestPermanentWalletIncome event. It is good if you do not want make test payment.
options = {// onIPN: "/onPermanentWalletIPN", // if you need IPN also onIncome:"/onIncome",// not necessary options// you can pass amount//amount: 0.5// txn_id: YOUR_TXN_ID}Libs.CoinPayments.callTestPermanentWalletIncome(options);
Security
It is strongly recommended to pay attention to safety when using this library.
Do not use default names for secure commands such as /onIncome, /onPaymentCompleted
Anybody can run any command by names. So need to check that security command runned by CoinPayment Lib only!
if(!options){// for security we need to check that this command runned only by lib// user can not run command with optionsreturn}// your secure code...
Do not use any non official libs now.
Any lib can run command with options.
Any libs can read properties (and read your API Keys from other lib)
We have not way to protect this now. Just not use NON official libs with CP lib. Well, that now there are no such libraries
Grant only the really necessary permissions for the Api key. If yor bot do not need "create_withdrawal" or etc methods - turn theys off.