Accept cryptocurrency payment can be painless, free and secure.
- No need to setup full Bitcoin/Ethereum/EOS full node(it cost your hundreds gigabytes).
- No need to pay expensive service fee, your program, your money.
- All payment is automatically transfer to your personal account on the fly. No money to lose even database is stolen.
Developer call to localhost http api, show payment information to client, program will visit webhook when client paid cryptocurrency.
ATTENTION: If you ever use code on or before tag v0.0.1, the current master branch is not backward compatible.
Steps:
Visit https://mixin.one/messenger to download App from AppStore, Google Play.
Log in to https://developer.mixin.one with your mixin messenger account
This tutorial is very useful for new developer to create app.
git clone https://github.com/myrual/mixin-network-snapshot-golang
cd mixin-network-snapshot-golang
- Edit some of code
const (
userid = "3c5fd587-5ac3-4fb6-b294-423ba3473f7d"
sessionid = "42848ded-0ffd-45eb-9b46-094d5542ee01"
private_key = `-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDACTrT4uaB9el9qe0MUOsFrm8kpaDI9PowauMB1Ha25mpfL+5h
MFqISLS5z2P89nAsXBg+KyQ2gAVA6rBwW/ZqOc1PKiJhhLBS80nzo3ayfv7OlzNG
IxMyqD5izCCtPixnqpuTePoPWq4CNZlxop0VYklsWEfU0U0qqMBgmtqYfQIDAQAB
AoGAR8crZed5oTn5fC73m5LjRcxdXqVJ49MtcMuC7jwr41FckRepUkpwjGAgrRMH
nJXAd9Q0e4hEkNppHEqciGLXR1dQfZnaM1Gnv7mD3oSgHaH+4qAMnNOCpvwW4Eu3
yp9b1UGj9SvM3D2BrpA+MGf0E/yEJzpRcT956W6SPYYSegECQQDm4uTK+teoxr1Z
agJZuCta+IhMzpxIWMob+JN/Huf7OnRcIa9JpXngg4tHOUWmZCDQdqeJMpaQc8SQ
44hba015AkEA1OyJswNIhdmvVp5P1zgREVVRK6JloYwmAtj+Qo4pWJ117LqH4w+b
491r4AeLEGh8VrZ4k6Hp+Cm783S2jTAWJQJARbWdlHdV45xVkQiDuyjy1h2RsXb0
EpfUNcvAZLIlImIMvcBh1x+CA7pTs+Zj1BAJJEee37qJYQXDBGfeRJPKKQJAVG+c
x42Ew/eoTZwoIzvLoOkJcFlNHjwaksSER9ZiVQ7URdVOr99vvXQAJG45Wn9k12oy
9LCfvNan/wqIngK0tQJBAL1Wc02seEbMeWyt5jycJEhn6G8F18s9S1v0GXb4U/7/
6Y87P3TmDLcEuCXkrbZQaCX7jVLu0BkDw8To58TWjh0=
-----END RSA PRIVATE KEY-----`
ADMIN_MessengerID = ""//this is your mixin messenger id, you can find your id in contact page.
)
- Build
go build mixin_snap.go
- Run
./mixin_snap
- Database
A sqlite3 file with name test.db will be generated in same folder.
curl -X GET 'http://localhost:8080/assetsprice'
Result is following.
[
{"Fullname":"Stellar","Symbol":"XLM","USDPrice":0.10357796,"BTCPrice":0.00000889,"Assetid":"56e63c06-b506-4ec5-885a-4a5ac17b83c1"},
{"Fullname":"EOS","Symbol":"EOS","USDPrice":5.96024263,"BTCPrice":0.00051165,"Assetid":"6cfe566e-4aad-470b-8c9a-2fd35b49c68d"},
{"Fullname":"Ether","Symbol":"ETH","USDPrice":294.61322131,"BTCPrice":0.02529107,"Assetid":"43d61dcd-e413-450d-80b8-101d5e903357"}
]
If your order is valued about 1 USD, that means client need to deposit about 10 XLM, or 0.17 EOS.
To accept bitcoin or eos payment, developer need to call localhost:8080/charges by http POST, with parameter in body.
POST /charges
Attributes | type | description |
---|---|---|
currency | String | Currency code associated with the amount. Only EOS/XLM/ETH is supported currently |
amount | Float64 | Positive float |
customerid | String | This field is optional and can be used to attach an identifier of your choice to the charge. Must not exceed 64 characters |
webhookurl | String | program will visit localhost+webhook when user pay enough currency before charge is expired |
expiredafter | uint | the webhook will be expired after xx minutes. User can pay to an expired charge , program keep income record and will transfer asset to admin account |
Example: let client "client1245" pay 0.001 ETH, notify developer's app by POST localhost:9090/123 when user pay enough currency in 60 minutes.
curl -d '{"currency":"ETH", "amount":0.001, "customerid":"client1245", "webhookurl":":9090/123", "expiredafter":60}' -H "Content-Type: application/json" 127.0.0.1:8080/charges
The command just tell the program to create a ETH charge address for customer id "client1245", visit localhost:9090/123 when user paid enough asset to the address in 60 minutes.
the result of the command will be
{
"Id":3,
"Currency":"ETH",
"Amount":0.001,
"Customerid":"client1245",
"Webhookurl":":9090/123",
"Expired_after":60,
"Paymentmethod":{
"Name":"ETH",
"PaymentAddress":"0x130D3e6655f073e33235e567E7A1e1E1f59ddD79",
"PaymentAccount":"",
"PaymentMemo":"",
"Priceinusd":"310.40105841",
"Priceinbtc":"0.02374051"
},
"Receivedamount":0,
"Paidstatus":0}
Client need to tranfser 0.001 ETH to address 0x130D3e6655f073e33235e567E7A1e1E1f59ddD79 to finish the payment.
If you want to accept EOS
$ curl -d '{"currency":"EOS", "amount":0.001, "customerid":"client1245", "webhookurl":":9090/123", "expiredafter":5}' -H "Content-Type: application/json" 127.0.0.1:8080/charges
{
"Id":2,
"Currency":"EOS",
"Amount":0.001,
"Customerid":"client1245",
"Webhookurl":":9090/123",
"Expired_after":5,
"Paymentmethod":{
"Name":"EOS",
"PaymentAddress":"",
"PaymentAccount":"eoswithmixin",
"PaymentMemo":"a01a148f234ea8be0229a4422d21e7f3",
"Priceinusd":"4.63264861",
"Priceinbtc":"0.00040277"
},
"Receivedamount":0,
"Paidstatus":0
}
Client need to tranfser 0.001 EOS to account eoswithmixin, and MUST fill memo a01a148f234ea8be0229a4422d21e7f3 to finish the payment.
If you want to accept Stellar XLM
curl -d '{"currency":"XLM", "amount":0.001, "customerid":"client1245", "webhookurl":":9090/123", "expiredafter":5}' -H "Content-Type: application/json" 127.0.0.1:8080/charges
{
"Id":3,
"Currency":"XLM",
"Amount":0.001,
"Customerid":"client1245",
"Webhookurl":":9090/123",
"Expired_after":5,
"Paymentmethod":{
"Name":"XLM",
"PaymentAddress":"",
"PaymentAccount":"GD77JOIFC622O5HXU446VIKGR5A5HMSTAUKO2FSN5CIVWPHXDBGIAG7Y",
"PaymentMemo":"45da67ad857c907a",
"Priceinusd":"0.08866487",
"Priceinbtc":"0.00000769"
},
"Receivedamount":0,
"Paidstatus":0
}
Client need to tranfser 0.001 XLM to account GD77JOIFC622O5HXU446VIKGR5A5HMSTAUKO2FSN5CIVWPHXDBGIAG7Y, and MUST fill memo 45da67ad857c907a to finish the payment.
There are two types of payment method:
- Bitcoin/Ethereum style: PaymentAddress is not empty, PaymentAccount and PaymentMemo are all empty. You just show Ethererum Name and PaymentAddress to your clients, they just need to transfer token to the address. In this example, show asset name ETH, payment address 0x365DA43BC7B22CD4334c3f35eD189C8357D4bEd6 and payment amount to your client.
- EOS/Stellar style: PaymentAddress is empty, PaymentAccount and PaymentMemo are not empty. You need to show Asset Name and both of PaymentAccount and PaymentMemo to user, and remind user need to input BOTH of PaymentAccount and PaymentMemo. Transfer asset to PaymentAccount without memo is a common mistake, and it can not be reverted because current Mixin Network limitation. In this example, show asset name EOS, payment account eoswithmixin , payment memo 302c37ebff05ccf09dd7296053d1924a.
Asset current price in USD and Bitcoin is inside payment record, so developer can calculate how many asset client should transfer to the address or account.
{
"Priceinusd":"310.40105841",
"Priceinbtc":"0.02374051"
}
Currency list
Currency | Explain | introduction |
---|---|---|
EOS | EOS.io main chain token | - |
XLM | Stellar main chain token | - |
BTC | Bitcoin | - |
UDT | Tether USD | Running on Bitcoin instead of Ethereum |
XRP | Ripple | - |
LTC | Litecoin | - |
fetch the payment status by visit localhost:8080/charges with parameter charge_id
Example:
curl -X GET 'http://localhost:8080/charges?charge_id=3'
Response will be similar to following if payment is not yet confirmed
{
"Id":3,
"Currency":"ETH",
"Amount":0.001,
"Customerid":"client1245",
"Webhookurl":":9090/123",
"Expired_after":60,
"Paymentmethod":{
"Name":"ETH",
"PaymentAddress":"0x130D3e6655f073e33235e567E7A1e1E1f59ddD79",
"PaymentAccount":"",
"PaymentMemo":"",
"Priceinusd":"310.40105841",
"Priceinbtc":"0.02374051"
},
"Receivedamount":0,
"Paidstatus":0}
}
Response will be similar to following if payment is already confirmed
{
"Id":3,
"Currency":"ETH",
"Amount":0.001,
"Customerid":"client1245",
"Webhookurl":":9090/123",
"Expired_after":60,
"Paymentmethod":{
"Name":"ETH",
"PaymentAddress":"0x130D3e6655f073e33235e567E7A1e1E1f59ddD79",
"PaymentAccount":"",
"PaymentMemo":"",
"Priceinusd":"309.75108846",
"Priceinbtc":"0.02369282"
},
"Receivedamount":0.002,
"Paidstatus":2
}
Paid status
value | description |
---|---|
0 | not yet paid |
1 | partial paid |
2 | paid |
3 | over paid |
The payment address is a deposit address in cryptocurrency world, so user can deposit any amount.
The program will visit webhook url when user paid and confirmed by program.
"http://127.0.0.1"+webhookurl
The http visit method is POST, json body parameter is following
{
"Id":3,
"Currency":"ETH",
"Amount":0.001,
"Customerid":"client1245",
"Webhookurl":":9090/123",
"Expired_after":60,
"Paymentmethod":{
"Name":"ETH",
"PaymentAddress":"0x130D3e6655f073e33235e567E7A1e1E1f59ddD79",
"PaymentAccount":"",
"PaymentMemo":"",
"Priceinusd":"309.75108846",
"Priceinbtc":"0.02369282"
},
"Receivedamount":0.0021,
"Paidstatus":2
}
Developer can know when, which asset is paid by client, and what's the payment value in USD and Bitcoin.
- All income payment will be AUTOMATICALLY sent to your own Mixin Messenger account with ZERO transaction fee in 1 seconds.
- You can also ask the program send all money to your Mixin Messenger account if the program exit accidently.
curl -X POST -H "Content-Type: application/json" 127.0.0.1:8080/moneygohome
response will be similar to follow
total 20 account will send all balance to admin
- EOS: 3 minutes
- Stellar: 2 minutes
- Bitcoin/USDT: 60 minutes
- Litecoin/Ethererum/DOGE: 120 minutes
A cryptocurrency transaction created by your client need to be confirmed by network, Bitcoin network need long time to confirm, other blockchain need less time.
All asset supported by Mixin Network: BTC, USDT, BCH, ETH and ERC20, ETC, EOS and token issue on EOS, DASH, Litecoin, Doge, Horizen, MGD, NEM, XRP, XLM, TRON and TRC10, Zcash.
Three kind of currency : ETH, EOS, XLM are accepted in code.
To support more currency, just add more asset into the default_asset_id_group.
const (
BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa"
EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"
USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a"
ETC_ASSET_ID = "2204c1ee-0ea2-4add-bb9a-b3719cfff93a"
XRP_ASSET_ID = "23dfb5a5-5d7b-48b6-905f-3970e3176e27"
XEM_ASSET_ID = "27921032-f73e-434e-955f-43d55672ee31"
ETH_ASSET_ID = "43d61dcd-e413-450d-80b8-101d5e903357"
DASH_ASSET_ID = "6472e7e3-75fd-48b6-b1dc-28d294ee1476"
DOGE_ASSET_ID = "6770a1e5-6086-44d5-b60f-545f9d9e8ffd"
LTC_ASSET_ID = "76c802a2-7c88-447f-a93e-c29c9e5dd9c8"
SIA_ASSET_ID = "990c4c29-57e9-48f6-9819-7d986ea44985"
ZEN_ASSET_ID = "a2c5d22b-62a2-4c13-b3f0-013290dbac60"
ZEC_ASSET_ID = "c996abc9-d94e-4494-b1cf-2a3fd3ac5714"
BCH_ASSET_ID = "fd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0"
XIN_ASSET_ID = "c94ac88f-4671-3976-b60a-09064f1811e8"
CNB_ASSET_ID = "965e5c6e-434c-3fa9-b780-c50f43cd955c"
XLM_ASSET_ID = "56e63c06-b506-4ec5-885a-4a5ac17b83c1"
TRON_ASSET_ID = "25dabac5-056a-48ff-b9f9-f67395dc407c"
........
)
.......
.......
// to support more asset, just add them in the following array
default_asset_id_group := []string{XLM_ASSET_ID, EOS_ASSET_ID, ETH_ASSET_ID}
TO BE DONE:
- All asset can be withdrawed to developer's cold wallet.
- One type asset can be exchanged to USDT or Bitcoin automatically through DEX.
- Support Mixin Messenger User to pay.
Latest USD price for every assetImplemented in commit 8a634e23254e4841c2a9c3114b3eb847d46f55fc