php对接抖音验券,二维码验券

php 复制代码
  /***
     * 验券准备接口
     */
    public function prepareCertificate()
    {
        $code = $this->request->request('code', '');
        if ($code == '') {
            $resulturl = $this->request->request('resulturl', '');
            if ($resulturl == '') {
                $this->error('请输入券码');
            }
            //访问该链接
            $res = doGet($resulturl, '');
            $parsed_url = parse_url($res);
            parse_str($parsed_url['query'], $query_params);
            $object_id = $query_params['amp;object_id'];
            //循环查是哪个平台
            //  dump($object_id);
            $res = Douyin::prepareCertificate($object_id, '');//抖音平台
        } else {
            //循环查是哪个平台
            $res = Douyin::prepareCertificate('', $code);//抖音平台
        }
        // dump($res);exit;

        if (!$res || $res['extra']['error_code'] != 0) {
            //抖音没有查出来
            $this->error('该券码无效,请上传真实券码/刷新二维码重试');//, $res['extra']['description']
        } else {
            if (!isset($res['data']['certificates'][0])) {
                $this->error('该券码无效,请上传真实券码/刷新二维码重试');
            }
            $platform = 3;
            $sku_id = $res['data']['certificates'][0]['sku']['sku_id'];
            // dump($sku_id);exit;
            //看询券码属于哪个商品
            $goodsitem = Goodsitem::where(['douyin' => $sku_id])->find();
            // dump($goodsitem);exit;
            $parties = [
                'start_time' => $res['data']['certificates'][0]['start_time'],
                'expire_time' => $res['data']['certificates'][0]['expire_time'],
                'encrypted_code' => $res['data']['certificates'][0]['encrypted_code'],
                'sku_id' => $sku_id,
                'platform' => $platform,
                'verify_token' => $res['data']['verify_token'],
            ];
            if (time() < $parties['start_time']) {
                $this->error(__('券码还未生效,生效时间:' . date('Y-m-d H:i:s', $parties['start_time'])));
            }
            if (time() > $parties['expire_time']) {
                $this->error(__('券码已失效,失效时间:' . date('Y-m-d H:i:s', $parties['expire_time'])));
            }
        }
        if (!$goodsitem) {
            $this->error('商品不存在,请重输入兑换');
        }
        $goods = Goods::where('id', $goodsitem['goods_id'])->find();
        if (!$goods) {
            $this->error('商品不存在,请重输入兑换');
        }
        $goods['goodsitem'] = $goodsitem;
        $goods['images'] = explode(',', $goods['images']);
        $goods['platform'] = $platform;
        $goods['parties'] = $parties;
        $this->success('成功', $goods);
    }

  

    //真实核销
    public function create_order()
    {
        //限制点击频率
        //设置缓存
        $cache_key = 'create_order_' . $this->auth->id;
        $cache_time = 5;
        if (cache($cache_key)) {
            $this->error('请勿重复点击');
        } else {
            cache($cache_key, 1, $cache_time);
        }
        $param = $this->request->param();

        $platform = $this->request->param('platform', 0);
        if ($platform == 0) {
            $this->error(__('请选择平台'));
        }
        
        //先验票
        if ($platform == 3) {
            //抖音核销
            $verifyToken = $this->request->request('verify_token', '');
            if (empty($verifyToken) || $verifyToken == '') {
                $this->error(__('请选择核销券'));
            }
            $encryptedCodes = $this->request->request('encryptedCodes', '');
            if (empty($encryptedCodes) || $encryptedCodes == '') {
                $this->error(__('请选择核销券'));
            }
            //先查询是否已经核验
            $checkVerify = Douyin::checkVerify($encryptedCodes);
            // dump($checkVerify);exit;
            if (!$checkVerify || $checkVerify['extra']['error_code'] != 0) {
                $this->error($checkVerify['extra']['description']);
            } else {
                // $this->success('成功', $checkVerify);
                $status = $checkVerify['data']['certificate']['status'];
                // dump($status);exit;
                if ($status != 1) {
                    $this->error(__('该券已核销'));
                }
            }
        }
        if ($platform == 3) {
            $encryptedCodes = [$encryptedCodes];
            $res = Douyin::verifyCoupon($verifyToken, $encryptedCodes);
            // dump($res);exit;
            if (!$res || $res['extra']['error_code'] != 0) {
                throw new Exception("兑换失败,请核对后重试");
            }
        }
          
    }
    

把这个文件放在extend/fast/Douyin.php

php 复制代码
<?php

namespace fast;

use think\Request;
use think\Config;
use fast\Random;

class Douyin
{
    /**
     * appid
     */
    const APPID = 'taP1**********0Ma';
    /**
     * secret
     */
    const SECRET = 'vd8nzSCG4A**********b32U9MYN00vj';
    /**
     * 获取授权链接
     */
    const AUTH_URL = 'https://api.jianjianyouzhi.com/tuangouuserservice/mt/authUrl';
    /**
     * 验券校验
     */
    const PREPARE = 'https://api.jianjianyouzhi.com/tuangouuserservice/mt/prepare';
    /**
     * 验券
     */
    const VERIFY = 'https://api.jianjianyouzhi.com/tuangouuserservice/mt/consume';
    /**
     * 查询已验券信息
     */
    const CHECKVERIFY = 'https://api.jianjianyouzhi.com/tuangouuserservice/mt/fetchconsumed';

    public function __construct()
    {
//        $this->Appid = Config::get('douyin.appid');
//        $this->AppSecret = Config::get('douyin.appsecret');
//        $this->pro_id = Config::get('douyin.pro_id');
        $this->Appid = 'awj**********x9ia';// 抖音开放平台应用的AppID
        $this->AppSecret = 'ac6e5b3a**********cea2d100adb474';// 抖音开放平台应用的AppSecret
        $this->pro_id = '7628113**********732815';// 抖音门店ID
    }


    /***
     * 验券准备接口
     */
    public static function prepareCertificate($encrypted_data, $code = null)
    {
        $access_token = self::getClientToken();
        $poi_id = '75430**********273';
        $url = 'https://open.douyin.com/goodlife/v1/fulfilment/certificate/prepare/?poi_id=' . $poi_id . '&code=' . $code . '&encrypted_data=' . $encrypted_data;
        $back = doGet($url, $access_token);
        $back = json_decode($back, true);
        return $back;
    }

    /***
     * 实际验券接口
     */
    public static function verifyCoupon($verifyToken, $encryptedCodes)
    {
        $client_token = self::getClientToken();
        $poiId = '754304**********07273';
        $url = 'https://open.douyin.com/goodlife/v1/fulfilment/certificate/verify/';
        $data = [
            'verify_token' => $verifyToken,
            'poi_id' => $poiId,
            'encrypted_codes' => $encryptedCodes
        ];

        $res = doPost($url, $data, $client_token);
        $response = json_decode($res, true);
        return $response;
    }

    /***
     * 查询券状态
     */
    public static function checkVerify($encrypted_data)
    {
        $access_token = self::getClientToken();
        // dump($access_token);
        $poi_id = '754304**********07273';
        $encrypted_data = urlencode($encrypted_data);
        $url = 'https://open.douyin.com/goodlife/v1/fulfilment/certificate/get/?encrypted_code=' . $encrypted_data;
        // dump($url);exit;
        $back = doGet($url, $access_token);
        $back = json_decode($back, true);
        return $back;
    }

    /***
     * 获取access_token
     */
    public static function getClientToken()
    {
        $url = 'https://open.douyin.com/oauth/client_token/';
        $Appid = 'awj7pr17t102x9ia';// 抖音开放平台应用的AppID
        $AppSecret = 'ac6e5b3**********d100adb474';// 抖音开放平台应用的AppSecret
        $pro_id = '7543048**********07273';// 抖音门店ID
        $param = [
            'client_key' => $Appid,
            'client_secret' => $AppSecret,
            'grant_type' => 'client_credential'
        ];
        $res = \fast\Http::post($url, $param);
        $back = json_decode($res, true);
//        dump($back);
//        exit;
        if ($back['data']['error_code'] == 0) {
            return $back['data']['access_token'];
        }
        return false;
    }

    /***
     *通用请求方法
     */
    public static function douyinRequest($url, $data = [], $client_token = '', $is_post = 1)
    {
        $headers = [
            'Content-Type: application/json',
            'access-token: ' . $client_token
        ];

        $curl = curl_init();
        if ($is_post) {
            curl_setopt_array($curl, [
                CURLOPT_URL => $url,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => '',
                CURLOPT_CUSTOMREQUEST => 'POST',
                CURLOPT_POSTFIELDS => json_encode($data),
                CURLOPT_HTTPHEADER => $headers,
            ]);
        } else {
            $data = http_build_query($data);
            curl_setopt_array($curl, [
                CURLOPT_URL => "$url?$data",
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_HTTPHEADER => $headers,
            ]);
        }
        dump($curl);
        exit;
        $response = curl_exec($curl);

        curl_close($curl);
        return json_decode($response, true);
    }


}
php 复制代码
function doGet($url, $access_token)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'access-token: ' . $access_token,
        'content-type: application/json',
    ]);

    $response = curl_exec($ch);

    curl_close($ch);

    return $response;

}

function doPost($url, $data, $access_token)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'access-token: ' . $access_token,
        'content-type: application/json',
    ]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

    $response = curl_exec($ch);

    curl_close($ch);
    return $response;
}
相关推荐
周小码6 小时前
10分钟搭建管理后台:laravel-admin实战入门
php·laravel
dog2506 小时前
从重尾到截断流量模型的演进
开发语言·php
Johnstons9 小时前
游戏网络测试怎么做?从延迟到丢包,一套完整的游戏弱网测试方案
网络·游戏·php
楷哥爱开发13 小时前
降低网络爬虫成本:基础设施优化指南
服务器·开发语言·php
两个人的幸福14 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo16 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack16 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820717 天前
PHP 扩展——从入门到理解
php
鹏仔先生17 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下17 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php