.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位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品. 在此基础上,腾讯位置服务 ...
随机推荐
- Tensorflow 2 Cifar10离线数据集手动下载、离线安装、本地加载、快速读取
Tensorflow 2 Cifar10离线数据集手动下载.离线安装.本地加载.快速读取 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 查 ...
- Spring Boot CLI——centos7
Spring Boot是一个命令行工具,用于使用Spring进行快速原型搭建.它允许你运行Groovy脚本,这意味着你可以使用类Java的语法,并且没有那么多的模板代码. 所有版本下载地址这里下载的版 ...
- c++ 标准 字符串转换为时间 时间大小比较 判断有效期 简洁办法
c# php delphi java 等各种语言 对字符串转换为日期 然后与当前日期进行比较 是非常容易的 因为有现成的函数可用 标准 c++ 硬是找不到 合适的代码可用 于是 百度了很多 没百出个结 ...
- php 判断图片文件的真实类型
/** * * 检测文件的真实类型 * * @param string $srcPath 文件路径 * * @return string $realType 文件真实类型 * */ $imgurl = ...
- git pull There is no tracking information for the current branch.
在高版本的 git下面,也许会看见这样的提示: 解决方案:指定当前工作目录工作分支,跟远程的仓库,分支之间的链接关系. 比如我们设置master对应远程仓库的master分支 git branch - ...
- System.Runtime.Serialization.cs
ylbtech-System.Runtime.Serialization.cs 允许对象控制其自己的序列化和反序列化过程. 1.返回顶部 1. #region 程序集 mscorlib, Versio ...
- Scala里面的排序函数的使用
排序方法在实际的应用场景中非常常见,Scala里面有三种排序方法,分别是: sorted,sortBy ,sortWith 分别介绍下他们的功能: (1)sorted 对一个集合进行自然排序,通过传递 ...
- Oracle insert大量数据经验之谈
在很多时候,我们会需要对一个表进行插入大量的数据,并且希望在尽可能短的时间内完成该工作,这里,和大家分享下我平时在做大量数据insert的一些经验. 前提:在做insert数据之前,如果是非生产环境, ...
- Linux记录-史上最全的MySQL高性能优化实战总结(转载)
史上最全的MySQL高性能优化实战总结! 1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优 ...
- AWS 数据传输加速(八)
AWS CloudFront 概述 一个CDN服务,加快网页和其它下载全球分布式网络缓存服务器 CloudFront通过全球性的边缘站点将内容缓存到世界各地实现CDN 在更邻近的位置提供更低的延迟,更 ...