区块链钱包U盾对接方案

3,028 阅读4分钟

一、背景

目前行业对区块链这块技术还是有着很大的摸索方式,最近在做交易所的钱包对接,所以就写下我的方式。目前是对接U盾,遇到的坑大家互相可以避开。 还需要开通一个主钱包,这个跟着U盾提示,下载个软件就可以开通了。很方便。

二、准备

首先你得有个U盾的账号,申请地址:www.uduncloud.com/

要注册一个账号,等登录之后,你会发现控制台右下角有如下内容:Key值,网关服务器这些

可以获取Key值,网关服务器这些。然后就是使用它提供的API了

www.uduncloud.com/geteway-int…

这里有需要的网关地址和key。调用API的时候会用到。

三、java对接

官网手册中有提供API和SDK对接的方案,不过我觉得官网已经写好的SDK,说明他们自己已经对这个东西都做了处理,所以我是推进SDK的,下面是对接方式。 直接下载jar包:github.com/uduncloud/j…

下载之后可以加入pom.xml

<dependency>
    <groupId>com.udun</groupId>
    <artifactId>udun-sdk-java</artifactId>
    <version>2.0.3</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/udun-sdk-java-2.0.3.jar</systemPath>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.0</version>
</dependency>

然后后就可以使用官网提示方式的:

import com.udun.sdk.domain.Address;
import com.udun.sdk.domain.Coin;
import com.udun.sdk.domain.ResultMsg;

import java.math.BigDecimal;
import java.util.List;

public class UdunclientDemo {
    public static void main(String[] args) {
        //初始化
        UdunClient udunClient = new UdunClient("服务网关",
                "商户编号",
                "钱包key",
                "回调地址");
        //获取商户支持币种
        List<Coin> coinList = udunClient.listSupportCoin(false);
        //创建地址
        Address address3 = udunClient.createAddress("主币种编号", "别名", "钱包地址", "回调地址");
        System.out.println(address3);
        //检验地址合法性
        boolean b = udunClient.checkAddress("主币种编号", "上面生成的地址");
        System.out.println(b);
        //提币
        ResultMsg withdrawResult1 = udunClient.withdraw("上面生成的地址,或者是其他平台生成的地址", 
        new BigDecimal(100),"主币种编号", "子币种编号",
                "流水号,自己随便取不重复就行", "标识符,自己随便取,方便审核的时候认得", "回调地址");
        System.out.println(withdrawResult1);

    }
}

这里就有同学问了。你这不就是把官网的巴拉巴拉下来吗?嘿嘿 没错。是的,下面是Spring boot独有要注意的:

闭坑1: 我们打包的时候POM.xml使用jar包一定需要配置<includeSystemScope>true</includeSystemScope> 具体是:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
            </configuration>
        </plugin>
    </plugins>
</build>

不然打包jar不进去就很尴尬,有基础的同学肯定也觉得我这是废话。

闭坑2: 那我们整合Spring boot的时候肯定是放配置文件的对不对,那么最关键的是UdunClient这个类我们要扫描进来。怎么做呢:

@Configuration
public class UdunConfig {


    @Bean
    public UdunClient udunClient() {
         UdunClient udunClient = new UdunClient("服务网关",
                "商户编号",
                "钱包key",
                "回调地址");
        return udunClient;
    }

}

这样就可以了我们就可以使用Resource注解拿到对象了,有基础的小伙伴也肯定觉得我这是在说废话,那么关键的来了。

@Resource
UdunClient udunClient;

闭坑3: 回调接口的写法:其实钱包最关键的是会让我们写个回调这样他就能告诉你交易的情况信息.

/**
 * 处理优盾网关回调信息,包括充币和提币
 *
 * @param timestamp 时间戳
 * @param nonce     随机数
 * @param body      消息内容
 * @param sign      签名
 * @return 返回参数
 */
@PostMapping("/notify")
public String tradeCallback(@RequestParam("timestamp") String timestamp,
                            @RequestParam("nonce") String nonce,
                            @RequestParam("body") String body,
                            @RequestParam("sign") String sign) {
    log.info("timestamp:{},nonce:{},sign:{},body:{}", timestamp, nonce, sign, body);
    if (!UdunUtils.checkSign(udunProperties.getMerchantKey(), timestamp, nonce, body, sign)) {
        return "error";
    }
    Trade trade = JSONUtil.toBean(body, Trade.class);
    if (trade.getTradeType() == 1) {
        log.info("充币回调处理");
        //TODO
    } else if (trade.getTradeType() == 2) {
        log.info("提币回调处理");
        if (trade.getStatus() == 1) {
            log.info("审核通过");
            //TODO
        } else if (trade.getStatus() == 2) {
            log.info("审核不通过");
            //TODO
            
        } else if (trade.getStatus() == 3) {
            log.info("提币已到账");
            //TODO
        }
    }
    return "success";
}

可以了,基本这样就可以进行对接了,但是需要吧回调的参数看清楚哦。

三、总结

其实对于账户来说,所有的分地址只是为了区分用户,最后的币都是在一个钱包里面的。还有就是有写币USDT-ERC20.TRC20啥的协议,其实本质上他们生成的地址就是主链的地址。所有直接使用主链地址就可以,只是代币的形式。然后我们就可以在自己数据库里面存个用户表,吧用户对应生成的区块链地址放放起来,给每个账户存点钱的数据区分区分就完成了一个账户的功能。当然资金全部都在钱包里面