首页 > 编程语言 >记录一个使用第三方USDT支付通道的PHP项目的开发过程及解决方案

记录一个使用第三方USDT支付通道的PHP项目的开发过程及解决方案

时间:2024-09-29 08:49:38浏览次数:1  
标签:body ch 解决方案 地址 USDT json curl PHP data

  1. 项目的需求背景
    接到一个项目,需要收付USDT,顾客要求用币安链的,即BSC链,需要实现:

充值监控:当用户通过区块链钱包将 USDT 转账到指定地址时,系统能够监控并确认充值到账。
提现功能:当用户发起提现请求时,系统能够根据用户指定的地址,自动完成 USDT 的转账操作。
交易安全性:确保每笔交易都具有合法性,防止双花攻击或伪造交易。

要是都自己做,费钱费力还容易出问题,还是用第三方USDT支付通道吧。想起以前同事用过UBAO.IO,用起来还不错,还是使用UBAO吧。注册地址:https://m.ubao.io/#/login?c=8YmVrlk 。注册后保存商户号和API_SECRET备用。

  1. 开发过程
    代码,用PHP。商业逻辑,倒也没什么说的。主要记录一下支付这一块。
    想法是,生成一批钱包地址,保存在本地数据库中,供会员轮流使用,时限24小时。比如,甲会员需要付款,那就调用一个地址A,标记调用时间,24小时内,只要地址A进来的USDT,都认为是甲会员所付(这个时间已经很宽松了,大多数人付款,时间也就几分钟,不会超过半小时)。如果再来乙会员,那就调用地址B,依次类推。24小时后,这些地址释放,供会员轮流调用,这样比较节约地址。毕竟付款的动作,不是每个会员每天都做。

生成地址的代码:

//調用API生成一個錢包地址 
$url = "https://api.ubao.id/mch/address/create";

$merchantId = "12345"; //商戶號 
$api_key = "123456789"; //商戶密鑰 

$timestamp = time();
//結果:1725607713
$nonce = rand(100000,999999);
//結果:212343

$body_data = array('chainType'=>170,'type'=>0,'callUrl'=>'http://www.xxx.com/callback.html'); 
//把body數組轉為JSON字符串 
$str = json_encode($body_data);
//結果:{"chainType":170,"type":0,"callUrl":"http:\/\/www.xxx.com\/callback.html"}

//再用base64編碼,得到最終的body字符串 
$body = base64_encode($str);
//結果:eyJjaGFpblR5cGUiOjE2MCwidHlwZSI6MCwiY2FsbFVybCI6Imh0dHA6XC9cL3d3dy54eHguY29tXC94eHguaHRtbCJ9

//簽名 
$sign = md5($body . $api_key . $nonce . $timestamp);
//結果:5eab870f6a4fea6caabc6e0be4308bf0

//提交給網關的數據  
$data = array('merchantId'=>$merchantId,'timestamp'=>$timestamp,'nonce'=>$nonce,'sign'=>$sign,'body'=>$body);

//用POST方式提交給網關 
$res = curlPost($url,$data);
//結果:{"code":200,"message":"SUCCESS","address":"0xD3b0d838cCCEAe7ebF1781D11D1bB741DB7Fe1A8","chainType":170}
//这个address ,就是钱包地址,保存到本地数据库。如果需要更多地址,再调用就是。
//......



function curlPost($url, $post_data = array(),$timeout = 5, $header = array("content-type: application/x-www-form-urlencoded"), $data_type = "") {
	$header = empty($header) ? '' : $header;
	if($data_type == 'json'){
		$post_string = json_encode($post_data);
	}elseif($data_type == 'array') {
		$post_string = $post_data;
	}elseif(is_array($post_data)){
		$post_string = http_build_query($post_data, '', '&');
	}
	
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);     
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
	curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
	$result = curl_exec($ch);
	curl_close($ch);
	
	return $result;
}

3.如果有会员付款,UBAO会通知上面留下的回调地址 http://www.xxx.com/callback.html 。然后在这个程序里处理一下。

$api_key = "123456789"; //商戶密鑰 

$body = $_POST['body'];
$sign = $_POST['sign'];
$nonce = $_POST['nonce'];
$timestamp = $_POST['timestamp'];

$msg = "";

try {
	$sign2 = md5($body . $api_key . $nonce . $timestamp);
	
	if($sign2 != $sign){
		$msg = "sign error";
		throw new Exception();
	}
	
	$json = json_decode(base64_decode($body),true);
	
	$decimals = $json['decimals'];
	$amount = number_format($json['amount']/pow(10,$decimals),3,'.','') + 0;
	
	if($json['callbackType'] == 'recharge'){
	    //充幣的業務邏輯處理 
                                if($json['chainType'] == 170 && $json['coinID'] == 1002){ //币安链的USDT
                                    $address = $json['address'];//收款的地址
                                    //找到本地数据库记录的锁定此地址的会员,将他的付款状态改为付款成功。
                                    。。。。
                                }
	}
	
	if($json['callbackType'] == 'transfer'){
	    //提幣或轉賬的業務邏輯處理 
		if($json['result'] == 1){
			//轉賬成功 
		}
		else{
			//轉賬失敗 
			$msg = $json['message'];
		}
	}
	
	if($json['callbackType'] == 'balance'){
	    //得到地址余額的業務邏輯處理 
	}
	
	$msg = "SUCCESS";
	
}
catch (Exception $e) {
	//
}

