需求:用户扫码授权后自动转发视频到抖音,转发完成后获得一张优惠券,视频要随机生成(用阿里云视频生产接口提前后台生成好),因为同一个视频会被抖音降权
我用的yii2框架,具体写法需要自己改一改
1:接入抖音jssdk,实现抖音端扫码授权,具体接入步骤参考抖音给的文档
根据抖音给的文档接入,比较值得注意的是签名验证,下边附上签名验证的php代码
后台生成签名
//验证签名
public function actionGetSignature(){
\Yii::$app->response->format = Response::FORMAT_JSON;
$url = 'https://open.douyin.com/oauth/client_token/';
$params = [
'client_key' => 网站应用的clientkey,
'client_secret' => 网站应用的secret,
'grant_type' => 'client_credential'
];
$client_data = \Yii::$app->HttpHelper->curlPost($url,$params);//封装好的curl方法 post上传
$client_data = json_decode($client_data,true);
$client_acess_token = $client_data['data']['access_token'];
$jsapi_ticket_url = "https://open.douyin.com/js/getticket?access_token=".$client_acess_token;
$ticket_info = \Yii::$app->HttpHelper->curlGet($jsapi_ticket_url);//curl get方式上传
$ticket_info = json_decode($ticket_info,true);
$ticket = $ticket_info['data']['ticket'];
$timestamp = "1597213176393";//时间串必须为string类型 否则签名不通过
$nonce_str = 'ABCD561';//随机一个字符串
$string = "jsapi_ticket=$ticket&nonce_str=$nonce_str×tamp=$timestamp&url=要跳转的授权页面";
$signature = md5($string);//签名MD5加密
$resData['signature'] = $signature;
$resData['timestamp'] = (string)$timestamp;
$resData['nonce_str'] = $nonce_str;
return $resData;
}
页面验证签名
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>授权</title>
</head>
<script type="text/javascript" src="/js/jquery.min.js"></script>
<script type="text/javascript" src=" https://unpkg.byted-static.com/bridge/douyin_open/1.0.7/lib/douyin_open.umd.js"></script>
<body>
</body>
</html>
<script>
const url = location.href;
$(function(){
$.ajax({
type: "GET",
url: 后台生成签名的地址,
dataType: "json",
success: function(data){
const sdk = window.DouyinOpenJSBridge;
sdk.config({
params: {
client_key:自己的clientkey, // clientKey在你的网页应用申请通过后得到
signature:data.signature,// 服务端计算的签名,该签名被抖音开放平台验证通过后方可调用jsb方法
timestamp:data.timestamp, // 时间戳
nonce_str:data.nonce_str,
url:和后台生成签名时用的url必须一模一样 建议直接写死,ios端用location。href获取时会出问题, // 为应用申请的 JSB 安全域名下的链接,需要携带协议
}
});
sdk.ready(() => {
sdk.jumpOpenAuth({
params: {
client_key: 自己的clientkey, // clientKey在你的网页应用申请通过后得到
state: '', // 自定义状态,详见下方说明
scope: 'user_info,video.create', // 需要授权的scope列表, 多个用英文逗号分隔
response_type: 'code' // 默认填‘code’,详见下方说明
},
success: ({ ticket }) => {
此处的ticket就相当于授权时的code,拿着ticket去后台走openapi里的授权流程就可以了
},
error: res => {}
});
});
sdk.error(res => {
// Config error回调
alert(Object.values(res));
});
}
});
});
</script>
2:授权成功后,调用openapi的视频/video/upload/接口获取video_id
//上传视频 获取videoid
public function getVideoId($open_id,$access_token,$url){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://open.douyin.com/video/upload?open_id=' . $open_id. '&access_token=' . $access_token,
CURLOPT_RETURNTRANSFER => true,
//CURLOPT_ENCODING => '',
//CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
//CURLOPT_FOLLOWLOCATION => true,
//CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
//CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array('video' => new \CURLFILE($url)),
));
$response = curl_exec($curl);
curl_close($curl);
$response = json_decode($response, true);
if($response['data']['error_code'] == 0){
return $response['data']['video']['video_id'];
}
return $null;
}
3:调用/video/create/接口,拿着video_id上传视频 具体的优惠券领取代码比较简单,我这边搭demo的时候略过了
//上传video
public function actionCreateVideo(){
\Yii::$app->response->format = Response::FORMAT_JSON;
$open_id = $_POST['openid'];
$access_token = 授权时存起来的accesstoken;
$url = $_POST['url'];//这个url为要转发视频的url
$video_id = $this->getVideoId($open_id, $access_token, $url);
if(!$video_id){
return ['code' => 1,'msg' => '转发失败'];
}
$url = "https://open.douyin.com/video/create?open_id=$open_id&access_token=$access_token";
$params = [
'video_id' => $video_id,
'text' => '好好吃饭鸭'
];
$video_info = \Yii::$app->HttpHelper->curlPost($url,$params,true);
$video_info = json_decode($video_info,true);
if(isset($video_info['data']['item_id'])){
return ['code' => 1,'msg' => '卡券领取成功'];
}
return ['code' => 0,'msg' => '卡券领取失败'];
}
版权声明:本文为test_appletwo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。