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;
}