爱极客
爱极客
如何在你的WEB支付网站添加BTC支付方式,使用BTC支付API

博主因为一些国外业务需要,所以对于老外的收款一直没有什么好的解决方案,而PayPal因为种种原因又很容易被冻结。

并且买家购买后还可以申请退款,因此一种面对老外使用的新的支付方式需求就迫在眉睫,想来想去考虑到交易的安全性,

似乎也只有BTC交易最为安全方便了,写本篇教程一方面是因为网上有关BTC的API使用方法不多,比较咱们国家对于BTC的交易

还是有一定的限制的,另一方面也是用来给博主自己当一篇备忘文章,那么屁话不多说,我们直接进入教程。

对了,如果你没有BTC钱包,可以去blockchain.com申请个先,具体的流程可以百度,我这里就不赘述了。

1、申请BTC支付API

既然用到BTC支付那么和支付宝微信等是一样的,我们先需要申请一个官方接口

我们要用到的接口是Receive Payments API V2  ,它的具体申请地址是https://api.blockchain.info/customer/signup

ps 这里要注意的是,申请的时候可能需要挂提子,否则你可能无法加载Google的验证码。。 下图所示

https://cdn.aigeek.top/wp-content/uploads/2019/08/1565920458-QQ%E6%88%AA%E5%9B%BE20190816092109.png?imageView2/1/w/1280/h/1056/interlace/1/q/100#

https://cdn.aigeek.top/wp-content/uploads/2019/08/1565920458-QQ%E6%88%AA%E5%9B%BE20190816092130.png?imageView2/1/w/1280/h/530/interlace/1/q/100#

 

2、接入BTC支付接口驱动

那么由于博主是使用的风铃大佬的开源的card-gateway个人发卡网项目,所以本篇教程就以card-gateway作为例子。

由于发卡网程序的支付接口是模块化集成,所以我们如果为我们要添加BTC接口 需要先添加基于card-gateway的BTC支付驱动。

具体流程如下:

  1. 程序所有支付SDK位于app/Library/Gateway/Pay目录下,如: 我们接入比特币支付,新建文件夹名为 BTC, 文件夹名称即支付驱动名称
  2. 在第一步新建的文件夹中新建文件名为 Api.php
<?php
/**
* BTC付款
* 调用 blockchain.info 的API
* 实测没什么用, 只能监听20个钱包的地址
*/
namespace Gateway\Pay\BTC;

use App\Library\CurlRequest;
use Gateway\Pay\ApiInterface;
use Illuminate\Support\Facades\Log;

/** @noinspection SpellCheckingInspection */

