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;
}
相关推荐
我是唐青枫5 小时前
Php Doctrine ORM 实战详解:从实体映射到查询、关联与事务
php
juesdo6 小时前
array_search()函数的用法
web安全·php
ch3nyuyu10 小时前
socket套接字
开发语言·php
leagsoft_100311 小时前
零信任选型五刀法——零信任怎么选?五个问题,五条红线
开发语言·php
yyuuuzz12 小时前
云服务器软件部署的几个常见问题
运维·服务器·开发语言·网络·云计算·php·apache
juesdo13 小时前
青岑CTF web入门 EZCMD系列
web安全·网络安全·php
RisunJan13 小时前
Linux命令-php(PHP语言的命令行接口)
linux·php
艾莉丝努力练剑14 小时前
【Linux网络】NAT、内网穿透、内网打洞
linux·运维·服务器·网络·计算机网络·udp·php
dog2501 天前
网络长尾延时的重尾本质
开发语言·网络·php