ZBT发货助手主要功能:
1,自动确认交易报价及发货,交易后极速到账
2,仓库饰品自动上架,价格批量设置上架
3,可设置默认溢价,支持比价、修改上架金额
前段时间开发了个游戏抽奖,奖品需要对接自动发货。zbt机制就是类似于一个商城,抽中的奖品,通过注册的zbt账号购买,zbt去发货。
先去注册个账号 https://www.zbt.com/
在这个地方设置 白名单 apikey 回调地址。
自动发货需要对接的接口:
用户余额查询 /open/user/v1/t-coin/balance
市场商品搜索接口V2 /open/product/v2/search
饰品价格接口 /open/product/price/info
快速购买接口v2 /open/trade/v2/quick-buy
购买订单详情V2 /open/order/v2/buy/detail
回调地址接口说明默认是隐藏的,这个找到 文档管理>个性化设置 修改之后才会出现
接口文档地址 https://app.zbt.com/open/doc.html#/home
<?php
namespace app\common\controller;
use think\Controller;
use think\Request;
class Zbt extends Controller
{
protected $appkey='';
protected $steamId="";
protected $appId='730';
protected $exterior=[1=>'WearCategory0',2=>'WearCategory1',3=>'WearCategory2',4=>'WearCategory4'];//品质:1=崭新出厂,2=略有破损,3=久经沙场,4=战痕累累
protected $baseData;
protected $backUrl='';
public function __construct(Request $request = null)
{
parent::__construct($request);
$this->baseData=['app-key'=> $this->appkey, 'language'=> 'zh_CN'];
}
/**
* @param $keyWord 商品名
*/
public function getGoods($keyWord){
$goodData=[
'app-key'=> $this->appkey,
'appId'=> $this->appId,
'keyword'=>urlencode($keyWord)
];
$good=Checking::GetHttp('https://app.zbt.com/open/product/v2/search?'.$this->ToUrlParams($goodData));
$good=json_decode($good,true);
return $good;
}
//饰品价格接口
public function getPrice($data){
$priceData=[
'appId'=> $this->appId,
'marketHashNameList'=>[$data]
];
$priceData=json_encode($priceData,JSON_UNESCAPED_UNICODE);
list($return_code, $priceResult) = Checking::request_post_json('https://app.zbt.com/open/product/price/info?'.$this->ToUrlParams($this->baseData), $priceData);//return_code是http状态码
$priceResult=json_decode($priceResult,true);
return $priceResult;
}
/**
* 快速购买
*/
public function quick_buy($goodItemId,$autoOrderNum,$tradeUrl){
$payData=[
'appId'=>$this->appId,
'delivery'=>2,//发货模式 1=人工,2=自动
'itemId'=>$goodItemId,
'lowPrice'=>1,
'maxPrice'=>200,
'outTradeNo'=>$autoOrderNum,
'tradeUrl'=>$tradeUrl
];
$payData=json_encode($payData,JSON_UNESCAPED_UNICODE);
list($return_code, $payResult) = Checking::request_post_json('https://app.zbt.com/open/trade/v2/quick-buy?'.$this->ToUrlParams($this->baseData), $payData);//return_code是http状态码
$payResult=json_decode($payResult,true);
return $payResult;
}
/**
* 设置回调地址
*/
public function callback(){
$payData=[
'callbackUrl'=>$this->backUrl,
];
$payData=json_encode($payData,JSON_UNESCAPED_UNICODE);
list($return_code, $payResult) = Checking::request_post_json('https://app.zbt.com/open/development/callback-url/save?'.$this->ToUrlParams($this->baseData), $payData);//return_code是http状态码
$payResult=json_decode($payResult,true);
return $payResult;
}
/**
* 订单查询
*/
public function querch($outTradeNo){
$goodData=[
'app-key'=> $this->appkey,
'language'=> 'zh_CN',
'outTradeNo'=>$outTradeNo
];
$good=Checking::GetHttp('https://app.zbt.com/open/order/v2/buy/detail?'.$this->ToUrlParams($goodData));
$good=json_decode($good,true);
return $good;
}
/**
* 获取用户开发者账号相关信息
*/
public function getUser(){
$good=Checking::GetHttp('https://app.zbt.com/open/development/info?'.$this->ToUrlParams($this->baseData));
$good=json_decode($good,true);
return $good;
}
/**
* @return 获取用户余额
*/
public function getUserBalance(){
$userBalance=Checking::GetHttp('https://app.zbt.com/open/user/v1/t-coin/balance?'.$this->ToUrlParams($this->baseData));
$userBalance=json_decode($userBalance,true);
return $userBalance;
}
/**
* 将参数拼接为url: key=value&key=value
* @param $params
* @return string
*/
public function ToUrlParams( $params ){
$string = '';
if( !empty($params) ){
$array = array();
foreach( $params as $key => $value ){
$array[] = $key.'='.$value;
}
$string = implode("&",$array);
}
return $string;
}
//字符串转Unicode编码
public function unicode_encode($strLong) {
$strArr = preg_split('/(?<!^)(?!$)/u', $strLong);//拆分字符串为数组(含中文字符)
$resUnicode = '';
foreach ($strArr as $str)
{
$bin_str = '';
$arr = is_array($str) ? $str : str_split($str);//获取字符内部数组表示,此时$arr应类似array(228, 189, 160)
foreach ($arr as $value)
{
$bin_str .= decbin(ord($value));//转成数字再转成二进制字符串,$bin_str应类似111001001011110110100000,如果是汉字"你"
}
$bin_str = preg_replace('/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/', '$1$2$3', $bin_str);//正则截取, $bin_str应类似0100111101100000,如果是汉字"你"
$unicode = dechex(bindec($bin_str));//返回unicode十六进制
$_sup = '';
for ($i = 0; $i < 4 - strlen($unicode); $i++)
{
$_sup .= '0';//补位高字节 0
}
$str = '\\u' . $_sup . $unicode; //加上 \u 返回
$resUnicode .= $str;
}
return $resUnicode;
}
}
下边是http请求的代码
public static function request_post_json($url, $data_string) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Content-Type: application/json; charset=utf-8",
"Content-Length: " . strlen($data_string))
);
ob_start();
curl_exec($ch);
$return_content = ob_get_contents();
ob_end_clean();
$return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return array($return_code, $return_content);
}
/**
* 模拟post进行url请求
* @param string $url
* @param string $param
*/
public static function request_post($url = '', $param = '') {
if (empty($url) || empty($param)) {
return false;
}
$postUrl = $url;
$curlPost = http_build_query($param);
// halt($curlPost);
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec($ch);//运行curl
curl_close($ch);
return $data;
}
/**
* get
* @param string $url 请求地址
*/
public static function GetHttp($url){
// 关闭句柄
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
$tmpInfo = curl_exec($curl); //返回api的json对象
if(curl_exec($curl) === false)
{
return 'Curl error: ' . curl_error($curl);
}
//关闭URL请求
curl_close($curl);
return $tmpInfo; //返回json对象
}
具体使用方法:
$zbt=new Zbt();
$good=$zbt->getGoods('商品名');
if (empty($good))$this->error('未检索到商品');
if (!$good['success'])$this->error('系统异常');
if (empty($good['data']))$this->error('未检索到商品');
$goodItemId=$good['data']['list'][0]['itemId'];
$balance=$zbt->getUserBalance();
if (empty($balance))$this->error('用户不存在');
if ($balance['data']['data']=='0E-8' || $balance['data']['data']==0)$this->error('余额不足');
$price=$zbt->getPrice($good['data']['list'][0]['marketHashName']);
if ($balance['data']['data']<$price['data'][0]['autoDeliverPrice'])$this->error('余额不足');
$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
do {
$num = $yCode[ intval( date( 'Y' ) ) - 2018 ].time() . rand(100, 999);
//生成订单号
$res = db('users_warehouse')->where(['auto_order_num' => $num])->find();
} while ($res );
$pay=$zbt->quick_buy($goodItemId,$num,$row->url);
if (!$pay['success'])$this->error($pay['errorMsg']);
$params['auto_order_num']=$num;
$params['zbt_outTradeNo']=$pay['data']['orderId'];