小程序代码:https://cloud.tencent.com/document/product/266/18177
签名代码:https://cloud.tencent.com/document/product/266/10638
js代码如下
getSignature: function (callback) {
wx.request({
//url: 'https://xzb.qcloud.com/get_vod_sign',
//url: "http://192.168.2.29:5000/api/ShortVideo/GetUploadSignature",
url:"http://localhost:5000/weatherforecast/GetUploadSignature",
method: 'POST',
/*data: {
Action: 'GetVodSignatureV2'
},*/
dataType: 'json',
success: function (res) {
console.log(res);
/*if (res.data && res.data.data.signature) {
console.log("callback:"+res.data.data.signature)
callback(res.data.data.signature);
} else {
return '获取签名失败';
}*/
if (res.data && res.data.signature) {
console.log("callback:" + res.data.signature)
callback(res.data.signature);
} else {
return '获取签名失败';
}
}
});
},
服务端签名类
using System;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// 云点播签名
///
/// 腾讯云点播(Video on Demand,VOD)基于腾讯多年技术积累与基础设施建设,
/// 为有音视频应用相关需求的客户提供包括音视频存储管理、音视频转码处理、音视频加速播放和音视频通信服务的一站式解决方案。
///
/// </summary>
public class VODSignature
{
public string m_strSecId;
public string m_strSecKey;
public int m_iRandom;
public long m_qwNowTime;
public int m_iSignValidDuration;
public static long GetIntTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1);
return Convert.ToInt64(ts.TotalSeconds);
}
private byte[] hash_hmac_byte(string signatureString, string secretKey)
{
var enc = Encoding.UTF8; HMACSHA1 hmac = new HMACSHA1(enc.GetBytes(secretKey));
hmac.Initialize();
byte[] buffer = enc.GetBytes(signatureString);
return hmac.ComputeHash(buffer);
}
public string GetUploadSignature()
{
string strContent = "";
strContent += ("secretId=" + Uri.EscapeDataString((m_strSecId)));
strContent += ("¤tTimeStamp=" + m_qwNowTime);
strContent += ("&expireTime=" + (m_qwNowTime + m_iSignValidDuration));
strContent += ("&random=" + m_iRandom);
//strContent += ("&procedure=XIAOZHIBO-DEFAULT");
byte[] bytesSign = hash_hmac_byte(strContent, m_strSecKey);
byte[] byteContent = System.Text.Encoding.UTF8.GetBytes(strContent);
byte[] nCon = new byte[bytesSign.Length + byteContent.Length];
bytesSign.CopyTo(nCon, 0);
byteContent.CopyTo(nCon, bytesSign.Length);
return Convert.ToBase64String(nCon);
}
}
提供服务的Controller
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Security.Cryptography;
using System.Text;
namespace WebApplication2.Controllers
{
[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController : ControllerBase
{
[HttpPost]
[HttpGet]
public object GetUploadSignature()
{
VODSignature sign = new VODSignature();
sign.m_strSecId = "id";// configuration["TXY_SDKAppID"];
sign.m_strSecKey = "key";// configuration["TXY_SecretKey"];
sign.m_qwNowTime = VODSignature.GetIntTimeStamp();
sign.m_iRandom = new Random().Next(0, 1000000);
sign.m_iSignValidDuration = 3600 * 24 * 2;
return new { signature = sign.GetUploadSignature() };
}
}
}
error 错误
{"data":{"code":10004,"message":"ugc upload | invalid signature"},"header":{"Server":"openresty","Date":"Wed, 15 Apr 2020 12:53:26 GMT","Content-Type":"text/plain; charset=utf-8","Content-Length":"57","Connection":"close","Access-Control-Allow-Headers":"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization","Access-Control-Allow-Methods":"POST, GET, OPTIONS, PUT, DELETE","Access-Control-Allow-Origin":"*"},"statusCode":200,"cookies":[],"errMsg":"request:ok"}
换成python的demo在试试
还是一样的效果 ,失败。
在用C#在服务器上上传下试试是可以成功的。
于是再次确认id和key,正确。
我用了一个我自己的key 是可以上传的,but 考录到公司人员变动,就在腾讯云上弄了个Api的用户
分配了一个 云点播的 VODFullAccess权限
小程序中就可以正常了。