class Api implements ApiInterface
{
//异步通知页面需要隐藏防止CC之类的验证导致返回失败
private $url_notify = '';
private $url_return = '';

public function __construct($id)
{
$this->url_notify = SYS_URL_API . '/pay/notify/' . $id;
$this->url_return = SYS_URL . '/pay/return/' . $id;
}

/**
* @param array $config
* @param string $out_trade_no
* @param string $subject
* @param string $body
* @param int $amount_cent
* @throws \Exception
*/
function goPay($config, $out_trade_no, $subject, $body, $amount_cent)
{
$amount_btc = CurlRequest::get('https://api.blockchain.info/tobtc?currency=CNY&value=' .
sprintf('%.2f', $amount_cent / 100));
if (!$amount_btc) {
Log::error('Pay.BTC.goPay, get price error:' . @$amount_btc);
throw new \Exception('获取BTC价格失败,请联系客服');
}

$address_raw = CurlRequest::get('https://api.blockchain.info/v2/receive?xpub=' . $config['xpub6Bzj3HuXkgjWwFzyc2aCzCx4HFkPSHfZ3iDVUHTSvBJuoZJLowwbEum4PWAVZ6C93Chg2LFWNuHkgrQUVdEUPcLbuxVRu9y4T3P7Bzr4xwB'] .
'&callback=' . urlencode($this->url_notify . '?secret=' . $config['secret']) .
'&key=' . $config['key']);
$receive = @json_decode($address_raw, true);
if (!$receive || !isset($receive['address'])) {
if($receive['description'] === 'Gap between last used address and next address too large. This might make funds inaccessible.') {
throw new \Exception('钱包地址到达限制, 请等待之前的用户完成付款');
}
Log::error('Pay.BTC.goPay, get address error:' . @$address_raw);
throw new \Exception('获取BTC地址失败,请联系客服');
}

// 小数点后8位
$code_url = 'bitcoin:' . $receive['address'] . '?amount=' . $amount_btc;

// 这个地址是唯一的
if (\App\Order::wherePayTradeNo($code_url)->exists()) {
throw new \Exception('支付失败, 当前钱包地址重复');
}

\App\Order::whereOrderNo($out_trade_no)->update(['pay_trade_no' => $code_url]);

header('location: /qrcode/pay/' . $out_trade_no . '/btc?url=' . urlencode(json_encode([
'address' => $receive['address'],
'amount' => $amount_btc
])));
exit;
}

/**
* @param $config
* @param callable $successCallback
* @return bool|string
* @throws \Exception
*/
function verify($config, $successCallback)
{
$isNotify = isset($config['isNotify']) && $config['isNotify'];

if ($isNotify) {
if (@$_GET['secret'] !== $config['secret']) {
echo 'error';
return false;
}

if (isset($_GET['confirmations'])) {
$address = $_GET['address'];
$code_url = 'bitcoin:' . $address . '?amount=' . rtrim(rtrim(sprintf('%.8f', $_GET['value'] / 1e8), '0'), '.');
$order = \App\Order::wherePayTradeNo($code_url)->first();
if (!$order) {
echo 'error';
Log::error('Pay.BTC.verify, cannot find order:' . json_encode([
'url' => $code_url,
'params' => $_GET,
]));
return false;
}
$pay_trade_no = $code_url; //支付地址 作为支付流水号储存
$successCallback($order->order_no, $order->paid, $pay_trade_no);
}

echo '*ok*';
return true;
} else {
// 此驱动, 不支持主动查询交易结果
return false;
}
}
}

 

接着我们进入发卡网程序的后台  添加一个新的支付方式。如下图设置

https://cdn.aigeek.top/wp-content/uploads/2019/08/1565921780-QQ%E6%88%AA%E5%9B%BE20190816101435.png?imageView2/1/w/1280/h/384/interlace/1/q/100#

 

https://cdn.aigeek.top/wp-content/uploads/2019/08/1565921878-QQ%E6%88%AA%E5%9B%BE20190816101621.png?imageView2/1/w/1280/h/1102/interlace/1/q/100#

你需要把下面的未设置的内容替换成文章开头你所申请到的Receive Payments API V2 信息

{
"xpub": "未设置",
"secret": "未设置",
"key": "未设置"
}

 

https://cdn.aigeek.top/wp-content/uploads/2019/08/1565922180-QQ%E6%88%AA%E5%9B%BE20190816102122.png?imageView2/1/w/1280/h/556/interlace/1/q/100#

当然国内用户使用BTC支付可能会出现种种网络问题,如果你的网站不面对老外付费一般不需要使用BTC接口。那么教程到这里也就结束了,这时你已经可以过BTC来支付了,如果有什么不明白的,欢迎在文章下方评论留言,thanks~

 

Donate

Leave a Reply

textsms
account_circle
email

爱极客

如何在你的WEB支付网站添加BTC支付方式,使用BTC支付API
博主因为一些国外业务需要,所以对于老外的收款一直没有什么好的解决方案,而PayPal因为种种原因又很容易被冻结。 并且买家购买后还可以申请退款,因此一种面对老外使用的新的支付方式…
Scan QR code to continue reading
2019-08-16
隐藏