echo $msg;
  1. 测试与后记
    测试起来,挺顺利。顾客也挺满意。收尾款,收工。至于说以后可用地址不足,让他花钱升级就是了。也不麻烦。

标签:body,ch,解决方案,地址,USDT,json,curl,PHP,data
From: https://www.cnblogs.com/wsxx2/p/18438815

相关文章

  • pbootcms标签分页中url会无限重复叠加的解决方案
    针对PbootCMS中TAG标签分页时URL参数无限叠加的问题,可以通过修改core\view\Paging.php中的buildBasicPage方法来解决。具体步骤如下:定位问题:当使用target=tag参数时,在分页过程中,URL会出现参数无限叠加的情况。修改代码:打开core\view\Paging.php文件。定位到buildBa......
  • 关于PHP方面需要掌握的一些基础语法
    成长路上不孤单......
  • 体重电子秤PCBA方案应用解决方案
    体重电子秤采用现代传感器技术、电子技术和计算机技术一体化的电子称量装置,能够满足并解决现实生活中提出的"快速、准确、连续、自动"称量要求,同时有效地消除人为误差,使得体重电子秤更符合法制计量管理和工业生产过程控制的应用要求。体重电子秤的功能实现主要依赖于芯片......
  • BLE Audio显示连接成功,但没有音乐播放问题解决方案
    背景最近一直在搞这个问题,和原厂一起分析,背景可以参考前面的文章https://blog.csdn.net/Jzj1234555/article/details/142518444?spm=1001.2014.3001.5501https://blog.csdn.net/Jzj1234555/article/details/142595444?spm=1001.2014.3001.5501解决方案今天原厂承认了他......
  • 一站式解决方案:10款PM工程项目管理软件深度解析
    市面上主流的10款PM工程项目管理系统推荐:PingCode、Worktile、飞书、金和项目管理、致远协同办公、Asana、Trello、JIRA、Basecamp、Monday.com。在现代企业管理中,项目的复杂性常常让人感到无从应对,错失进度和预算控制的情况屡见不鲜。选择合适的PM工程项目管理系统,不仅可以......
  • 双端之Nginx+Php结合PostgreSQL搭建Wordpress
    第一台虚拟机:安装Nginx更新系统包列表:sudoaptupdate安装Nginx及php扩展:sudoaptinstallnginxphp-fpmphp-pgsqlphp-mysqli-y启动Nginx服务:sudosystemctlstartnginx检查Nginx是否正常运行:xdg-openhttp://localhost注意:终端命令打开网址打......
  • 《破晓传说》d3dcompiler_43.dll缺失启动遇阻?d3dcompiler_43.dll丢失问题全解析与解决
    《破晓传说》在启动过程中遇到d3dcompiler_43.dll缺失的问题,确实会导致游戏无法正常运行。这个问题通常与DirectX组件的完整性或兼容性有关。以下是对d3dcompiler_43.dll丢失问题的全解析与解决方案:问题解析d3dcompiler_43.dll是什么?d3dcompiler_43.dll是DirectX的一部分,它......
  • 无刷充气泵应用解决方案
    在方案开发中,充气效率是无刷充气泵PCBA方案开发中的关键问题。一般通过优化电路设计和控制算法,可以实现高效的气体压缩和快速的充气效果。另外,选择合理的电机驱动器和传感器等元器件能够提高打气泵的功率和效率,减少充气时间,使得方案更具优化效果。车载充气泵采用的是无刷......
  • 无刷充气泵应用解决方案
     在方案开发中,充气效率是无刷充气泵PCBA方案开发中的关键问题。一般通过优化电路设计和控制算法,可以实现高效的气体压缩和快速的充气效果。另外,选择合理的电机驱动器和传感器等元器件能够提高打气泵的功率和效率,减少充气时间,使得方案更具优化效果。 车载充气泵采用的是无刷电......
  • Pbootcms源码上传安装后前端显示错乱乱码问题解决方案
    PbootCMS前端显示错乱或乱码问题可能是由多种原因造成的,下面是一些可能的解决方案:检查字符集设置:确认前端页面的字符集设置是否正确。通常在HTML头部会有一个<meta>标签定义字符集,例如<metacharset="UTF-8">。同时检查PbootCMS后台的字符集设置是否与前端一致,确保数据库和......