主页 > imtoken支持bcc > 如何接受比特币付款

如何接受比特币付款

imtoken支持bcc 2023-01-31 06:16:39

比特币越来越受欢迎,上周我决定将它作为我的计算机生成音乐服务的支付方式。我决定这样做的原因在这里详细说明(费用仅用于音乐的商业用途),但在这里我将分享实现比特币集成的技术细节。

首先,您需要选择支付网关/提供商。您可以从这里选择一个。它们在 API 和具体流程上有所不同,但一般流程应该几乎相同。下面的一些实现细节只与我所学到的有关——Coinbase——但对于其他提供者来说它们应该是相似的。我选择 Coinbase 是因为它似乎是对开发人员最友好和最直接的。它有一个我必须修复的错误,但除此之外,没关系。

以下是一般流程(可能包含一些 Coinbase 详细信息)。请注意,我所描述的是最复杂的情​​况,您有多个价格和数量可变的商品。您可以使用我在购物车页面中使用的 html/js 代码。另一方面,假设最理想的支付提供商不会将用户重定向到外部页面如何使用比特币付款,而只使用 JavaScript 对话框。

在结帐页面上放置一个自定义的“使用比特币付款”按钮单击它提交一个触发后端结帐过程的表单后端代码将新的购买/订单保存在数据库中并返回其ID然后后端代码调用支付网关API ,提供订单 ID(或任何自定义应用程序数据)和价格,并获取用于识别交易的代码。价格可以以 BTC 或任何货币提供。根据 API,您可能希望/需要在通过 API 传递固定价格之前将流行货币的固定价格转换为 BTC。如果这样做,请确保将转化率缓存一段时间 - 无需每次都获取它们。提供者可以自动进行此转换,但如果您想先将其展示给用户,您可能需要自己进行转换。将代码返回到前端时,javascript 选择它,并打开一个对话框(使用提供者提供的 js 函数/事件)。该对话框可能包含几个支付选项,但通常会显示用户应该向其汇款的比特币支付地址。他可以用移动或桌面钱包做到这一点。交易完成后,将使用您在生成代码时传递的订单 ID 在您的应用上调用回调 URL。然后,您可以确认购买并发送购买的物品。然后对话框自动关闭(或者用户按下“事务完成”)。此时,您需要发送一个(ajax)请求来清除购物车的内容如何使用比特币付款,然后重定向到“谢谢”页面。但通常会显示用户应该汇款到的比特币支付地址。他可以用移动或桌面钱包做到这一点。交易完成后,将使用您在生成代码时传递的订单 ID 在您的应用上调用回调 URL。然后,您可以确认购买并发送购买的物品。然后对话框自动关闭(或者用户按下“事务完成”)。此时,您需要发送一个(ajax)请求来清除购物车的内容,然后重定向到“谢谢”页面。但通常会显示用户应该汇款到的比特币支付地址。他可以用移动或桌面钱包做到这一点。交易完成后,将使用您在生成代码时传递的订单 ID 在您的应用上调用回调 URL。然后,您可以确认购买并发送购买的物品。然后对话框自动关闭(或者用户按下“事务完成”)。此时,您需要发送一个(ajax)请求来清除购物车的内容,然后重定向到“谢谢”页面。然后,您可以确认购买并发送购买的物品。然后对话框自动关闭(或者用户按下“事务完成”)。此时,您需要发送一个(ajax)请求来清除购物车的内容,然后重定向到“谢谢”页面。然后,您可以确认购买并发送购买的物品。然后对话框自动关闭(或者用户按下“事务完成”)。此时,您需要发送一个(ajax)请求来清除购物车的内容,然后重定向到“谢谢”页面。

请注意,支付提供商的文档应提供所有实施细节。下面,我将分享我的案例的一些细节:Coinbase 和 Java:

文档中描述的默认方案是在页面上放置带有预定义代码的按钮。如果您需要增加数量或有多个项目,这将不起作用。这就是为什么您应该动态生成按钮代码的原因。但是 javascript 库仅在页面加载时处理此问题。所以我不得不复制一些精简的 JavaScript 代码,并在后端返回代码时调用它。这是完整的 javascript 代码(当用户按下“用比特币支付”时调用):

$(document).ready(function() {
  $('#payWithBitcoin').click(function() {
      var email = $('#email').val();
      if (${!userLoggedIn} && (!email || email.length == 0 || email.indexOf('@') == -1)) { // simple validation here; actual - on the server
          alert('Please enter a valid email');
      } else {
          $.post('${root}/cart/bitcoinCheckout', {email: email}, function(data) {
              $('#bitcoinPurchase').attr('data-code', data);
              $('.coinbase-button').each(function (b, d) {
                  var f, g, h, i, j, k;
                  return f = $(d), h = f.data(), h.referrer = document.URL, j = $.param(h), g = f.data('code'), k = f.data('width') || 195, i = f.data('height') || 46, f.data('button-style') !== 'none' && f.replaceWith(''), $('body').append('');
              });
              $('#coinbase_modal_iframe_' + data).load(function() {
                  $(document).trigger('coinbase_show_modal', data);
              });
          });
      }
  });
  $(document).on('coinbase_payment_complete', function(event, code){
      $.post('${root}/cart/clear', function() { //clear the contents of the cart
          window.location = '/?message=Checkout successful. Check your email.';
      });
  });
});


    

另外要记住的是没有官方客户端——你需要手动调用 RESTful API。当然,这很简单。例如,您可以使用 RestTemplate 和 Jackson。

public String getButtonCode(BigDecimal price, long purchaseId) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        ButtonRequest buttonRequest = new ButtonRequest(); //this is a value-object specifically defined for this request
        buttonRequest.setCurrency('btc');
        buttonRequest.setCustom(String.valueOf(purchaseId));
        buttonRequest.setPrice(price.toPlainString());
        buttonRequest.setType('buy_now');
        buttonRequest.setName('Computer-generated tracks');
        ResponseEntity entity = template.postForEntity('https://coinbase.com/api/v1/buttons?api_key=' + coinbaseKey, buttonRequest, String.class);
        String json = entity.getBody();
        try {
            JsonNode node = jsonMapper.readTree(json);
            return node.get('button').get('code').asText();
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
}

最后,调用回调URL时,需要获取订单ID并完成支付:

@RequestMapping('/confirmBitcoinPurchase')
    @ResponseBody
    public void confirmBitcoin(@RequestBody String json) throws Exception {
        JsonNode root = mapper.readTree(json);
        JsonNode order = root.get('order');
        if (order.get('status').asText().equals('completed')) {
            String paymentId = order.get('id').asText();
            .....
        }
     }

总的来说,这需要一些时间来弄清楚。以前有支付提供商集成的经验将是一个加分项,但有一个重要区别——您无需向支付提供商提交任何用户特定的内容(例如信用卡详细信息)。相反,用户支付目标比特币地址,该地址由支付提供商处理。每次交易完成时,提供商都会调用您的 URL。然后,您可以通过银行转帐或将其转入您自己的比特币钱包从支付网关获得付款。

参考:JCG 合作伙伴 Bozhidar Bozhanov 如何在 Bozho 的技术博客博客中接受比特币支付。

翻译自: