php 7.3 接入小程式直播 - 建立直播間
阿新 • • 發佈:2021-11-24
小程式直播間建立踩的坑:
直播間建立需要上傳背景圖、分享圖以及封面圖;圖片需上傳至微信圖片素材,在建立時傳入圖片素材的 mediaID ,這個是直播間建立最大的坑:
根據文件:
你會發現引導連結將你引導到公眾號 -> 素材管理的開發文件去了。天殺的公眾號文件啊啊啊啊。我要接入的是小程式直播。。。。。。然後你會發現他是素材管理,上傳之後會返回mediaID。並且公眾號和小程式是關聯的,當你聯想到小程式直播素材需要上傳到對應關聯的公眾號素材的時候恭喜你入坑了。整個流程在建立之前都是沒有問題的,介面返回一切正常。但是在最後一步建立的時候會無腦報錯errcode:
300031直播間封面圖不合規。恭喜你,這個錯誤除了文件有這樣的說明外只能百度到圖片尺寸或大小不符合小程式直播的要求。然後不會發現同樣的圖在後臺可以建立成功,但在你的介面就是永遠無法成功。
在幾乎已經放棄的邊緣。一篇帖子貌似是指明瞭一條路:
下邊有一條回覆是這樣的:
文件誤導了大家。小程式直播需要的素材怎麼會讓大家上傳到公眾號呢。但是小程式並沒有素材管理的模組,想到這就一陣頭大。上傳到公眾號又不行,小程式又沒有。然後想想微信的套路,會不會把素材放到的其他的功能模組下做了一個無關緊要的說明,想到這試著搜尋了下小程式文件:
客服訊息時可以使用素材的,這會不會有說明呢。
竟然真的在這,天殺的文件,隱藏的這麼深。不管怎麼樣找到了先試試:
首先獲取access_token:
rivate $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";
public function __construct($appId,$secret)
{
$this -> url = $this -> url .= "appid=" . $appId . "&secret=" . $secret;
}
/**
* 獲取小程式Token
* @return mixed
*/
public function checkAccessToken(){
if(Cache::has("program_access_token")){
return Cache::get("program_access_token");
}else{
$result = requestGetData($this -> url);
if(isset($result['access_token'])){
Cache::set("program_access_token",$result['access_token'],($result['expires_in']-60));
return $result['access_token'];
}
}
}
大概意思的話就是例項化這個類,傳入APPID以及secret,然後呼叫 checkAccessToken 方法獲取 access_token 。以下是呼叫方法:
static private $mediaUrl = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=";
public function __construct($appID,$secret)
{
$token = new ProgramAccessToken($appID,$secret);
$accessToken = $token -> checkAccessToken();
self::$mediaUrl = self::$mediaUrl.$accessToken."&type=image";
}
public function uploadMedia($data){
// $fileData = ['media' => "@".$imgDir];
$res = http_post(self::$mediaUrl,$data);
return $res;
}
mediaUrl 是上傳素材的介面,在這個類裡面建立構造方法例項化獲取 access_token 的類並傳入引數,獲取到token後拼接至上傳素材的連結上,呼叫 uploadMedia 方法把圖片上傳至小程式素材庫。
$data 為上傳的圖片陣列,PHP低版本的@拼接在7.3已經被啟用,所以在傳入之前需要 new \CURLFile($fileDir) $fileDir 是你要上傳的圖片的絕對路徑。
到這一切準備就緒,可以開始建立直播間了。
static private $createRoomUrl = "https://api.weixin.qq.com/wxaapi/broadcast/room/create?access_token=";
static private $editRoomUrl = "https://api.weixin.qq.com/wxaapi/broadcast/room/editroom?access_token=";
static private $accessToken;
static private $sendData;
public function __construct($appID,$secret)
{
$token = new ProgramAccessToken($appID,$secret);
self::$accessToken = $token -> checkAccessToken();
}
/**
* 建立直播間
* @param $data
* @return bool|string
*/
public function createRoom($data){
self::$createRoomUrl = self::$createRoomUrl.self::$accessToken;
self::$sendData = [
'name' => $data['live_name'],
'coverImg' => $data['live_cover_media_id'],
'startTime' => strtotime($data['live_date'].' '.$data['live_start_time']),
'endTime' => strtotime($data['live_date'].' '.$data['live_end_time']),
'anchorName' => $data['live_anchor_name'],
'anchorWechat' => $data['live_anchor_wechat'],
'shareImg' => $data['live_share_media_id'],
'feedsImg' => $data['live_feeds_media_id'],
'type' => $data['type'],
'closeLike' => $data['live_close_like'],
'closeGoods' => $data['live_close_goods'],
'closeComment' => $data['live_close_comment'],
'closeReplay' => $data['live_close_replay'],
'closeShare' => $data['live_close_share'],
'closeKf' => $data['live_close_kf'],
];
$res = http_post(self::$createRoomUrl,http_build_query(self::$sendData));
$res = json_decode($res,true);
$res['data'] = $data;
$res['sendData'] = self::$sendData;
return $res;
}
東西太多懶得打字了,最後拼接的data 以及 sendData 是為了排錯拼接的,可以省略。看不懂可以私信我