.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位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品. 在此基础上,腾讯位置服务 ...
随机推荐
- DNS 预读取功能 链接预取
https://developer.mozilla.org/zh-CN/docs/Controlling_DNS_prefetching DNS 请求需要的带宽非常小,但是延迟却有点高,这一点在手机网 ...
- MySQL not equal to operator <> && !=
MySQL :: MySQL 5.7 Reference Manual :: 12.3.2 Comparison Functions and Operatorshttps://dev.mysql.co ...
- MySQL there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause同时创建多个更新当前时间戳字段 解决方法
问题重现 在写这篇文章之前,明确我的MySQL版本,MariaDB 或者你使用 MySQL 8 也会出现如下问题 MySQL 版本 现在有这样的需求,一张表中有一个字段created_at记录创建该条 ...
- OWASP ZAP使用教程
一.安装 Windows下载下来的是exe的,双击就可以了! Linuxg下载下来的不是.sh就是tar.gz,这个就更加简单了. 唯一需要注意的是: Windows和Linux版本需要运行Java ...
- VPB编译日志1
1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Release x64 ------1> Checking Build System1> CMake ...
- Spring cloud微服务安全实战-5-4请求转发及退出
步骤1234已经完成 下面处理 5678这几步.zuul在转发的时候 把请求头加上 获取订单信息 加一个按钮,登陆成功后,去拿订单的信息. 展示获取到的订单信息 ts代码 ts内定义order对象 定 ...
- sklearn使用高斯核SVM显示支持向量
import graphviz import mglearn from mpl_toolkits.mplot3d import Axes3D from sklearn.datasets import ...
- PAT 甲级 1147 Heaps (30 分) (层序遍历,如何建树,后序输出,还有更简单的方法~)
1147 Heaps (30 分) In computer science, a heap is a specialized tree-based data structure that sati ...
- snmp oid 和厂商对应关系
<node oid="default" name="Unknown" type="workstation"/><node ...
- POJ 2584 T-Shirt Gumbo 二分图的多重匹配
题目链接:http://poj.org/problem?id=2584 题目大意:有SMLXT五种T恤型号,有N个人,每个人有一个可选的型号区间,你现在要发给N个人每人一条他可以选择的型号的T恤,问能 ...