zbt (Steam游戏道具)自动发货

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'];
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦夏夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值