腾讯OCR身份证识别(C#)

637 阅读2分钟

这是一个使用C#编写的小demo

代码如下

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace OCRDemoByIDCard
{
    class Program
    {
        static void Main(string[] args)
        {
            //接口地址
            string postUrl = "http://recognition.image.myqcloud.com/ocr/idcard";
            //正面
            string FrontJson = IDCard(postUrl, "");
            PrintFront(FrontJson);
            //反面
            string BehindJson = IDCard(postUrl, "", 1);
            PrintBehind(BehindJson);

            Console.ReadKey();
        }
        #region 请求身份证识别
       /// <summary>
       /// 
       /// </summary>
       /// <param name="postUrl">请求地址</param>
       /// <param name="photo">身份证图片地址(外网可访问)</param>
       /// <param name="card_type">身份证照片类型(正反)</param>
       /// <returns></returns>
        static string IDCard(string postUrl, string photo, int card_type = 0)
        {
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", OCRApi.HmacSha1Sign());
            client.DefaultRequestHeaders.Host = OCRConfig.Host;

            string[] numbers = new string[] { photo };
            var task = client.PostAsJsonAsync(postUrl, new
            {
                appid = OCRConfig.appid,
                bucket = OCRConfig.bucket,
                card_type = card_type,
                url_list = numbers
            });
            task.Wait();
            var responseTask = task.Result.Content.ReadAsStringAsync();
            responseTask.Wait();
            var result = responseTask.Result;
            return result.ToString();
        }
        #endregion

        #region 打印正面数据
        public static void PrintFront(string Json)
        {

            JObject result_list = (JObject)JsonConvert.DeserializeObject(Json);
            JArray data = (JArray)JsonConvert.DeserializeObject(result_list["result_list"].ToString());
            JObject user = (JObject)JsonConvert.DeserializeObject(data[0]["data"].ToString());
            Console.WriteLine("------------身份证正面数据-----------");
            Console.WriteLine("姓名:" + user["name"].ToString());
            Console.WriteLine("性别:" + user["sex"].ToString());
            Console.WriteLine("名族:" + user["nation"].ToString());
            Console.WriteLine("出生日期:" + user["birth"].ToString());
            Console.WriteLine("住址:" + user["address"].ToString());
            Console.WriteLine("身份证:" + user["id"].ToString());

        }
        #endregion

        #region 打印反面数据
        public static void PrintBehind(string Json)
        {

            JObject result_list = (JObject)JsonConvert.DeserializeObject(Json);
            JArray data = (JArray)JsonConvert.DeserializeObject(result_list["result_list"].ToString());
            JObject user = (JObject)JsonConvert.DeserializeObject(data[0]["data"].ToString());
            Console.WriteLine("------------身份证反面数据-----------");
            Console.WriteLine("签发机关:" + user["authority"].ToString());
            Console.WriteLine("有限期限:" + user["valid_date"].ToString());

        }
        #endregion

    }
}

OCRApi

using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text; 

namespace OCRDemoByIDCard
{
    public class OCRApi
    {
        /// <summary>
        /// 生成随机串,随机串包含字母或数字
        /// </summary>
        /// <returns> @return 随机串</returns>
        public static string GenerateNonceStr()
        {
            return DateTime.Now.ToString("yyMMddHHmm");
        }
        /// <summary>
        /// 生成当前时间戳
        /// 标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
        /// </summary>
        /// <returns>@return 时间戳</returns>
        public static long GenerateCurrentTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds);
        }
        /// <summary>
        /// 获取要加密的字符串
        /// </summary>
        /// <returns></returns>
        private static string GetOrignal()
        {
            var current = GenerateCurrentTimeStamp();
            var expired = GenerateCurrentTimeStamp() + 2592000;
            return $"a={OCRConfig.appid}&b={OCRConfig.bucket}&k={OCRConfig.secret_id}&e={expired}&t={current}&r={GenerateNonceStr()}&u=0&f=";
        }

        /// <summary>
        /// HMAC-SHA1加密算法
        /// </summary>
        /// <param name="secret">密钥</param>
        /// <returns></returns>
        public static string HmacSha1Sign()
        {
            var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(OCRConfig.secret_key));
            var dataBuffer = Encoding.UTF8.GetBytes(GetOrignal());
            var hashBytes = hmacsha1.ComputeHash(dataBuffer);
            List<byte> bytes = new List<byte>();
            bytes.AddRange(hashBytes);
            bytes.AddRange(dataBuffer);
            return Convert.ToBase64String(bytes.ToArray());
        }
    }
}

OCRConfig

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OCRDemoByIDCard
{
    //根据腾讯所给配置修改下方数据
    public class OCRConfig
    {
        public static string secret_id = "";

        public static string secret_key = "";

        public static string appid = "";

        public static string bucket = "";

        public static string Host = "recognition.image.myqcloud.com";
    }
}