最近项目有用到腾讯云的身份识别接口,话不多说,直接上代码:

         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实例的更多相关文章

  1. Python调用腾讯云API,实现人脸年龄变化

    网上看到了一个教程,调用腾讯云的人脸识别api和修改年龄api来实现模拟人物不同年龄的面貌 但是大多数教程的代码都是想同的,估计是抄袭哪个人的关键是执行不了 刚好周杰伦马上要发新专辑了,小改一下,拿杰 ...

  2. c#调用腾讯云API的实例

    //获取时间戳 .net framework /* DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1 ...

  3. 谈谈调用腾讯云【OCR-通用印刷体识别】Api踩的坑

    一.写在前面 最近做项目需要用到识别图片中文字的功能,本来用的Tesseract这个写的,不过效果不是很理想. 随后上网搜了一下OCR接口,就准备使用腾讯云.百度的OCR接口试一下效果.不过这个腾讯云 ...

  4. 腾讯云API弹性公网IP踩坑

    由于自己管理的云服务器数量比较多,时不时需要更换IP,在管理台上一下下点击,实在浪费时间,于是就想到了通过API调用的方式,将更换IP一系列动作,全部集成到Python代码里面,实现一行命令,完成IP ...

  5. C# 调用腾讯云接口获取视频基本信息

    做项目需要上传视频,获取时长,上传教程很多,获取信息很少,官方只有一条请求地址. 找了好久,都没有说这个请求地址怎么用.最后发现需要调用腾讯云SDK 官方地址:https://github.com/Q ...

  6. python调用腾讯云短信接口

    目录 python调用腾讯云短信接口 账号注册 python中封装腾讯云短信接口 python调用腾讯云短信接口 账号注册 去腾讯云官网注册一个腾讯云账号,通过实名认证 然后开通短信服务,创建短信应用 ...

  7. .NET Core HttpClient调用腾讯云对象存储Web API的"ERROR_CGI_PARAM_NO_SUCH_OP"问题

    开门见山地说一下问题的原因:调用 web api 时请求头中多了双引号,请求体中少了双引号. 腾讯云提供的对象存储(COS)C# SDK 是基于 .NET Framework 用 WebRequest ...

  8. java 调用腾讯云短信api

    依赖: <!--腾讯短信依赖--> <dependency> <groupId>com.github.qcloudsms</groupId> <a ...

  9. 微信小程序wx.getLocation()获取经纬度及JavaScript SDK调用腾讯地图API获取某一类地址

    简介 腾讯位置服务为微信小程序提供了基础的标点能力.线和圆的绘制接口等地图组件和位置展示.地图选点等地图API位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品. 在此基础上,腾讯位置服务 ...

随机推荐

  1. Git 回滚 Master

    RenGuoQiang@PC-RENGUOQIANG MINGW64 /d/zgg/zgg-crm (master) $ git reset --hard 194e2cc8eec88743cc8978 ...

  2. Could not attach to pid : "xx"最近启动Xcode运行项目都会出现这个问题,再次启动或者多启动几次,就可以正常运行工程了。

    最近启动Xcode运行项目都会出现这个问题,再次启动或者多启动几次,就可以正常运行工程了. 普及一下:PID(进程控制符)英文全称为Process Identifier,它也属于电工电子类技术术语. ...

  3. [原][GIS]ARCGIS投影坐标系转换

    ARCGIS投影坐标转换步骤: 1.在ARCGIS中加入需要转换投影坐标的数据 2.打开“工具组”中的 “数据管理工具组”(Data Management Tools) 3.打开“数据管理工具组”中的 ...

  4. Flutter AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换

    Flutter AppBar 自定义顶部按钮图 标.颜色 属性 描述 leading 在标题前面显示的一个控件,在首页通常显示应用 的 logo;在其他界面通常显示为返回按钮 title 标题,通常显 ...

  5. typescript装饰器 方法装饰器 方法参数装饰器 装饰器的执行顺序

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  6. Python不带参数的类装饰器

    # -*- coding: utf-8 -*- # author:baoshan # 不带参数的类装饰器 # 类装饰器的实现,必须实现__call__和__init__两个内置函数. # __init ...

  7. android 应用签名的作用

    来源:https://www.jianshu.com/p/61206c96471a 1..应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名.这是由于只有以同一个证书签名, ...

  8. ES6深入浅出-4 迭代器与生成器-1.字面量增强

    今天的内容 字面量literal 写出来就是它的值 例如字符串hello.这就是自变量. 一个空对象,也是自变量 写出来就是代表它写出来的那个意思就是自变量. 与其相反的就是构造出来的.例如下面的ne ...

  9. 《楞严经四种清净明诲》 (转自学佛网:http://www.xuefo.net/nr/article56/559965.html)

    <楞严经四种清净明诲> 佛告阿难:“汝常闻我毗奈耶中,宣说修行三决定义.所谓摄心为戒,因戒生定,因定发慧,是则名为三无漏学. “阿难,云何摄心,我名为戒? “若诸世界六道众生其心不淫,则不 ...

  10. locate home of running java application

    1. find the target process id of your java app jps [-lm] in my case: [lenmom@Mi- bin]$ jps -l sun.to ...