.NET调用腾讯云API实例
最近项目有用到腾讯云的身份识别接口,话不多说,直接上代码:
private void IDCardVerification(HttpContext context)
{ string imgStr = context.Request["ImageBase64"];
if (!string.IsNullOrEmpty(imgStr))
{
try
{
//请求地址
string settingUrl = ConfigurationManager.AppSettings.Get("IDCardVerifUrl");
//应用ID
string secretId = ConfigurationManager.AppSettings.Get("TcCloudSecretId");
//应用key
string secretKey = ConfigurationManager.AppSettings.Get("TcCloudSecretKey");
//时间戳
string timesTamp = GetTimeStamp();
//Nonce
var nonce = new Random().Next(, );
//拼接参数
string paramsStr = string.Format(@"Action=IDCardOCR&CardSide=FRONT&ImageBase64={0}&Nonce={1}&Region=ap-guangzhou&SecretId={2}&SignatureMethod=HmacSHA1&Timestamp={3}&Version=2018-11-19",
imgStr, nonce, secretId, timesTamp);
//生成签名参数
string requestText = "POST" + settingUrl.Replace("https://", "") + "?" + paramsStr;
//获得请求签名
string signText = GetHmacSha1Sign(secretKey, requestText);
//这里一定要进行URL编码,不然调用API会报错
signText = HttpUtility.UrlEncode(signText, Encoding.UTF8);
imgStr = HttpUtility.UrlEncode(imgStr, Encoding.UTF8);
paramsStr = string.Format(@"Action=IDCardOCR&CardSide=FRONT&ImageBase64={0}&Nonce={1}&Region=ap-guangzhou&SecretId={2}&Signature={3}&SignatureMethod=HmacSHA1&Timestamp={4}&Version=2018-11-19",
imgStr, nonce, secretId, signText, timesTamp);
//请求腾讯API,返回身份证信息
string resultStr = Globals.SendRequest(settingUrl, paramsStr);
var idCard = new JavaScriptSerializer().Deserialize<IDCardVerif>(resultStr);
var iDCardInfo = idCard.Response;
if (iDCardInfo.Error != null)
{
context.Response.Write("{\"Status\":\"fail\",\"errorMsg\":\"身份证识别出错: " + iDCardInfo.Error.Message + " \"}");
}
else
{
var result = new { Status = "success", data = new { iDCardInfo.name, iDCardInfo.Sex, iDCardInfo.Nation, iDCardInfo.IdNum, iDCardInfo.Address, iDCardInfo.Birth } };
context.Response.Write(new JavaScriptSerializer().Serialize(result));
}
}
catch (Exception ex)
{
context.Response.Write("{\"Status\":\"fail\",\"errorMsg\":\"请求接口出错 \"}");
}
}
else
{
context.Response.Write("{\"Status\":\"fail\",\"errorMsg\":\"请选择上传的图片!\"}");
} } /// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(, , , , , , );
return Convert.ToInt64(ts.TotalSeconds).ToString();
} /// <summary>
/// HMAC-SHA1加密返回签名
/// </summary>
/// <param name="secret">密钥</param>
/// <param name="strOrgData">源文</param>
/// <returns></returns>
public static string GetHmacSha1Sign(string secret, string strOrgData)
{
var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(secret));
var dataBuffer = Encoding.UTF8.GetBytes(strOrgData);
var hashBytes = hmacsha1.ComputeHash(dataBuffer);
return Convert.ToBase64String(hashBytes);
} public static string SendRequest(string url, string completeUrl)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ProtocolVersion = HttpVersion.Version10;
request.Host = url.Replace("https://", "").Replace("/", "");
byte[] data = Encoding.UTF8.GetBytes(completeUrl);
request.ContentLength = data.Length;
Stream newStream = request.GetRequestStream();
newStream.Write(data, , data.Length);
newStream.Close();
HttpWebResponse response = null;
string content;
try
{
response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
content = reader.ReadToEnd();
}
catch (WebException e)
{
response = (HttpWebResponse)e.Response;
using (Stream errData = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(errData))
{
content = reader.ReadToEnd();
}
}
}
return content;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Hmeshop.Entities
{
public class IDCardVerif
{
public IDCardVerifInfo Response { get; set; } } public class IDCardVerifInfo
{
/// <summary>
/// 姓名
/// </summary>
public string name { get; set; } /// <summary>
/// 性别
/// </summary>
public string Sex { get; set; } /// <summary>
/// 民族
/// </summary>
public string Nation { get; set; } /// <summary>
/// 生日
/// </summary>
public string Birth { get; set; } /// <summary>
/// 地址
/// </summary>
public string Address { get; set; } /// <summary>
/// 身份证号
/// </summary>
public string IdNum { get; set; } /// <summary>
/// 发证机关
/// </summary>
public string Authority { get; set; } /// <summary>
/// 证件有效期
/// </summary>
public string ValidDate { get; set; } /// <summary>
/// 扩展信息
/// </summary>
public string AdvancedInfo { get; set; } /// <summary>
/// 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。
/// </summary>
public string RequestId { get; set; } /// <summary>
/// 错误信息,有则返回,没有则为空
/// </summary>
public ErrorInfo Error { get; set; } } public class ErrorInfo { public string Code { get; set; } public string Message { get; set; } } }
开始的时候,使用了HTTP的POST这种请求方式进行调用,但后面发现这种请求方式有Bug,一旦用户上传的图片尺寸太大(跟图片大小没关系,主要是尺寸),请求腾讯的API就会返回下面这个错误(PS:因为我这边使用的是OCR身份证识别API,如果不涉及图片文件的话,可以使用我上面的调用方式):
根据图上的错误信息可知,需要用到TC3-HMAC-SHA256这个签名算法,So,没办法,我们只能用腾讯的SDK来调用了,SDK直接在VS的Nuget里下载就好了,在GitHub下载源码进行编译引用也行
下面贴腾讯官方SDK调用代码:
private void IDCardVerificationBySDK(HttpContext context)
{
string imgStr = context.Request["ImageBase64"];
try
{
if (!string.IsNullOrEmpty(imgStr))
{
string res = string.Empty; Action<string> action = t =>
{
res = GetOCRMsg(imgStr);
};
IAsyncResult asyncResult = action.BeginInvoke("调用腾讯云身份证识别", null, null);
asyncResult.AsyncWaitHandle.WaitOne();
if (res.Contains("message"))
{
context.Response.Write("{\"Status\":\"fail\",\"errorMsg\":\"" + res.Split(new string[] { "message:" }, StringSplitOptions.None)[] + "\"}");
}
else
{
IDCardOCRResponse resp = JsonConvert.DeserializeObject<IDCardOCRResponse>(res);
var result = new { Status = "success", data = resp };
context.Response.Write(JsonConvert.SerializeObject(result));
}
}
else
{
context.Response.Write("{\"Status\":\"fail\",\"errorMsg\":\"请选择上传的图片!\"}");
}
}
catch(Exception ex)
{
Globals.Debuglog("调用接口出错:" + ex.StackTrace, "Tentent_IDCardVerif.txt");
} } private string GetOCRMsg(string imgStr)
{
try
{
Credential cred = new Credential
{
SecretId = ConfigurationManager.AppSettings.Get("TcCloudSecretId"),
SecretKey = ConfigurationManager.AppSettings.Get("TcCloudSecretKey")
}; ClientProfile clientProfile = new ClientProfile
{
SignMethod = ClientProfile.SIGN_TC3SHA256
};
HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("ocr.tencentcloudapi.com");
httpProfile.ReqMethod = "POST";
httpProfile.Timeout = ; // 请求连接超时时间,单位为秒(默认60秒)
clientProfile.HttpProfile = httpProfile;
OcrClient client = new OcrClient(cred, "ap-guangzhou", clientProfile);
IDCardOCRRequest req = new IDCardOCRRequest();
string strParams = "{\"ImageBase64\":\""+ imgStr + "\",\"CardSide\":\"FRONT\",\"ImageUrl\":\"\",\"Config\":\"\"}";
Globals.Debuglog("strParams: " + strParams, "Tentent_IDCardVerif.txt");
req = JsonConvert.DeserializeObject<IDCardOCRRequest>(strParams);
IDCardOCRResponse resp = client.IDCardOCR(req).
ConfigureAwait(false).GetAwaiter().GetResult();
return AbstractModel.ToJsonString(resp);
}
catch (Exception e)
{
Globals.Debuglog("请求接口出错:" + e.StackTrace, "Tentent_IDCardVerif.txt");
return e.Message.ToString();
}
}
这里要注意的是,一定要使用异步请求的方式进行调用! 不然直接调用的话,执行到:
ConfigureAwait(false).GetAwaiter().GetResult();
这一步会没有任何响应,程序陷入假死状态,博主就是在这里踩了坑,尝试了多次才发现这个问题,真是坑爹啊- -!
好了,就先说到这里了,这是本人在博客园的处女blog,希望给各位有需要的人一点帮助哈~
.NET调用腾讯云API实例的更多相关文章
- Python调用腾讯云API,实现人脸年龄变化
网上看到了一个教程,调用腾讯云的人脸识别api和修改年龄api来实现模拟人物不同年龄的面貌 但是大多数教程的代码都是想同的,估计是抄袭哪个人的关键是执行不了 刚好周杰伦马上要发新专辑了,小改一下,拿杰 ...
- c#调用腾讯云API的实例
//获取时间戳 .net framework /* DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1 ...
- 谈谈调用腾讯云【OCR-通用印刷体识别】Api踩的坑
一.写在前面 最近做项目需要用到识别图片中文字的功能,本来用的Tesseract这个写的,不过效果不是很理想. 随后上网搜了一下OCR接口,就准备使用腾讯云.百度的OCR接口试一下效果.不过这个腾讯云 ...
- 腾讯云API弹性公网IP踩坑
由于自己管理的云服务器数量比较多,时不时需要更换IP,在管理台上一下下点击,实在浪费时间,于是就想到了通过API调用的方式,将更换IP一系列动作,全部集成到Python代码里面,实现一行命令,完成IP ...
- C# 调用腾讯云接口获取视频基本信息
做项目需要上传视频,获取时长,上传教程很多,获取信息很少,官方只有一条请求地址. 找了好久,都没有说这个请求地址怎么用.最后发现需要调用腾讯云SDK 官方地址:https://github.com/Q ...
- python调用腾讯云短信接口
目录 python调用腾讯云短信接口 账号注册 python中封装腾讯云短信接口 python调用腾讯云短信接口 账号注册 去腾讯云官网注册一个腾讯云账号,通过实名认证 然后开通短信服务,创建短信应用 ...
- .NET Core HttpClient调用腾讯云对象存储Web API的"ERROR_CGI_PARAM_NO_SUCH_OP"问题
开门见山地说一下问题的原因:调用 web api 时请求头中多了双引号,请求体中少了双引号. 腾讯云提供的对象存储(COS)C# SDK 是基于 .NET Framework 用 WebRequest ...
- java 调用腾讯云短信api
依赖: <!--腾讯短信依赖--> <dependency> <groupId>com.github.qcloudsms</groupId> <a ...
- 微信小程序wx.getLocation()获取经纬度及JavaScript SDK调用腾讯地图API获取某一类地址
简介 腾讯位置服务为微信小程序提供了基础的标点能力.线和圆的绘制接口等地图组件和位置展示.地图选点等地图API位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品. 在此基础上,腾讯位置服务 ...
随机推荐
- Android通过ksoap2这个框架调用webservice大讲堂
昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有 ...
- Spring cloud微服务安全实战-4-7重构代码以适应真实环境
现在有了认证服务器,也配置了资源服务器.也根据OAuth协议,基于令牌认证的授权也跑通了.基本的概念也有了简单的理解. 往下深入之前,有几个点,还需要说一下 使用scopes来控制权限,scopes可 ...
- PhpStorm文本选择范围的纵向起始位置可选
ide一般都有这个功能. Alt+Shift+insert开启这个功能,使用效果如下,红色是默认选择的范围,绿色是我们想要的
- Swift4.0复习结构体
1.基本语法: /** 定义了一个结构体 */ struct Structure { /// 一个常量存储式实例属性, /// 并直接为它初始化 let constProperty = /// ...
- 【err】开启Persistence-M模式-Check failed: err == CUBLAS_STATUS_SUCCESS (1 vs. 0) : Create cublas handle failed
前言 安装好CUDA.CUDNN.NVIDIA driver之后,使用mxnet框架的时候出现该错误,本文记录该问题的解决方法. 环境 ubuntu 16.04 MxNet Cuda9.0 Nvidi ...
- axios ajax框架 请求配置
请求参数 { // `url` is the server URL that will be used for the request url: '/user', // `method` is the ...
- mysql日期加一个天数获得新的日期
原文地址:https://476057266-qq-com.iteye.com/blog/2047671 在当前的日期上加三天,天数随便改: SELECT date_add(CURRENT_DATE( ...
- Word中如何加载EndNote
在百度中搜索了很多解决方案,都不尽相同忙了一上午也没解决,然后搁浅,吃过午饭回来在安装目录下找到如下exe文件三四步点击搞定 所以,有时候问题出现了长时间没解决,可以换下环境出去溜达一圈说不定就茅塞顿 ...
- cudaGetDevice() failed. Status: cudaGetErrorString symbol not found.怎么解决
我是在使用anaconda的Spyder写一个数字识别的任务的时候遇到这个问题的,当时我以为是我的函数库有问题,然后安装了很多东西都没用,然后百度的答案都很模糊,在我尝试了一天一下午之后,找到了问题原 ...
- Swoole练习 安装
仅支持 Linux,FreeBSD,MacOS,3类操作系统 Linux 内核版本 2.3.32 以上 PHP-5.3.10 以上版本,包括PHP7 gcc4.4 以上版本或者clang cmake2 ...